【问题标题】:Making sharp edges (vertices) of polygon curve制作多边形曲线的锐边(顶点)
【发布时间】:2012-01-16 13:52:41
【问题描述】:
我使用 UIBezierPath 绘制了一个多边形。我需要使它的顶点弯曲。我怎样才能做到这一点。我使用 [path addLineToPoint:CGPointMake(xPoint,yPoint)] 方法来绘制线条。我尝试使用
[路径 addCurveToPoint:self.nextPoint controlPoint1:self.controlPoint controlPoint2:self.controlPoint];
但没有运气。任何帮助将不胜感激。
【问题讨论】:
标签:
iphone
objective-c
xcode
core-graphics
quartz-2d
【解决方案1】:
这取决于您的意图。如果您需要曲线通过每个顶点,最好使用不同的样条,例如 Catmull-Rom 样条。这些具有通过所有曲线控制点的有用属性。贝塞尔曲线没有这个性质;相反,曲线以控制点的凸包为界。您还应该知道,当您的控制点彼此非常接近时,您将不得不使用任意高阶样条来避免自相交。
如果您已经有顺时针或逆时针顺序的良好控制点,以下代码将评估并绘制连接这些点的闭合 Catmull-Rom 样条。
#define SMOOTHNESS 20
for(NSUInteger i = 0; i <= pointCount; ++i) {
CGPoint p0 = points[(i + 0) % pointCount];
CGPoint p1 = points[(i + 1) % pointCount];
CGPoint p2 = points[(i + 2) % pointCount];
CGPoint p3 = points[(i + 3) % pointCount];
for(CGFloat t = 0; t <= 1; t += 1.0 / SMOOTHNESS) {
CGFloat t2 = t*t, t3 = t * t * t;
CGFloat x = 0.5 *((2 * p1.x) + (-p0.x + p2.x) * t + (2*p0.x - 5*p1.x + 4*p2.x - p3.x) * t2 + (-p0.x + 3*p1.x- 3*p2.x + p3.x) * t3);
CGFloat y = 0.5 *((2 * p1.y) + (-p0.y + p2.y) * t + (2*p0.y - 5*p1.y + 4*p2.y - p3.y) * t2 + (-p0.y + 3*p1.y- 3*p2.y + p3.y) * t3);
if(i == 0 && t == 0)
CGContextMoveToPoint(context, x, y);
else
CGContextAddLineToPoint(context, x, y);
}
}
CGContextStrokePath(context);
导致: