在我的Cocoa业余项目(在OSX上),我有一个视图,其中标识了一些点。类似于这样:
我想在两个点之间创建一条蜿蜒曲线(不相交)。这些点可能会变化。我熟悉
有两种变体。给定
最后,我希望能够调整线条蜿蜒的程度。如果我将变量设置为
NSPoint pt1 = NSMakePoint(20,100);
NSPoint pt2 = NSMakePoint(100,30);
我想在两个点之间创建一条蜿蜒曲线(不相交)。这些点可能会变化。我熟悉
NSBezierPath
,但我并不是绘图专家。有两种变体。给定
NSBezierPath *p...
和[p moveToPoint:pt1]
的设置:
- 使用
[p lineToPoint:ptx]
创建一个崎岖不平的蜿蜒曲线。 - 使用
[p curveToPoint:ptx controlPoint1:cpt1 controlPoint2:cpt2]
创建一个平滑的蜿蜒曲线。
最后,我希望能够调整线条蜿蜒的程度。如果我将变量设置为
int numOfIntermediatePoints
,并将其设置为1,则pt1
和pt2
之间会有一个平滑的曲线。如果我将numberOfIntermediatePoints
设置为10,则线条中会有更多的运动。我不希望最后的中间点离最终点很远(留下了一大段线末端的变化)。
我研究了使用Perlin噪声,但似乎很难引导线条朝向其结束点。计算一个NSPoint
项目数组(并可能是控制点数组,对于第二种情况),然后循环遍历它们以创建线条似乎是合理的方法。
这个问题的最佳解决方法是什么?
更新
根据Tommy的建议,我将Raymond Hill的Javascript-Voronoi库移植到了Obj-C。你可以在这里找到它:https://github.com/ccheaton/objcvoronoi
另一个更新
我做了另一个更新--我尝试了Dijkstra算法,发现它对我想要实现的内容来说过于复杂。最终,我实现了一个简化版的算法,可以让我指定随机线的引导节点。在这张图片中,线的起点位于中左侧,终点位于中右侧,并且在(xMax * 0.33, 0)和(xMax * 0.66, yMax)处有引导节点。
最终更新
为了使其更加平滑,我添加了一个可选的松弛算法。现在性能不是很好,但对于我想要的用途并不重要。