Ios - Spritekit - Как рассчитать расстояние между двумя узлами?

У меня есть два скнода на экране. Каков наилучший способ рассчитать расстояние ( "как воронье" тип расстояния, мне не нужен вектор и т.д.)?

У меня был google и поиск здесь, и я не могу найти что-то, что покрывает это (не так много потоков в stackoverflow о наборе спрайтов)

Ответ 1

Здесь функция, которая сделает это за вас. Это из примера кода Apple Adventure:

CGFloat SDistanceBetweenPoints(CGPoint first, CGPoint second) {
    return hypotf(second.x - first.x, second.y - first.y);
}

Чтобы вызвать эту функцию из вашего кода:

CGFloat distance = SDistanceBetweenPoints(nodeA.position, nodeB.position);

Ответ 2

joshd и Andrey Gordeev оба правильны, с решением Гордеева, излагающим, что делает функция hypotf.

Но функция квадратного корня является дорогостоящей функцией. Вы должны будете использовать его, если вам нужно знать фактическое расстояние, но если вам нужно только относительное расстояние, вы можете пропустить квадратный корень. Возможно, вам захочется узнать, какой спрайт ближе или ближе, или просто если любые спрайты находятся в радиусе. В этих случаях просто сравните квадрат расстояния.

- (float)getDistanceSquared:(CGPoint)p1 and:(CGPoint)p2 {
    return pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2);
}

Чтобы использовать это для вычисления, если любые спрайты находятся в радиусе от центра представления в обновлении: метод подкласса SKScene:

-(void)update:(CFTimeInterval)currentTime {
    CGFloat radiusSquared = pow (self.closeDistance, 2);
    CGPoint center = self.view.center;
    for (SKNode *node in self.children) {
        if (radiusSquared > [self getDistanceSquared:center and:node.position]) {
            // This node is close to the center.
        };
    }
}

Ответ 3

Еще один быстрый метод, так как мы имеем дело с расстоянием, я добавил abs(), чтобы результат всегда был положительным.

extension CGPoint {
    func distance(point: CGPoint) -> CGFloat {
        return abs(CGFloat(hypotf(Float(point.x - x), Float(point.y - y))))
    }
}

Не скоро ли грандиозно?

Ответ 4

Swift:

extension CGPoint {

    /**
    Calculates a distance to the given point.

    :param: point - the point to calculate a distance to

    :returns: distance between current and the given points
    */
    func distance(point: CGPoint) -> CGFloat {
        let dx = self.x - point.x
        let dy = self.y - point.y
        return sqrt(dx * dx + dy * dy);
    }
}

Ответ 5

Теорема Пифагора:

- (float)getDistanceBetween:(CGPoint)p1 and:(CGPoint)p2 {
    return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}