Javascript 平滑svg路径连接
我有一组随机点,希望用raphaeljs创建一个平滑的svg形状。 要连接这些点,我使用的是catmull rom样条曲线。问题是路径闭合的点不是平滑的 这是我的项目集的一个示例路径:Javascript 平滑svg路径连接,javascript,svg,raphael,catmull-rom-curve,Javascript,Svg,Raphael,Catmull Rom Curve,我有一组随机点,希望用raphaeljs创建一个平滑的svg形状。 要连接这些点,我使用的是catmull rom样条曲线。问题是路径闭合的点不是平滑的 这是我的项目集的一个示例路径: M125,275R 125,325 175,325 225,325 275,325 225,275 175,275 125,275Z 我还创建了一个JSFIDLE: 这可以通过catmull曲线实现吗? 如果没有,你能给我一个例子,如何得到一个完全平滑的形状 非常感谢你, 麦克法兰我自己修好了: 我没有使用ca
M125,275R 125,325 175,325 225,325 275,325 225,275 175,275 125,275Z
我还创建了一个JSFIDLE:
这可以通过catmull曲线实现吗?
如果没有,你能给我一个例子,如何得到一个完全平滑的形状
非常感谢你,
麦克法兰我自己修好了:
我没有使用catmull rom样条曲线,而是使用二次曲线和计算的中点。
请注意,此解决方案仅在希望绘制平滑图形时有效,但在路径必须直接通过点时无效
这就是它的工作原理:
第一:
将直线起点设置为紧跟moveTo命令的第一个点
M point1.x,point1.y M
这对于关闭没有边的路径很重要
现在循环遍历您拥有的每个点,并将计算出的中点添加到当前点和下一点之间,然后是以下一点为控制点的二次曲线:
mid.x,mid.y C next.x,next.y
C first.x,first.y mid.x, mid.y
使用以下公式计算A和B之间的中点M:
M.x = (A.x-B.x)/2 + B.x
M.y = (A.y-B.y)/2 + B.y
循环通过所有点后,必须创建一条到第一个点和第二个点中点的二次曲线,第一个点作为控制点:
mid.x,mid.y C next.x,next.y
C first.x,first.y mid.x, mid.y
现在使用Z关闭路径,以便可以填充形状:
Z
此连接不可见,因为路径开头有两个moveTo命令
要查看我的解决方案的结果和源代码,请访问更新的JSFIDLE:
在第一个示例中,路径从125275开始,在关闭之前再次位于125275。因为“Z”创建了另一个连接起点和终点的平滑路径段,所以得到了那个小循环。如果在返回起始点之前将其关闭,则会得到与所有给定点接触的所需平滑形状 这是示例路径的更正版本:
M125,275R 125,325 175,325 225,325 275,325 225,275 175,275Z
我刚刚给了你被接受的答案标签。这是正确的答案,我的答案只是一个解决办法。难道(Ax-Bx)/2+Bx不会比(Ax+Bx)/2更好吗(这也与中点是中位数/平均值相关)