如何检测并删除三次贝塞尔曲线中不需要的点

时间:2013-12-21 10:52:41

标签: svg bezier

以下是我想要做的示例图片: enter image description here
我想从路径2 计算路径1

从Inkscape制作的屏幕截图,我首先创建路径1 ,然后将 p3 添加到原始路径。这根本没有改变原始路径,因为新点实际上是不需要的。那么,如何使用路径2 SVG路径表示检测此点(p3)并从路径2 计算路径1

基本上,我搜索数学公式,这可以帮助我转换(也检查是否可能):
C 200,300 300,250 400,250 C 500,250 600,300 600,400

C 200,200 600,200 600,400

1 个答案:

答案 0 :(得分:3)

您正在解决约束问题。采用您的第一条复合曲线,并为每个子曲线使用四个显式坐标,我们有:

points1 = point[8];
points2 = point[4];

与以下对应关系:

points1[0] == points2[0];
points1[7] == points2[3];

direction(points1[0],points1[1]) == direction(points2[0], points2[1]);
direction(points1[6],points1[7]) == direction(points2[2], points2[3]);

由于复合曲线中心点的切线,我们对points2 [1]和points2 [2]的相对位置也有约束:

direction(points1[2],points[4]) == direction(points2[1],points2[2]);

最后,如果我们希望曲线通过一个点,我们对曲线点在曲线上和曲线外曲线的位置有一般约束,这在http://pomax.github.io/bezierinfo/#moulding

中有描述。

从该部分得到“abc”比率,我们可以检查你的复合曲线参数是否适合一个三次曲线:如果我们用点构造一个新的三次曲线

A = points1[0];
B = points1[3];
C = points1[7];

B在t = 0.5(在这种情况下),然后我们可以验证得到的曲线是否符合必须保持的约束,这是一个合法的简化。

这里的主要问题是,我们通常不知道“在开始和结束之间”点是否应该落在t = 0.5,或者它是否是不同的t值。最简单的解决方案是查看该点在整个曲线上的距离(使用弧长:distance = arclength(c1)/ arclength(c1)+ arclength(c2)将告诉我们)并将其用作t的初始猜测,迭代向外两侧以获得一些价值。

第二个选项是在“中间”点处求解切向量的一般三次方程。我们用点

形成一个三次曲线
points3 = [ points1[0], points1[1], points1[6], points1[7] ];

然后求解其导数方程以找到一个或多个具有相同切线方向(但不是幅度!)的t值作为我们的中间点。一旦我们有了这些(我们可能有2个以上),我们评估是否可以通过我们的三个兴趣点创建一条曲线,并将中间点设置为每个找到的t值。找到的t值中的一个或零将产生合法曲线。如果我们有一个:完美,我们发现了一个简化。如果我们找不到,则复合曲线不能简化为单个三次曲线。