11

我想CGPathRef根据一天中不同时间点的太阳坐标以编程方式构建一个。计算点数不是问题,但我想做一个CGPathRef平滑且认为CGPathAddCurveToPoint合适的点。

我了解路径、变换、x 和 y 参数,但我不确定其他参数。根据 Apple 文档,它们是控制点,我猜它们就像您在矢量绘图程序中看到的那样,您可以在其中调整曲线通过该点的方式。

我的问题是如何选择与我的坐标相关的点而不知道这些坐标是什么提前?我在想也许只是从每个第一个控制点中减去一个设定的数量,然后将相同的数量添加到第二个控制点,但这对我来说听起来过于简单了。是否有一种标准方法可以生成对平滑曲线“有意义”的控制点?

void CGPathAddCurveToPoint (
   CGMutablePathRef path,
   const CGAffineTransform *m,
   CGFloat cp1x,
   CGFloat cp1y,
   CGFloat cp2x,
   CGFloat cp2y,
   CGFloat x,
   CGFloat y
); 
4

1 回答 1

7

额外的点是曲线离开源(当前)点和进入目标点的曲线的贝塞尔控制点(有关一般解释,请参见http://en.wikipedia.org/wiki/Bézier_curve )。线 currentX,currentY - cp1x,cp1y 是当前点的向量“out”,而 cp2x,cp2y - x,y 是到最终点的向量“in”。

产生从 p1 到 p2 的平滑曲线(假设 4 个点 p0、p1、p2、p3)的合理方法是(伪代码):

v = (strength of curve from 0.0 to 1.0)
cp1x = p1.x+v*(p1.x-p0.x)
cp1y = p1.y+v*(p1.y-p0.y)
cp2x = p2.x-v*(p3.x-p2.x)
cp2y = p2.y-v*(p3.y-p2.y)

对于起点,将 cp1x,cp1y 设置为起点 x,y,对于终点,将 cp2x,cp2y 设置为终点 x,y。

注意:我已经更新了答案以合并来自 ughoavgfhw 的评论

于 2010-12-13T18:35:45.180 回答