我使用UIBezierPath绘制了一个多边形。我需要让它的顶点弯曲。我怎样才能做到这一点。我使用[path addLineToPoint:CGPointMake(xPoint,yPoint)]方法绘制线条。我试过用 [path addCurveToPoint:self.nextPoint controlPoint1:self.controlPoint controlPoint2:self.controlPoint]; 但没有运气。任何帮助将不胜感激。
答案 0 :(得分:1)
这取决于你的意图。如果您需要曲线穿过每个顶点,最好使用不同的样条曲线,例如Catmull-Rom样条曲线。它们具有通过所有曲线控制点的有用特性。 Bézier曲线没有这个属性;相反,曲线由控制点的凸包边界限定。您还应该知道,当控制点非常接近时,您将不得不使用任意高阶样条曲线来避免自相交。
如果您的控制点已经顺时针或逆时针顺序,则以下代码将评估并绘制连接点的闭合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);
导致: