我有两部分曲线。曲线的点 position(x,y) 已知。如何连接它们并得到连接曲线的位置?这里有一个类似的问题。 similar question 他说要用贝塞尔曲线。但在我看来,通常情况下,拟合曲线不会通过控制点。所以如果我从曲线的两部分中选择一些点作为控制点,拟合结果可能如下图所示。那不是我的目标。有人可以给我一些建议吗?
最佳答案
使用 Catmull-Rom 曲线,它与 Bezier 曲线相关并且易于转换为 Bezier 形式,其好处是“通过”点,而不是仅仅被它们控制。有关详细信息,请参阅 http://pomax.github.io/bezierinfo/#catmullconv ,但我们基本上需要这两个端点,以及曲线外的两个点,以确保我们在曲线上的两个点处有正确的切线:
p2 和 p3 是“你的”点,p1 和 p4 有点随意:我们只需要确保线 p1--p3
平行于 p2 处的切线(切线和它的平行线以蓝紫色表示),类似地,线 p2--p4
平行于 p3 处的切线(切线及其平行线以粉红色表示)。一个通常简单的方法是只project points p2 and p3 onto the parallel lines .
只要我们确定这是真的,我们就可以将连接线段形成为曲线坐标为 (p1,p2,p3,p4) 的 Catmull-Rom 线段。但是,如果没有 Catmull-Rom 绘图基元,我们可以通过使用以下三次贝塞尔曲线坐标将其简单地绘制为贝塞尔曲线:
- 起点:p2
- 控制点 1:p2 + (p3-p1)/(6*t)
- 控制点 2:p3 - (p4-p2)/(6*t)
- 终点:p3
这里的t
值是Catmull-Rom曲线的张力;你做得越高,连接看起来越“紧密”(在大多数支持 Catmull-Rom 的图形上下文中默认张力只是 1)。
一些示例值:
请注意,在每个示例中,点 p2 和 p3 处的切线方向都保留了下来,但是切线 vector 的长度 不同,导致拟合非常紧、很好、太松。
关于c++ - 如何连接曲线的两部分并获得连接曲线的点位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894837/