我需要在 C# (Unity) 中以曲线的形式实现连接。我希望得到与 Miro.com 中的实现尽可能相似的结果(见截图)。
附加曲线后,我计算三次贝塞尔曲线的路径。对于第一段,使用锚点和与其连接的对象的偏移量。在这个阶段没有任何问题。
问题:当通过单击并拖动线段的一个蓝点(见截图)将曲线分割成线段时,它在中间被一分为二。在两条新曲线的交界处,形成了一个新的交互(可移动)点,其控制点的切线和坐标是未知的。每次交互点的位置发生变化(下图中的白点)时,我都需要找到这些控制点的位置。此外,曲线在分割时不应剧烈改变其位置,而不是形成循环,具有不同长度的控制点向量(我不确定这里)并尽可能充分地表现(就像在 Miro 的板上)。
控制点是指 Bezier 段的 2 个不可见的引导点。
我用黑色绘制了已知的控制点,用红色绘制了我需要找到的那些。(Pn - 交互点,Cn - 控制点)
我试图找到它们的算法给出了不正确的控制点距离和方向。
测试了以下算法:
- Interpolation from Tacent - 分离时曲线的跳跃,控制点的方向和缩进量不合适;
- Chaikin 算法 - 分离过程中的曲线跳跃,创建循环;
- 基于猜测的“自定义”插值(考虑到线段起点和终点之间到线段中心的距离,以及起点和终点之间的方向) - 有所有相同的问题,但看起来比上面的稍微好一点。
我怀疑解决方案是使用 Catmull-Rom 样条对点进行弦内插,并将结果转换为贝塞尔曲线的点。但是,实施上仍然存在问题。
来自 3DMax 的曲线看起来也非常相似。在他们的文档中,我发现只提到了参数曲线。
我没有使用(或不起作用)的方法:
- Catmull-Rom 插值;
- B样条插值;
- 厄米插值;
- De Casteljau 的算法(虽然它似乎不适合这个)
我将非常感谢任何帮助,但我要求尽可能详细。