【问题标题】:What do the parameters to CGPathAddCurveToPoint mean?CGPathAddCurveToPoint 的参数是什么意思?
【发布时间】:2010-12-13 17:51:25
【问题描述】:

我想根据一天中不同时间点的太阳坐标以编程方式构建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
); 

【问题讨论】:

  • 由于我在遇到这个问题的时候发现了这个问题:如果你习惯了Illustrator等矢量图形软件,控制点的含义与Core Graphics中使用的略有不同。如果你有一个路径 [(a1,p1,b1),(a2,p2,b2),...] 其中 pi 是点,ai 是视觉上连接到它们的控制点,Core Graphics 中的等效路径将开始与 [(b1,p2,a2),...] (在 p1 的 moveToPoint 之后)。我希望这对某人有帮助。

标签: ios core-animation cgpath


【解决方案1】:

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

产生从 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 的 cmets

【讨论】:

  • Denis 写的是它们是控制点,但它们的用法是错误的。 cp1x,cp1y 给出 CURRENT 点的向量 OUT,cp2x,xp2y 给出点 x,y 的向量 INTO。此外,使用最后一点和下一点可能会给你直线。抱歉,我不能告诉你应该如何实际计算点数,但我可以建议尝试使用 CGPathAddArcToPoint。
猜你喜欢
  • 1970-01-01
  • 2013-07-07
  • 2020-12-16
  • 1970-01-01
  • 2016-10-17
  • 2015-03-05
  • 2014-05-31
  • 2012-09-16
  • 2017-04-13
相关资源
最近更新 更多