我需要在C#(Unity)中实现曲线连接。 我希望结果尽可能与Miro.com的实现相似(请参见屏幕截图)。将曲线附加后,我计算立方贝塞尔曲线的路径。对于这个第一段,使用连接对象的锚点和偏移量。在此阶段没有问题。
问题:通过单击并拖动段的蓝色点之一将曲线分成多个部分时(请参见屏幕截图),它会在中间分成两部分。在两个新曲线的交界处,形成一个新的交互式(可移动)点,其切线和控制点的坐标未知。每次交互点的位置发生变化时,我需要找到这些控制点的位置(下图中的白点)。此外,曲线在分割时不应大幅改变其位置,不应形成循环,控制点向量的长度应不同(我在这里不确定),并且应尽可能地表现得像Miro上的板子。
通过控制点,我指的是贝塞尔段的2个不可见引导点。
我用黑色标出了已知的控制点,红色标出了需要找到的控制点。(Pn-交互式点,Cn-控制点)
我尝试过的算法无法正确计算控制点的距离和方向。
下面是测试过的算法:
从3DMax中得到的曲线看起来也非常相似。在他们的文档中,我只找到了对参数曲线的提及。
问题:通过单击并拖动段的蓝色点之一将曲线分成多个部分时(请参见屏幕截图),它会在中间分成两部分。在两个新曲线的交界处,形成一个新的交互式(可移动)点,其切线和控制点的坐标未知。每次交互点的位置发生变化时,我需要找到这些控制点的位置(下图中的白点)。此外,曲线在分割时不应大幅改变其位置,不应形成循环,控制点向量的长度应不同(我在这里不确定),并且应尽可能地表现得像Miro上的板子。
通过控制点,我指的是贝塞尔段的2个不可见引导点。
我用黑色标出了已知的控制点,红色标出了需要找到的控制点。(Pn-交互式点,Cn-控制点)
![Curved connection in Miro.com](https://istack.dev59.com/b8Jpi.webp)
下面是测试过的算法:
- 从Tacent插值——分离时曲线跳跃,控制点的缩进方向和数量不当;
- Chaikin算法——分离时曲线跳跃,会产生循环;
- "自定义"插值基于猜测(考虑到起点和终点之间线段的中心距离以及起点和终点之间的方向)——所有问题都一样,但比上述算法看起来略好。
从3DMax中得到的曲线看起来也非常相似。在他们的文档中,我只找到了对参数曲线的提及。
我没有使用的方法(或者没有起作用的方法):
- 卡特穆勒-罗姆插值;
- B样条插值;
- 埃尔米特插值;
- De Casteljau算法(虽然它似乎不适用于这个问题)
我将非常感激任何帮助,但我要求尽可能详细。