在我的 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]
与平滑的曲折线一起使用。
第二种情况似乎更困难,因为还必须计算合理的控制点。
最后,我希望能够调整线条蜿蜒的量。如果我将一个变量设置为 1,那么和int numOfIntermediatePoints
之间会有一条平滑曲线。如果我设置为 10,则线路中的移动会更多。我不希望最后的中间点离终点很远(在行尾留下很大的变化)。pt1
pt2
numberOfIntermediatePoints
我已经研究过使用 Perlin 噪声,但似乎很难将线引导到终点。似乎计算一个NSPoint
项目数组(可能还有一个控制点数组,对于情况二)然后循环它们以创建线是有意义的。
最好的方法是什么?
更新
按照 Tommy 的建议,我将Raymond Hill 的 Javascript-Voronoi库移植到了 Obj-C。你可以在这里找到它:https ://github.com/ccheaton/objcvoronoi
另一个更新
还有一个更新——我使用了 Dijkstra 的算法,发现它对于我想要实现的目标来说太过分了。我最终实现了它的简化变体,允许我为随机线指定引导节点。在这张图中,线的起点在左中,线的终点在右中,在 (xMax * 0.33, 0) 和 (xMax * 0.66, yMax) 处有引导点。
最终更新
为了让它稍微不那么锯齿,我添加了一个可选的松弛算法。现在性能不是很好,但这对我的使用无关紧要。