在我的可可爱好项目(在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
项数组(可能还有一个控制点数组,对于第二个例子),然后循环它们来创建这条线是有意义的。
最好的办法是什么?
更新
按照汤米的建议,我把雷蒙德·希尔的Javascript-Voronoi库移植到了Obj。你可以在这里找到它:https://github.com/ccheaton/objcvoronoi
另一次更新
再来一次更新--我使用了Dijkstra的算法,发现它对我试图实现的目标来说太过分了。最后,我实现了一个简化的变体,允许我为随机行指定指导节点。在这个图像中,行开始在左中,线末端在右中,在(xMax * 0.33,0)和(xMax * 0.66,yMax)有指导点。
最后更新
为了使它少一些锯齿状,我添加了一个可选的松弛算法。现在的性能不是很好,但这对我想要的使用来说并不重要。
发布于 2012-03-09 13:43:24
有许多方法在脑海中浮现。
在代码方面,你可以直接从互联网上拔出,你可以拉下一个随机的迷宫发生器和一个迷宫解决器,然后根据你的需要生成一个迷宫和入口点,然后拿出解决方案。
在我介绍的过程中,您可以尝试一种递归方法--从开始到结束以直线开始,然后对每条直线进行如下操作:
对于其他有趣的想法,在起始点和终点之间抛出大量随机点,计算Voronoi图,然后(i)从起始点走到边界上的任何地方;(ii)按照到达端点边界的最短路径沿着单元边界走(例如,使用Dijkstra算法);然后(iii)走到终点。然后,您可以遍历(ii)中添加的每个顶点到顶点链接,找出最短的路径,所有当前选定的链接都从潜在的集合中删除,并重复几次,以使路径更有趣。
从大致相同的观点来看,在点与点之间抛出一堆随机的障碍物,并运行一个A*式的探路者,可能会产生一些有趣的东西。
https://stackoverflow.com/questions/9641173
复制相似问题