我一直在做一个项目,我使用贝塞尔路径来绘制我需要的曲线。我的项目中的每个基本形状都由三个三次贝塞尔曲线首尾相连,以便斜率与它们相交的位置相匹配。
我需要解决的基本问题是由三个贝塞尔曲线组成的复合曲线是否与自身相交。经过一段时间的思考,我发现鉴于曲线的约束,我可以将任务简化为其他内容:
三个 Bezier 路径中的每一个的曲率应该在曲率方向上相对于它所邻接的曲线是相反的。换句话说,应该有一个拐点,其中一条贝塞尔曲线与另一条贝塞尔曲线邻接。如果不是这种情况,我想拒绝生成曲线的参数集并选择不同的集。
无论如何,我的基本问题是如何检测曲线相互邻接的拐点是否存在。
在插图中,三个贝塞尔曲线中的每一个都使用不同的颜色显示。左边的黑色曲线在它们相交的点处与红色曲线的弯曲方向相反,但右边的黑色曲线在同一方向弯曲。在红色和左黑色曲线相交处存在一个拐点,但在红色和右黑色曲线相交处没有。
编辑:下面,我添加了另一个图像,显示了包围贝塞尔路径的多边形。黑色曲线中显示的多边形的交叉线测试的是拐点,而不是循环。我猜可以通过检查封闭多边形是否相交来测试一条曲线与另一条曲线相交,如红色和蓝色曲线所示。
PS由于有一些关于约束的问题,我将在这里列出其中的一些:
- 最左边的点和最右边的点具有相同的 y 值。
- 最左边点的控制点的x值小于
最右边点的控制点的x值。这可以防止
黑色和蓝色曲线相互交叉。 - 最左边和最右边点的斜率在水平线的大约 +/- 10 度范围内。
- 黑色和红色曲线的交点以及红色和蓝色曲线的交点将整条曲线分成大约三分之二。我没有确切的数字,但样本界限是红色曲线左端的 x 值介于最右边点 x 值的 25% 到 40% 之间。
- 交点的 y 值是整个宽度的 +/- 一小部分。
- 交叉点处的斜率 > 0.6 且 < 3.0(正或负)。