第三十五篇:Quartz2D绘图--小黄人

2024-05-12 20:08

本文主要是介绍第三十五篇:Quartz2D绘图--小黄人,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在一个UIView上画图:


代码:

//
//  QJView.h
//  14-(2)画小黄人
//
//  Created by 瞿杰 on 15/10/27.
//  Copyright © 2015年 itcast. All rights reserved.
//#import <UIKit/UIKit.h>@interface QJView : UIView@end
//
//  QJView.m
//  14-(2)画小黄人
//
//  Created by 瞿杰 on 15/10/27.
//  Copyright © 2015年 itcast. All rights reserved.
//#import "QJView.h"#define Width 200.0
#define Hight 200.0@implementation QJView// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {// 画身体[self drawBody];// 画嘴[self drawMouth];// 画眼睛[self drawEyes];// 画库子[self drawJeans];// 画头发[self drawHair];// 画手
}/***  画身体*/
- (void)drawBody{// 1.获得图形上下文CGContextRef context = UIGraphicsGetCurrentContext();CGContextSaveGState(context);// 2.画图CGFloat radius = Width / 2.0 ;CGFloat upCircleX = self.frame.size.width / 2.0 ;CGFloat upCircleY = self.frame.size.height / 2.0 - Hight / 2;// 画上半圆弧CGContextAddArc(context, upCircleX, upCircleY, radius, 0, M_PI, 1);
//    CGContextAddArcToPoint(<#CGContextRef  _Nullable c#>, <#CGFloat x1#>, <#CGFloat y1#>, <#CGFloat x2#>, <#CGFloat y2#>, <#CGFloat radius#>)// 画线CGFloat midleX = upCircleX - radius;CGFloat midleY = upCircleY + Hight;CGContextAddLineToPoint(context, midleX, midleY);// 画下半圆弧CGFloat downCircleX = upCircleX ;CGFloat downCircleY = midleY;CGContextAddArc(context, downCircleX, downCircleY, radius,  M_PI, M_PI *2, 1);// 封闭CGContextClosePath(context);// 设置身体的颜色[[UIColor colorWithRed:254.0/255 green:202.0/255 blue:22.0/255 alpha:0.7] set];
//    CGContextSetRGBFillColor(<#CGContextRef  _Nullable c#>, <#CGFloat red#>, <#CGFloat green#>, <#CGFloat blue#>, <#CGFloat alpha#>)// 3.渲染CGContextFillPath(context);// 恢复图形上下文的状态CGContextRestoreGState(context);
}/***  画嘴*/
- (void)drawMouth{// 1.获得图形上下文CGContextRef context = UIGraphicsGetCurrentContext();CGContextSaveGState(context);// 2.画图// 嘴宽CGFloat mouthWidth = 90;// 嘴角与控制点在垂直方法上的闹中间隔CGFloat space = 30;CGFloat mouthCpX = self.frame.size.width / 2.0;CGFloat mouthCpY = self.frame.size.height / 2.0 ;CGFloat mouthLeftX = mouthCpX - mouthWidth / 2.0;CGFloat mouthLeftY = mouthCpY - space ;CGFloat mouthRightX = mouthCpX + mouthWidth / 2.0;CGFloat mouthRightY = mouthLeftY ;// 设置初始点CGContextMoveToPoint(context, mouthLeftX, mouthLeftY);// 画一个控制点的曲线CGContextAddQuadCurveToPoint(context, mouthCpX, mouthCpY, mouthRightX, mouthRightY);// 设置线宽CGContextSetLineWidth(context, 10);// 设置颜色[[UIColor colorWithRed:0.4 green:0.6 blue:0.7 alpha:0.7]set];// 3.渲染CGContextStrokePath(context);
//    CGContextFillPath(context);CGContextRestoreGState(context);
}/***  画左右两只眼睛*/
- (void)drawEyes{// 1.获得图形上下文CGContextRef context = UIGraphicsGetCurrentContext();// 2.存储图形上下文当前旧的状态CGContextSaveGState(context);// 3.画图// 3.1 画线CGFloat lineP1X = self.frame.size.width / 2.0  - Width / 2.0;CGFloat lineP1Y = self.frame.size.height / 2.0 - Hight / 2;CGFloat lineP2X = lineP1X + Width ;CGFloat lineP2Y = lineP1Y ;// 设置线宽CGContextSetLineWidth(context, 10);// 设置初始点CGContextMoveToPoint(context, lineP1X, lineP1Y);CGContextAddLineToPoint(context, lineP2X, lineP2Y);// 渲染CGContextStrokePath(context);// 3.2 画左眼[self drawEyeWithContext:context andInt:1];// 3.3 画右眼[self drawEyeWithContext:context andInt:-1];// 4.恢复图形上下文旧的状态CGContextRestoreGState(context);}
/***  画一只眼**  @param context 图形上下文*  @param flag    1:表示画左眼,-1:表示画右眼*/
- (void)drawEyeWithContext:(CGContextRef )context andInt:(int)flag{// 保存图形上下文旧的状态CGContextSaveGState(context);CGFloat eye1CircleX = self.frame.size.width / 2.0 - flag * Width / 4.0;CGFloat eye1CircleY = self.frame.size.height / 2.0 - Hight / 2;// 圆1CGFloat eye1Radius1 = Width / 2.0 * 0.35;CGContextAddArc(context, eye1CircleX, eye1CircleY, eye1Radius1, 0, M_PI * 2, 0);CGContextFillPath(context);// 圆2CGFloat eye1Radius2 = eye1Radius1 * 0.7;[[UIColor whiteColor]set];CGContextAddArc(context, eye1CircleX, eye1CircleY, eye1Radius2, 0, M_PI * 2, 0);CGContextFillPath(context);// 圆3CGFloat eye1Circle3X = eye1CircleX + flag * eye1Radius2 * 0.2 ;CGFloat eye1Circle3Y = eye1CircleY;CGFloat eye1Radius3 = eye1Radius2 * 0.6;[[UIColor blueColor]set];CGContextAddArc(context, eye1Circle3X, eye1Circle3Y, eye1Radius3, 0, M_PI * 2, 0);CGContextFillPath(context);// 圆4CGFloat eye1Radius4 = eye1Radius3 * 0.4;[[UIColor greenColor] set];CGContextAddArc(context, eye1Circle3X, eye1Circle3Y, eye1Radius4, 0, M_PI * 2, 0);CGContextFillPath(context);// 恢复图形上下文旧的状态CGContextRestoreGState(context);}/***  画库子*/
- (void)drawJeans{// 取图形上下文CGContextRef context = UIGraphicsGetCurrentContext();CGContextSaveGState(context);// 画库子int kSegment = 4; // 库子总片数 = kSegment +1CGFloat add = Width / (kSegment*2) ;CGFloat pointX = self.frame.size.width * 0.5 - Width * 0.5;CGFloat pointY = self.frame.size.height * 0.5 + Hight * 0.5;// 设置初始点CGContextMoveToPoint(context, pointX, pointY);// 画一个控制点的曲线CGContextAddQuadCurveToPoint(context, pointX - 20, pointY + Width * 0.25,  pointX, pointY + Width * 0.5);
//    CGContextAddLineToPoint(context, pointX, pointY + Width * 0.5);for (int i = 1; i <= kSegment * 2; i++) {CGFloat x , y;x = pointX + i * add;if (i&1)y = pointY + Width * 0.3;elsey = pointY + Width * 0.5;CGContextAddLineToPoint(context, x, y);}CGContextAddQuadCurveToPoint(context, pointX + Width +20, pointY + Width * 0.25, pointX + Width, pointY);
//    CGContextAddLineToPoint(context, pointX + Width, pointY );// 线条闭合CGContextClosePath(context);// 设置颜色[[UIColor colorWithRed:0 green:0 blue:0.7 alpha:0.7]set];//     设置线的转折点状态,对填充没有效果
//    CGContextSetLineJoin(context, kCGLineJoinRound);
//    CGContextSetLineWidth(context, 10);// 渲染CGContextFillPath(context);
//    CGContextStrokePath(context);// 从栈顶中取出状态恢复图形上下文状态CGContextRestoreGState(context);
}/***  画头发*/
- (void)drawHair{CGContextRef context = UIGraphicsGetCurrentContext();CGContextSaveGState(context);// 头发X坐标的间隔CGFloat space = 30;// 头发长度CGFloat hairLen = 50;CGFloat hair1X = self.frame.size.width * 0.5 - space;CGFloat hair1Y = self.frame.size.height * 0.5 - Hight * 0.5 - Width * 0.4 ;// 设置第1根毛的初始位置CGContextMoveToPoint(context, hair1X, hair1Y);// 画第1根毛曲线CGFloat cp1X = hair1X + space;CGFloat cp1Y = hair1Y - hairLen * 0.25 ;CGFloat cp2X = hair1X - space ;CGFloat cp2Y = hair1Y - hairLen * 0.75 ;CGContextAddCurveToPoint(context, cp1X, cp1Y, cp2X, cp2Y, hair1X, hair1Y - hairLen);CGFloat hair2X = self.frame.size.width * 0.5 ;CGFloat hair2Y = hair1Y;// 设置第2根毛的初始位置CGContextMoveToPoint(context, hair2X, hair2Y);// 画第2根毛曲线cp1X = hair2X + space;cp1Y = hair2Y - hairLen * 0.25 ;cp2X = hair2X - space ;cp2Y = hair2Y - hairLen * 0.75 ;CGContextAddCurveToPoint(context, cp1X, cp1Y, cp2X, cp2Y, hair2X, hair2Y - hairLen);CGFloat hair3X = self.frame.size.width * 0.5 + space;CGFloat hair3Y = hair2Y;// 设置第3根毛的初始位置CGContextMoveToPoint(context, hair3X, hair3Y);// 画第3根毛曲线cp1X = hair3X + space;cp1Y = hair3Y - hairLen * 0.25 ;cp2X = hair3X - space ;cp2Y = hair3Y - hairLen * 0.75 ;CGContextAddCurveToPoint(context, cp1X, cp1Y, cp2X, cp2Y, hair3X, hair3Y - hairLen);// 设置线宽CGContextSetLineWidth(context, 5);// 渲染CGContextStrokePath(context);// 恢复上下文CGContextRestoreGState(context);
}@end



这篇关于第三十五篇:Quartz2D绘图--小黄人的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983612

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

matplotlib绘图中插入图片

在使用matplotlib下的pyplot绘图时,有时处于各种原因,需要采用类似贴图的方式,插入外部的图片,例如添加自己的logo,或者其他的图形水印等。 一开始,查找到的资料都是使用imshow,但是这会有带来几个问题,一个是图形的原点发生了变化,另外一个问题就是图形比例也产生了变化,当然最大的问题是图形占据了整个绘图区域,完全喧宾夺主了,与我们设想的只在绘图区域中占据很小的一块不相符。 经

海龟绘图简易教程|Turtle for Python

turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟绘图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。 原文链接|海龟绘图简易教程 1. 基本

GraphPad Prism 10 for Mac/Win:高效统计分析与精美绘图的科学利器

GraphPad Prism 10 是一款专为科研工作者设计的强大统计分析与绘图软件,无论是Mac还是Windows用户,都能享受到其带来的便捷与高效。该软件广泛应用于生物医学研究、实验设计和数据分析领域,以其直观的操作界面、丰富的统计方法和多样化的图表样式,成为科学研究的得力助手。 数据处理与整理 GraphPad Prism 10 支持从多种数据源导入数据,如Excel、CSV文件及数据库

MATLAB绘图基础5:MATLAB数据导入

参考书:《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 5.MATLAB数据导入 5.1 从CSV文件读取数据 C S V {\rm CSV} CSV文件是一种纯文本文件,文件中的数据以逗号为分隔符进行字段分隔,每一行数据代表一条记录,每个字段在该行内通过逗号进行分隔; C S V {\rm CSV} CSV文件可以使用任何文本

WPF入门到跪下 第十三章 3D绘图 - 3D绘图基础

3D绘图基础 四大要点 WPF中的3D绘图涉及4个要点: 视口,用来驻留3D内容3D对象照亮部分或整个3D场景的光源摄像机,提供在3D场景中进行观察的视点 一、视口 要展示3D内容,首先需要一个容器来装载3D内容。在WPF中,这个容器就是Viewport3D(3D视口),它继承自FrameworkElement,因此可以像其他元素那样在XAML中使用。 Viewport3D与其他元素相

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 参考书目:《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是基础的数据运算用法,对于功课来说更加重要的内容是建模、绘图、观察数据趋势,接下来我会结合自己的使用经验,来为大家分享绘图、建模使用的小技巧。 二维图形绘制 在本章开

qtdraw-使用qt绘图之开源源码学习

1. 资源介绍 功能:使用qt在画板上绘制各种形状,并保持绘制内容到xml文件中。 项目源码:https://github.com/egan2015/qdraw 软件界面: 1.1 支持shape 6种 1.2 支持的功能 6种,分别是对绘制的图形进行撤销undo,重做redo,裁剪,复制,粘贴,删除功能。 2. 总体类图关系 总体分割3个独立块。 2.1

java AWT 绘图,实现弹球游戏,有实现keylistener,timer功能

Timer(int delay, ActionListener listener):每间隔delay毫秒,系统自动触发ActionListener监听器里的事件处理器(actionPerformed()方法)。 package javaAWT;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;imp