gpt4 book ai didi

c# - 在贝塞尔曲线的平行线中检测到 "Kinks"

转载 作者:可可西里 更新时间:2023-11-01 09:13:08 24 4
gpt4 key购买 nike

我希望有人能帮我找出一种计算成本低廉的方法来检测与贝塞尔曲线平行绘制的直线中的扭结,如您在此处所见

Kink in Line Parallel to Bezier Curve

我想做的是能够确定拐点的交点,即起点在交点之前的线段和终点在拐点之后的第一个线段。这样我就可以简单地删除任何不必要的线段并调整第一个和最后一个线段以在交叉点相遇。

如果我使用了不正确的术语,我们深表歉意。但据我所知,我定位这些线段的方式是确定贝塞尔曲线(黄色)线段的单位向量并将其乘以偏移量并找到法线向量以创建两个新的起点和终点用于偏移段(白色)。

数学不是我的强项,所以我希望有人能在正确的方向上插入我。

编辑:图像实际上已经通过 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)|^3signed_offset * cross2d(B'(t), B''(t)) 进行比较可能会更好。

关于c# - 在贝塞尔曲线的平行线中检测到 "Kinks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com