[男女您好,我在定义为SVG路径的速记(由path数据中的S或s定义)时遇到一些麻烦。具体来说,如何计算第一个控制点。
说我们有一个带有控制点(X1, Y1)
和(X2, Y2)
,端点(X3, Y3)
和起点(X0, Y0)
的curveto命令。
接下来是带有第一控制点(X4, Y4)
和第二控制点(X5, Y5)
的速记/平滑曲线命令。为了简单起见,假设所有内容都在绝对坐标中。
如何从其他已知点计算未知的第一个控制点(X4, Y4)
?
您的第一个点是上一条曲线的最后一个点。在这种情况下,它将是(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
您可以将最后一条曲线的最后一个控制点和最后一条曲线的终点(这是新曲线中的第一个点)视为一条直线,并且镜像的控制点应位于该直线上等距离到最后一个控制点到最后一个终点的距离
我找到了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
。