нахождение единой точки пересечения между двумя сферами - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над проблемой C ++, где я пытаюсь сделать забавную функцию полезной c (), которая принимает в качестве входных данных две начальные точки отрезков в трехмерном пространстве [(x, y, z) и радиус r] , Если сегменты можно ориентировать так, чтобы они заканчивались в одной и той же точке, функция должна вернуть значение true и распечатать эту точку. Если существует несколько ориентаций, которые создают общую конечную точку, функция должна выбрать ту, которая наиболее удалена в направлении, указанном в hint_direction.

Функция получает следующие значения:

bool func(
point3d position_0,               // origin of first line segment.
float length_0,                   // length of first line segment.
point3d position_1,               // origin of second line segment.
float length_1,                   // length of second line segment.
vector3d hint_direction,          // in the event there are multiple solutions, return the one furthest in this direction.
point3d *out_common_end_position) // if result is true, point where both line segments can be oriented to end. otherwise uninitialized.

I работаю над одним из первых крайних случаев; где есть одна точка пересечения, такая как на изображении ниже.

(ссылка на изображение = https://i.stack.imgur.com/dh9Vr.png)

Мой код правильно идентифицирует этот крайний случай, но я не уверен, как программно найти эту точку пересечения.

//calling function with example from image above, cords, radius, and hint
bool result = func({1, 1, 0}, 1.0, {3, 1, 0}, 1.0, {0, 0, 1}, &common_end_position);

bool func(point3d position_0, float length_0, point3d position_1, float length_1,vector3d hint_direction,point3d *out_common_end_position){

    //if statement detecting single intersection
    if(length_0 + length_1 == d){
        printf("intersection at a single point\n");
        //find single intersection point (?)
    }

В Интернете я следовал некоторым руководствам, в которых рассказывается, как это сделать, например: https://gamedev.stackexchange.com/questions/75756/sphere-sphere-intersection-and-circle-sphere-intersection, в которых говорится: «Если r_1 + r_2 == d, то пересечение единственная точка, расположенная на расстоянии r_1 на линии от c_1 до c_2, или: c_i = c_1 + (c_2 - c_1) * r_1 / d "

Прошло много времени с тех пор, как я сделал геометрию вот так, если я хочу найти единственную точку пересечения, как мне это сделать с помощью приведенного выше уравнения "c_i = c_1 + (c_2 - c_1) * r_1 / d"? Я понимаю, что c_2 - c_1 - это расстояние между обоими центрами, которое я вычислил ранее в своей программе как float d, но я уверен, что означает «c_1 +», поскольку c_1 относится ко всему набору шнуров (x, y , z).

В целом, я пытаюсь найти способ получить одну точку пересечения, например, такую ​​как на моем изображении, может кто-нибудь помочь им понять связанное решение выше? Я собираюсь продолжить исследования решений в то же время. Спасибо.

1 Ответ

1 голос
/ 17 марта 2020

Я понимаю, что c_2 - c_1 - это расстояние между обоими центрами

Неправильно. c_2 - c_1 - это вектор (в геометрическом смысле, а не в смысле c ++), который описывает направление от c_1 до c_2 и имеет величину d. Следовательно, (c_2 - c_1)/d - это единичный вектор, который описывает направление от c_1 до c_2.

(c_2 - c_1)/d * r_1, следовательно, является точкой на линии между c_1 и c_2, то есть расстоянием r_1 от c_1, или от точки пересечения окружностей.

но я уверен, что подразумевается под "c_1 +", так как c_1 относится ко всему набору шнуров (x, y , z).

c_1 - это не весь набор точек на окружности. c_1 является центром круга 1.

Также имейте в виду, что вы имеете дело с поплавками. Таким образом, он подвержен ошибкам с плавающей запятой . Поиск точного равенства в таких случаях может привести к ошибке. Учтите, что если посмотреть, находится ли d в пределах допустимой погрешности, равной r1 + r2, то может быть более уместным

((r1 + r2 - e) <= d && d <= (r1 + r2 + e)) 

вместо

d == r1 + r2
...