加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:23:15 所属栏目:百科 来源:网络整理
导读:我希望有人可以帮助我找出一种计算上便宜的方法,用于检测平行于贝塞尔曲线绘制的线条中的扭结,您可以在这里看到 我想做的是能够确定扭结,分段与交点之前的起点和扭结之后的终点的第一段的交点.这样,我可以简单地删除任何不必要的分段,并调整第一个和最后一个
我希望有人可以帮助我找出一种计算上便宜的方法,用于检测平行于贝塞尔曲线绘制的线条中的扭结,您可以在这里看到

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

如果我使用的是不正确的术语,请抱歉但据我所知,我定位这些细分的方式是通过确定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*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)).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读