Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 平滑svg路径连接_Javascript_Svg_Raphael_Catmull Rom Curve - Fatal编程技术网

Javascript 平滑svg路径连接

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

我有一组随机点,希望用raphaeljs创建一个平滑的svg形状。 要连接这些点,我使用的是catmull rom样条曲线。问题是路径闭合的点不是平滑的

这是我的项目集的一个示例路径:

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更好吗(这也与中点是中位数/平均值相关)