我希望有人可以帮助我找出一种计算上便宜的方法,用于检测平行于贝塞尔曲线绘制的线条中的扭结,您可以在这里看到
我想做的是能够确定扭结,分段与交点之前的起点和扭结之后的终点的第一段的交点.这样,我可以简单地删除任何不必要的分段,并调整第一个和最后一个分段,以在交点处相遇.
如果我使用的是不正确的术语,请抱歉但据我所知,我定位这些细分的方式是通过确定Bezier曲线(黄色)的细分的单位向量,并将其乘以偏移量,并找到法向量以创建两个新的起点和终点用于偏移片段(白色).
数学不是我强大的西装,所以我希望有人可以给我推动正确的方向.
编辑:图像实际上已被HTML调整大小,所以如果你很难看到我在说的是这里的直接链接:http://i.stack.imgur.com/xtils.png
解决方法
作为第一个近似值,计算
Bezier curve的
radius of curvature.如果偏移大于或等于曲率半径,则应该查找一个扭结.
具体来说,对于具有控制点P0,P1,P2,P3的立方贝塞尔:
B(t) = P0 * (1-t)^3 + P1 * 3*t*(1-t)^2 + P2 * 3*t^2*(1-t) + P3 * t^3 -> B'(t) = (P1-P0) * 3*(1-t)^2 + (P2-P1) * 6*t*(1-t) + (P3-P2) * 3*t^2 -> B''(t) = (P2+P0-2*P1) * 6*(1-t) + (P3+P1-2*P2) * 6*t let: cross2d(p,q) = p.x*q.y - p.y*q.x then,radius of curvature = |B'(t)|^3 / cross2d(B'(t),B''(t))
我已经以符号形式离开了曲率半径;标志应该表示您可以期望扭结的曲线的一侧.
注意:您可以具有零曲率半径或无限曲率半径;可以更好地比较| B'(t)| ^ 3与signed_offset * cross2d(B'(t),B“(t)).