在下面的屏幕截图中:
当您拖动单词气球的尾部(从气球连接到人的嘴的东西)时,形状会弯曲(如图中两个气球尾部之间的差异所示)。我想知道,这是怎么做到的?我假设您需要从 CGPath 开始并对它做一些事情,有人知道这是什么吗?
更新:所以如果我想弯曲以下形状:
我会使用以下代码吗:
CGPathAddCurveToPoint(mutablePath, NULL, x1, y1, x2, y2 + constant, x5, y5);
CGPathAddCurveToPoint(mutablePath, NULL, x3, y3, x4, y4 + constant, x5, y5);
常数在哪里重新调整点 2 和点 4 的 y 位置来制作曲线?
您需要利用这样一个事实:从数学上讲,直线段只是曲线段的一种。
(这比听起来容易,相信我。)
贝塞尔曲线路径段有一种称为“顺序”的东西,它本质上决定了该段中有多少个点,而不是计算您来自的点。
- 直线段是一阶曲线,这意味着它只有终点。这些“曲线”始终是直线,因为没有可以弯曲的控制点。
- 二次曲线是二阶曲线(一个控制点加上目的地)。
- 三次曲线是三阶曲线(两个控制点)。
- (数学对此没有任何限制,但 Quartz 到此为止。如果不滚动自己的光栅器,就没有四阶曲线。)
这很重要,因为任何低阶曲线(包括直线)都可以表示为高阶曲线.
那么,秘密是什么呢?
即使是笔直的尾巴,使用曲线.
(即三次曲线,因为您希望曲线沿两个不同的方向移动:一个方向或多或少进入气球尾部,另一个方向或多或少沿着气球的边缘。)
从尾部底部的两个点中的每一个,您希望其中一个控制点位于到达目的地的大约一半处。这一点是无条件的。
The 方向每个控制点为您提供三个选项:
笔直的尾巴
注意图像垂直中心沿蓝线的两个控制点。
注意这两个控制点相对于其连接的基点的方向。它们向内倾斜,朝向尖端——实际上,正好在通往尖端的直线上。
斜尾
这里,尖端点不再水平地位于两个基点之间。控制点已移动,但只是跟随移动:每个控制点仍位于相应基点和尖端之间直线的中间位置。
弯曲的尾巴
对于弯曲的尾巴,您可以移动尖端,但你将控制点保持在与直尾相同的位置。因此,尾部一开始是笔直的(跟随控制点),但随着它距离基点越来越远,它们的影响减弱,尾部开始向尖端弯曲。
这比用代码进行视觉描述要容易得多,因此您可能需要考虑使用 PaintCode 或 Opacity 之类的工具来使用钢笔工具绘制每种尾巴,然后查看它们为其生成的代码是什么样的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)