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

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

概述我希望有人可以帮助我找出一种计算上便宜的方法,用于检测平行于贝塞尔曲线绘制的线条中的扭结,您可以在这里看到 我想做的是能够确定扭结,分段与交点之前的起点和扭结之后的终点的第一段的交点.这样,我可以简单地删除任何不必要的分段,并调整第一个和最后一个分段,以在交点处相遇. 如果我使用的是不正确的术语,请抱歉但据我所知,我定位这些细分的方式是通过确定Bezier曲线(黄色)的细分的单位向量,并将其乘以偏 我希望有人可以帮助我找出一种计算上便宜的方法,用于检测平行于贝塞尔曲线绘制的线条中的扭结,您可以在这里看到

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

如果我使用的是不正确的术语,请抱歉但据我所知,我定位这些细分的方式是通过确定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*tlet:  cross2d(p,q) = p.x*q.y - p.y*q.xthen,radius of curvature = |B'(t)|^3 / cross2d(B'(t),B''(t))

我已经以符号形式离开了曲率半径;标志应该表示您可以期望扭结的曲线的一侧.

注意:您可以具有零曲率半径或无限曲率半径;可以更好地比较| B'(t)| ^ 3与signed_offset * cross2d(B'(t),B“(t)).

总结

以上是内存溢出为你收集整理的c# – 将平行线中的“扭结”检测到贝塞尔曲线全部内容,希望文章能够帮你解决c# – 将平行线中的“扭结”检测到贝塞尔曲线所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存