有没有办法让最近的节点到节点?
我正准备编写一个迭代所有节点并计算距离等的方法......但是想知道是否有更好的方法?
我有30个节点,并且需要30个节点中每个节点最近的2个节点(如果有意义的话)。
答案 0 :(得分:3)
从iOS 10开始,您可以使用GampelayKit的空间分区功能。在2D中,GKQuadtree或GKRTree取决于您的需求。
来自文档:
四叉树和R树对于不同的任务有不同的性能权衡:当对象在空间中更均匀地分布或者当它们的位置经常变化时,四叉树可以更快,并且当搜索给定的所有对象时R树可以更快区域。
将敌人添加到树中:
let minX = Float(enemy.frame.minX)
let minY = Float(enemy.frame.minY)
let maxX = Float(enemy.frame.maxX)
let maxY = Float(enemy.frame.maxY)
var enemiesRTree = GKRTree(maxNumberOfChildren: 3)
enemiesRTree.addElement(enemy,
boundingRectMin: vector2(minX, minY),
boundingRectMax: vector2(maxX, maxY),
splitStrategy: GKRTreeSplitStrategy.linear)
然后你可以按地区搜索。
let enemiesInProximity = enemiesRTree.elements(
inBoundingRectMin: vector2(0, 0),
rectMax: vector2(100, 100))
然后,您可以创建搜索区域,例如相对于玩家的位置。
答案 1 :(得分:1)
我相信你的方法最适合这种情况。如果以阵列样式存储所有节点,可能会有一种相对有效的方法来执行上面提到的操作。
在任何情况下,您仍然可能有三个节点最近的任务。如果这不是问题,则使用一种方法,该方法采用节点位置,然后使用for循环投影半径增加的“不可见圆”,直到圆最终包含2个节点。然后只返回那些节点。