Проблема с 2D трилатерацией

Я читал Trilateration на ее странице в Википедии и попытался сделать моя собственная 2D-версия. Однако я столкнулся с некоторыми проблемами, с которыми я надеялся, что кто-то, разбирающийся в математике, сможет мне помочь.

Я делаю это в Unity с C #.

Моя сцена состоит из 3 сфер в центре экрана. Сфера 1 всегда находится на отметке 0,0,0. Рядом с этими сферами у меня есть куб, для которого я хочу переместиться в точку пересечения трех сфер.

Вот мой код:

public GameObject sphere1, sphere2, sphere3;
float x, y;
float P1, P2, P3;
public GameObject cube;

// Update is called once per frame
void Update () 
{
    P1 = ( sphere1.transform.position.x * sphere1.transform.position.x) + ( sphere1.transform.position.y * sphere1.transform.position.y);

    P2 = ((sphere1.transform.position.x - sphere2.transform.position.x) *(sphere1.transform.position.x - sphere2.transform.position.x)) + sphere1.transform.position.y;

    P3 = ((sphere1.transform.position.x - sphere3.transform.position.x) *(sphere1.transform.position.x - sphere3.transform.position.x)) + 
        ((sphere1.transform.position.y - sphere3.transform.position.y) *(sphere1.transform.position.y - sphere3.transform.position.y));

    x = (P1 * P1) - (P2 * P2);
    y = ((P1 * P1) - (P3 * P3)) + (sphere3.transform.position.x * sphere3.transform.position.x) + ((sphere3.transform.position.y * sphere3.transform.position.y) / 2 * sphere3.transform.position.y);

    cube.transform.position = new Vector3(x, y, 0);

}

P1, P2 и P3 - это моя интерпретация следующих математических формул с вики-страницы:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

И мои формулы X и Y следуют этим:

введите описание изображения здесь

введите описание изображения здесь

Когда я подключаю все это, я получаю следующие журналы отладки:

P1: 0
P2: 0.0989904
P3: 0.4478847
X is: -0.0097991Y is: 0.247284 // X and Y of cube

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

Правильно ли я настроил триангуляцию? Я что-то упускаю?


person N0xus    schedule 28.03.2014    source источник
comment
Является ли куб корнем сцены или дочерним элементом чего-то?   -  person McAden    schedule 28.03.2014
comment
Это потому, что ваша P2 формула содержит y термин, а не y^2? У вас + sphere1.transform.position.y, а не + (sphere1.transform.position.y * sphere1.transform.position.y).   -  person Jim Mischel    schedule 28.03.2014
comment
Кроме того, я думаю, что ваша формула для x должна быть (P1 - P2 + d^2)/2d. Вы используете (P1^2 - P2^2), что кажется совершенно неправильным, учитывая обозначение.   -  person Jim Mischel    schedule 28.03.2014
comment
Спасибо за сообщения, я займусь вопросами X и Y. Куб находится в корне сцены. Не ребенок ничего.   -  person N0xus    schedule 29.03.2014
comment
Я думаю, он спрашивает что-то вроде этого .... stackoverflow.com/questions/53203162/ < / а>   -  person zyonneo    schedule 09.11.2018


Ответы (2)


Вы не поняли формулу вики. Первый набор уравнений используется для вывода второго набора уравнений, который вы показали здесь из него, а не для получения значений r1, r2 и r3, а затем помещает их в второй набор уравнений, как и вы.

Вы неправильно вычисляете r1, r2 и r3. Согласно вашему коду r1 всегда равно 0, тогда как он должен быть равен радиусу сферы 1, а не сумме квадратов ее координат. То же самое касается r2 - радиуса сферы 2 и r3 - радиуса сферы 3.

Кроме того, согласно Wiki, центр сферы 1 всегда (0,0,0), а центр сферы 2 лежит где-то на оси x - координаты равны (d, 0,0), где d - некоторое значение. Итак, ваш код должен выглядеть примерно так:

public GameObject sphere1, sphere2, sphere3;
float x, y;
float r1, r2, r3;
public GameObject cube;

void Update () 
{
    r1 = sphere1.transform.localscale.x * sphere1.GetComponent<SphereCollider>().radius;

    r2 = sphere2.transform.localscale.x * sphere2.GetComponent<SphereCollider>().radius;

    r3 = sphere3.transform.localscale.x * sphere3.GetComponent<SphereCollider>().radius;

    x = (r1 * r1 - r2 * r2 + sphere2.transform.position.x * sphere2.transform.position.x)/(2*sphere2.transform.position.x);
    y = ((r1 * r1 - r3 * r3 + sphere3.transform.position.x * sphere3.transform.position.x + sphere3.transform.position.y * sphere3.transform.position.y) /( 2 * sphere3.transform.position.y)) - (x * sphere3.transform.position.x)/sphere3.transform.position.y;

    cube.transform.position = new Vector3(x, y, 0);

}
person Adiya Aitpayeva    schedule 24.02.2015

На последнем этапе вы должны вычислить результирующие координаты, добавив векторы ex * x и ey * y к вашей точке p1.

result = p1 + e*ex + y*ey;
person padawan    schedule 26.05.2014