我有两段曲线。曲线上的点位置(x,y)已知。如何连接它们并获得连接曲线的位置?这里有一个类似的问题。similar question
他说要使用贝塞尔曲线。但是在我看来,通常拟合曲线不会经过控制点。因此,如果我从两段曲线中选择一些点作为控制点,则拟合结果可能如下图所示。那不是我的目标。有人能给我一些建议吗?
p2和p3是"你的"点,而p1和p4则是相对任意的:我们只需要确保线段p1-p3
与p2处的切线平行(切线及其平行线用蓝紫色表示),同样地,线段p2-p4
也要与p3处的切线平行(切线及其平行线用粉红色表示)。一个通常较为简单的方法就是将点p2和p3投影到这些平行线上project points p2 and p3 onto the parallel lines。
只要我们确保了这一点,我们就可以将连接线段形成为Catmull-Rom曲线,其曲线坐标为(p1,p2,p3,p4)。如果没有Catmull-Rom绘图原语,我们也可以将其作为贝塞尔曲线来轻松绘制,方法是使用以下三次贝塞尔曲线坐标:
t
值是Catmull-Rom曲线的张力;您将其设置得越高,连接看起来就越“紧密”(在大多数支持Catmull-Rom的图形上下文中,默认张力为1)。正如我在评论中提到的,样条曲线可能比贝塞尔曲线在这种情况下更好。然而,您也可以使用更简单的方法。您有4个点(红色)。尝试使用以下公式将它们拟合为多项式(3次方程,因为您只有4个点):
A x^3 + B x^2 + C x + D = y
您有4个点数 (P0,P1,P2,P3
):
A x0^3 + B x0^2 + C x0 + D = y0
A x1^3 + B x1^2 + C x1 + D = y1
A x2^3 + B x2^2 + C x2 + D = y2
A x3^3 + B x3^2 + C x3 + D = y3
A,B,C,D
的值。for(auto x=P1.x; x<P2.x; ++x){
auto y=A*x*x*x + B*x*x + C*x + D;
cv::circle(image,cv::Point(x,y),.......);
}