Как расширить линейный сегмент в ARKit 2 / SceneView - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть две точки в пространстве, и я хочу третью точку, которая является расширением первых двух точек на некоторый множитель - расширение отрезка.Как бы я это сделал в Swift4 - как бы получить x2, y2, z2 ниже?

    distanceMultiplier: Float   = 1.2

    var segmentStart = simd_float3.init()

    segmentStart.x = X0
    segmentStart.y = Y0
    segmentStart.z = Z0

    var segmentEnd1 = simd_float3.init()

    segmentEnd1.x = X1
    segmentEnd1.y = Y1
    segmentEnd1.z = Z1

    var segmentEnd2 = simd_float3.init()


    //segmentEnd1.x2 = foo
    //segmentEnd1.y2 = foobar
    //segmentEnd1.z2 = barfoo

1 Ответ

0 голосов
/ 25 сентября 2018

Во-первых, это просто выбор стиля, но вам не нужно писать все от руки.Например, typename.init() всегда может быть сокращено до typename().И все типы SIMD работают без префикса simd_ в Swift.Векторные типы также имеют поэлементные инициализаторы:

let segmentStart = float3(x0, y0, z0)

В любом случае, реальный вопрос здесь - просто базовая математика.Вектор, который описывает (длину) отрезка линии между двумя точками, представляет собой разность двух точек:

let segmentLength = segmentEnd1 - segmentStart

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

assert(segmentEnd1 == segmentStart + segmentLength)

Если вы хотите расширить сегмент, вам нужно представление origin + length.

let segmentLength2 = segmentLength * multiplier

Как только вы это сделаете, вы можете преобразовать обратно в представление начальной / конечной точки:

let segmentEnd2 = segmentStart + segmentLength2

Это довольно легко увидеть, как показано на рисунке (здесь в 2D, но математика одна и та же, независимо от того, сколько у вас измерений):

enter image description here

...