UIKit Graphics System--Drawing Shapes Using Bezier Paths学习笔记2

本文详细介绍了UIBezierPath的使用方法,包括如何创建路径、添加线段、弧线、曲线及常见图形,如何利用Core Graphics函数修改路径,以及如何判断点是否在路径内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bezier Path Basics
  UIBezierPath 类对象是对CGPathRef的封装。建立一个path包括下面几个步骤:
  1、创建path的对象
  2、确定起始点,通过函数moveToPoint:
  3、添加一些由线和弧构成的subpath
  4、设置UIBezierPath对象的属性,线段宽度,线段链接方式等
  path的点的坐标都是相对于(0,0)的,在绘画的时候,这些点都被会在了当前的context中,相对于当前context的坐标原点,这样移动path的时候,只需要将当前的context设置一个对应的CTM就可以了。冰柜还可以通过当前context的stack来保存和undo当前context的状态。
  Adding Lines and Polygons to Your Path
按照之前说过的创建path的方法,创建线的步骤可以通过下面的代码演示:
UIBezierPath *path = [UIBezierPath bezierPath];

[path moveToPoint:ccp(100,0)];

[path addLineToPoint:ccp(200,40)];
[path addLineToPoint:ccp(160,140)];
[path addLineToPoint:ccp(40,140)];
[path addLineToPoint:ccp(0,40)];
[path closePath];
通过closePath函数完成path的闭合操作。
Adding Arcs to Your Path
创建弧的函数为类函数:bezierPathWithArcCenter:radius:startAngle: endAngle: clockwise:
这里便不再需要通过调用moveToPoint设置startPoint了。
Adding Curves To Your Path
UIBezierPath提供了方法设置曲线(quad curve)和二次曲线(cubic curve)的路径。
UIKit <wbr>Graphics <wbr>System--Drawing <wbr>Shapes <wbr>Using <wbr>Bezier <wbr>Paths学习笔记2


quad curve:需要一个控制点,函数addCurveToPoint:controlPoint1:controlPoint2:
cubic curve:需要两个控制点,函数addQuadCurveToPoint:controlPoint:
Creating Oval and Rectangular Paths
椭圆形和举行都是常见的构成path的图形。在创建path的时候可以通过函数bezierPathWithRect:和 bezierPathWithOvalInRect :来返回一个path。
但是如果在一个已经有了的path上面添加一个椭圆形的时候最简单是通过这样的方法来实现,需要通过Core Graphics的方法来实现,这点可以参考 “Modifying the Path Using Core Graphics Functions.”
 而如果是往一个path中添加一个矩形的话,可以通过moveToPoint:addLineToPoint:closePath来实现。
Modifying the Path Using Core Graphics Functions
  前面已经说过UIBezierPath是对CGPath的封装,通过UIBezierPath的CGPathRef可以获得与path相关对应的CGPathRef的对象,尽管通过UIBezierPath的方法可以完成很多绘图操作,但是某些时候,直接采用Core Graphics框架的方法操作会更加的简单方便。
  1、绘图的时候可以单纯采用Core Graphics框架,或者混合使用两个框架的东西。但是值得说明的是,从某些方面来说单纯采用Core Graphics框架会更加简单些。这个过程可以通过下面的代码体现:
CGMutablePathRef cgpath = CGPathCreateMutable();
CGPathAddEllipseInRect(cgpath,NULL,CGRectMake(0,0,300,100));
CGPathAddEllipseInRect(cgpath,NULL,CGRectMake(20,20,300,300));

UIBezierPath *path = [UIBezierPath bezierPath];
path.CGPath = cgpath;

CGPathRelease(cgpath);
2、绘图的时候采用混合的方式相对麻烦些,首先创建一个bezierPath,在用Core Graphics框架的时候,需要先通过CGPathMutableCopy()方法将UIBezierPath的CGPath对象进行复制,对复制后对象操作之后,将复制厚的对象赋值给之前的bezierPath对象。代码实例如下:
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect :CGRectMake(0,0,300,100)];
CGPathRef pathRef = path.CGPath;
CGPathRef newPathRef = CGPathMutableCopy(pathRef);
CGPathRelease(pahtRef);

CGPathAddEllipseInRect(newPathRef,NULL,CGRectMake(20,20,300,300));
path.CGPath = newPathRef;
CGPathRelease(newPathRef);
  ********通过两段代码很容易看出区别。
Rendering The Contents of a Bezier Path Object
stroke:描线
fill:填充
在设置path的描绘的时候有以下几个步骤:
1、通过UIColor的方法设置stroke和fill的color
2、设置path的位置,可以通过修改CTM修改
3、更新path的属性
另外值得注意的是:stroke一定要在fill之后,防止fill的color占据一般的线的宽度

Doing Hit-Detection on a Path
   针对点是否落在一个封闭的fill的path内部问题,在UIKit中可以采用containsPoint:方法(UIBezierPath)。但是需要注意的是,这个方法仅限于封闭的path。该方法监测开放path的时候,都是返回NO,真想监测开放path的话,方法就是复制当前path,将copy封闭之后,对copy进行监测。
   如果希望监测一个stroked path的点落位问题,就必须采用Core Graphics框架了。方法CGContextPathContainsPoi nt让我们监测点的落位问题在fill或者stroke的path。
- (BOOL) containsPoint:(CGPoint)point onPath:(UIBezierPath*)path inFillArea:(BOOL)inFill
{
       CGContextRef context = UIGraphicsGetCurrentCont ext();
       CGPathRef cgPath = path.CGPath;
       BOOL isHit = NO;
       CGPathDrawingMode mode = kCGPathStroke;
       if (inFill)
       {
               if(path.usersEvenOddFillRule)
                       mode = kCGPathEOFill;
               else
                       mode = kCGPathFill;
       }
       CGContextSaveGState(context);
       CGContextAddPath(context,cgPath);
       isHit = CGContextPathContainsPoi nt(context,point,mode);
       CGContextRestoreGState(context);
       return isHit;
}
标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值