作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我希望有人能帮我找出一种计算成本低廉的方法来检测与贝塞尔曲线平行绘制的直线中的扭结,如您在此处所见
我想做的是能够确定拐点的交点,即起点在交点之前的线段和终点在拐点之后的第一个线段。这样我就可以简单地删除任何不必要的线段并调整第一个和最后一个线段以在交叉点相遇。
如果我使用了不正确的术语,我们深表歉意。但据我所知,我定位这些线段的方式是确定贝塞尔曲线(黄色)线段的单位向量并将其乘以偏移量并找到法线向量以创建两个新的起点和终点用于偏移段(白色)。
数学不是我的强项,所以我希望有人能在正确的方向上插入我。
编辑:图像实际上已经通过 HTML 调整了大小,所以如果您很难理解我在说什么,请点击这里的直接链接:http://i.stack.imgur.com/xtils.png
最佳答案
作为第一个近似值,计算 radius of curvature你的Bezier curve .如果偏移量大于或等于曲率半径,则应查找扭结。
具体来说,对于具有控制点 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))
进行比较可能会更好。
关于c# - 在贝塞尔曲线的平行线中检测到 "Kinks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000590/
我是一名优秀的程序员,十分优秀!