这是我现在的代码(我省略了控制点和其他东西的计算):
for (int i = 1; i < points.count; ++i) { CGContextMovetoPoint(context,prevIoUsXValue,prevIoUsYValue); CGContextAddCurvetoPoint(context,firstControlPointXValue,firstControlPointYValue,secondControlPointXValue,secondControlPointYValue,xValue,yValue ); // CGContextFillPath(context); CGContextstrokePath(context);}
现在我想填充曲线下方的区域,但如果我使用CGContextFillPath,结果如下:
这是有道理的,因为根据Quartz 2D documentation:
When you fill the current path,Quartz acts as if each subpath contained in the path were closed. It then uses these closed subpaths
and calculates the pixels to fill.
然后我尝试将路径移动到右下角并关闭路径,但填充方法没有任何影响:
CGContextMovetoPoint(context,rect.size.wIDth,rect.size.height);CGContextClosePath(context);CGContextFillPath(context);
我怎样才能填满曲线下面的整个区域而不仅仅是在每个子路径中关闭的子区域?
编辑:
我找到了一个临时解决方案:使用曲线绘制形状,并在每个子路径上绘制两条垂直线:
for (int i = 1; i < points.count; ++i) { // Draw the curve CGContextMovetoPoint(context,yValue ); CGContextstrokePath(context); // Draw a shape using curve's initial and final points CGContextMovetoPoint(context,rect.size.height); CGContextAddlinetoPoint(context,yValue ); CGContextAddlinetoPoint(context,rect.size.height); CGContextFillPath(context);}
我不知道这是否过度,所以也欢迎改进.此外,我得到了这个结果:
请注意,垂直线显示为绘制彼此相邻的子区域的结果.怎么可以避免?
解决方法 这个想法是正确的,但你不应该填充单个曲线,而是创建一个单独的路径然后填充它.所以,从CGContextMovetoPoint到左下角,CGContextAddlinetoPoint到你的第一个点,为所有曲线做CGContextAddCurvetoPoint,最后,在右下角做一个CGContextAddlinetoPoint(你也可以做一个CGContextClosePath for good测量).这是一个简化的例子,我只有一个点数组,但它说明了这个想法:
- (voID)drawRect:(CGRect)rect{ if (!self.points) [self configurePoints]; DataPoint *point; CGContextRef context = UIGraphicsGetCurrentContext(); CGcolorRef color = [[UIcolor redcolor] CGcolor]; CGContextSetstrokecolorWithcolor(context,color); CGContextSetFillcolorWithcolor(context,color); point = self.points[0]; CGContextMovetoPoint(context,point.x,self.bounds.size.height); CGContextAddlinetoPoint(context,point.y); for (point in self.points) { // you'd do your CGContextAddCurvetoPoint here; I'm just adding lines CGContextAddlinetoPoint(context,point.y); } point = [self.points lastObject]; CGContextAddlinetoPoint(context,self.bounds.size.height); CGContextClosePath(context); CGContextDrawPath(context,kCGPathFillstroke);}总结
以上是内存溢出为你收集整理的ios – 如何填充Quartz 2D中路径下方的区域?全部内容,希望文章能够帮你解决ios – 如何填充Quartz 2D中路径下方的区域?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)