【发布时间】:2012-03-27 07:46:30
【问题描述】:
在我的 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's Javascript-Voronoi 库移植到了 Obj-C。你可以在这里找到它:https://github.com/ccheaton/objcvoronoi
另一个更新
还有一个更新——我使用了 Dijkstra 的算法,发现它对于我想要实现的目标来说太过分了。我最终实现了它的简化变体,允许我为随机线指定引导节点。在这张图中,线的起点在左中,线的终点在右中,在 (xMax * 0.33, 0) 和 (xMax * 0.66, yMax) 处有引导点。
最终更新
为了减少锯齿,我添加了一个可选的松弛算法。性能现在不是很好,但这对我的用途无关紧要。
【问题讨论】:
标签: objective-c macos cocoa noise nsbezierpath