10

我希望有人可以帮助我找出一种计算成本低廉的方法来检测与贝塞尔曲线平行绘制的直线中的扭结,如您在此处看到的

与贝塞尔曲线平行的线扭结

我想要做的是能够确定扭结的交叉点,在交叉点之前具有起点的段以及在扭结之后具有终点的第一段。这样我可以简单地删除任何不必要的段并调整第一个和最后一个段以在交叉点相遇。

抱歉,如果我使用了不正确的术语。但据我了解,我定位这些线段的方式是确定贝塞尔曲线(黄色)的线段的单位向量并将其乘以偏移量并找到法线向量以创建两个新的起点和终点对于偏移段(白色)。

数学不是我的强项,所以我希望有人能推动我朝着正确的方向前进。

编辑:图像实际上已由 HTML 调整大小,所以如果你很难看到我在说什么,这里是直接链接:http: //i.stack.imgur.com/xtils.png

4

1 回答 1

5

作为第一个近似值,计算Bezier 曲线曲率半径。如果偏移大于或等于曲率半径,您应该寻找扭结。

具体来说,对于具有控制点的三次贝塞尔曲线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))

于 2012-04-03T22:28:56.327 回答