微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 将平行线中的“扭结”检测到贝塞尔曲线

我希望有人可以帮助我找出一种计算上便宜的方法,用于检测平行于贝塞尔曲线绘制的线条中的扭结,您可以在这里看到

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

如果我使用的是不正确的术语,请抱歉但据我所知,我定位这些细分的方式是通过确定Bezier曲线(黄色)的细分的单位向量,并将其乘以偏移量,并找到法向量以创建两个新的起点和终点用于偏移片段(白色).

数学不是我强大的西装,所以我希望有人可以给我推动正确的方向.

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

解决方法

作为第一个近似值,计算 Bezier curveradius 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)).

原文地址:https://www.jb51.cc/csharp/95752.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐