Как найти точку на линии между двумя другими точками?

Общие вопросы о Unity3D

Как найти точку на линии между двумя другими точками?

Сообщение Magnitofon 29 сен 2017, 15:04

Ну что, вы поможете, или придется обращаться на форум по алгебре и геометрии? (popcorn)

По середине дороги есть вейпоинты и машина движется по ним. Если машина вылетела с трассы, нужно вернуть ее на дорогу, а именно на линию между двумя последними вейпоинтами, между которыми произошла авария. Позиция вейпоинтов известна, позиция точки, где машина улетела с трассы- тоже, она будет сбоку от линии между вейпоинтами и дорогой, валяться в кювете. Теперь надо вычислить новую точку, которая была бы ближайшей к месту, где в обочине валяется машина, но была бы строго на прямой линии между вейпоинтами на автодороге.
Нарисовал схемку, Точка 1 и Точка 2- вейпоинты на дороге, сбоку Точка 3 - валяющаяся в кустах машина, надо вычислить позицию точки на линии между вейпоинтами (там где куча знаков вопроса):

Изображение
Magnitofon
UNIт
 
Сообщения: 63
Зарегистрирован: 10 сен 2013, 16:50

Re: Как найти точку на линии между двумя другими точками?

Сообщение HacKeR 29 сен 2017, 15:48

Ой долго я с этим парился
Держи, v1 и v2 - точки отрезка, v3 - вектор, от которой нужно находить точку на отрезке (в твоем случае позиция машины):
Синтаксис:
Используется csharp
public Vector3 Ortho(Vector3 v1, Vector3 v2, Vector3 v3)
    {
        // Длины отрезков.
        var c = Math.Sqrt(Math.Pow(v1.x - v2.x, 2) + Math.Pow(v1.y - v2.y, 2) + Math.Pow(v1.z - v2.z, 2));
        var b = Math.Sqrt(Math.Pow(v2.x - v3.x, 2) + Math.Pow(v2.y - v3.y, 2) + Math.Pow(v2.z - v3.z, 2));
        var a = Math.Sqrt(Math.Pow(v3.x - v1.x, 2) + Math.Pow(v3.y - v1.y, 2) + Math.Pow(v3.z - v1.z, 2));

        // Полупериметр треугольника.
        var p = (a + b + c) / 2;
        // Высота (длина перпендикуляра).
        var h = 2 * Math.Sqrt(p * (p - a) * (p - b) * (p - c)) / c;

        float x, y, z = 0;

        if (a / c > b / c)
        {
            var c1 = Math.Sqrt(a * a - h * h);
            float k = (float)c1 / (float)c;
            x = v1.x + (float)k * (v2.x - v1.x);
            y = v1.y + k * (v2.y - v1.y);
            z = v1.z + k * (v2.z - v1.z);
        }
        else
        {
            var c2 = Math.Sqrt(b * b - h * h);
            float k = (float)c2 / (float)c;
            x = v2.x + k * (v1.x - v2.x);
            y = v2.y + k * (v1.y - v2.y);
            z = v2.z + k * (v1.z - v2.z);
        }

        return new Vector3(x, y, z);
    }
HacKeR
UNIверсал
 
Сообщения: 360
Зарегистрирован: 12 ноя 2010, 21:14

Re: Как найти точку на линии между двумя другими точками?

Сообщение waruiyume 29 сен 2017, 16:50

Синтаксис:
Используется csharp
private Vector3 GetProjected(Vector3 s, Vector3 f, Vector3 c)
    {
        Vector3 startToFinish = f - s;
        Vector3 prj = Vector3.Project(c-s, startToFinish);
        return prj + s;
    }
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как найти точку на линии между двумя другими точками?

Сообщение Magnitofon 30 сен 2017, 19:05

Спасибо вам, ребята! Не думал, что помогут целых два человека и будет два решения вопроса. Выбрал второй вариант, он короткий, но сразу заработал!
waruiyume писал(а):
Синтаксис:
Используется csharp
private Vector3 GetProjected(Vector3 s, Vector3 f, Vector3 c)
    {
        Vector3 startToFinish = f - s;
        Vector3 prj = Vector3.Project(c-s, startToFinish);
        return prj + s;
    }
 
Magnitofon
UNIт
 
Сообщения: 63
Зарегистрирован: 10 сен 2013, 16:50


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18