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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/csharp/95752.html

猜你在找的C#相关文章