你好男女,我在速记(由路径数据中的S或s定义)贝塞尔曲线定义为SVG路径时遇到了一些麻烦。具体来说,如何计算第一个控制点。
假设我们有一个带有控制点(X1, Y1)
和(X2, Y2)
,端点(X3, Y3)
和起点(X0, Y0)
的curveto命令。
接下来是带有第一个控制点(X4, Y4)
和第二个控制点(X5, Y5)
的速记/平滑曲线命令。为简单起见,假设一切都在绝对坐标中。
如何从其他已知点计算未知的第一个控制点(X4, Y4)
?
答案 0 :(得分:16)
你的第一点是前一曲线的最后一点。在这种情况下,它将是(x3,y3)。然后,你手中的第二个点就是速记所代表的曲线长度的终点。
如果我们要将您的路径转换为两种全长版本,我们会:
M X0, Y0 C X1, Y1 X2, Y2 X3, Y3
M X3, Y3 C XR, YR X4, Y4 X5, Y5
其中XR,YR是前一曲线的最后一个控制点关于当前曲线第一个点的反映。
XR,YR只是P2对P3的反映所以:
XR = 2*X3 - X2 and
YR = 2*Y3 - Y2
答案 1 :(得分:0)
您可以将最后一条曲线的最后一个控制点和最后一条曲线的终点(这是新曲线中的第一个点)视为一条线,并且镜像控制点应位于该线上一段距离等于从最后一个控制点到最后一个终点的距离
答案 2 :(得分:0)
我找到了this。我可以引用的最短答案是:
我们用一条线将围绕起点和终点的锚点连接起来(我们称它们为
opposed-lines
):
为使线条平滑,每个控制点的位置必须 相对于其
opposed-line
:
- 控制点在与
opposed-line
平行的线上,并且与当前锚点相切。- 在此切线上,从锚点到控制点的距离取决于
opposed-line
的长度和任意的smoothing
比。- 开始控制点与
opposed-line
的方向相同,而结束控制点向后。
// When 'current' is the first or last point of the array
// 'previous' or 'next' don't exist.
// Replace with 'current'
const p = previous || current
const n = next || current
我的解释:
start
/ end - 1
)和2(start + 1
/ end
):
start
)平行于{从点0(start - 1
)到点2(start + 1
)}的线。end
)向后延伸,平行于{从点1(end - 1
)到点3(end + 1
)}的线。start - 1
替换为start
或将end + 1
替换为end
。