Сфера-Сфера Пересечение - PullRequest
0 голосов
/ 17 марта 2020

У меня есть две сферы, которые пересекаются, и я пытаюсь найти точку пересечения, ближайшую в направлении точки (0,0,1)

Центр моей первой сферы (c1) находится в (c1x = 0, c1y = 0, c1z = 0) и имеет радиус r1 = 2.0

Центр моей второй сферы (c2) находится в (c2x = 2, c2y = 0, c2z = 0) и имеет радиус r2 = 2,0

Я следовал логике c на этот идентичный вопрос для части "Типичные пересечения", но у меня возникли некоторые проблемы с пониманием, и это было надеясь, что кто-нибудь сможет мне помочь.

Сначала я нахожу центр пересечения c_i и радиус пересекающейся окружности r_i:

Здесь первая сфера имеет центр c_1 и радиус r_1, вторые c_2 и r_2, а их пересечение имеет центр c_i и радиус r_i. Пусть d = || c_2 - c_1 ||, расстояние между сферами.

Итак, сфера1 имеет центр c_1 = (0,0,0) с r_1 = 2. Сфера2 имеет c_2 = (2 , 0,0) с r_2 = 2,0.

d = || c_2 - c_1 || = 2

h = 1/2 + (r_1 ^ 2 - r_2 ^ 2) / (2 * d ^ 2)

Так что теперь я решаю функцию ч, как это так и получить 0,5:

ч = 0,5 + (2 ^ 2 - 2 ^ 2) / (2 * 2 ^ 2)

ч = 0,5 + (0) / (8)

h = 0,5

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

c_i = c_1 + h * (c_2 - c_1)

(это уравнение было моим первоначальным вопросом, но комментарий к этому сообщению помог мне понять, как решить его для каждого x, y, z)

c_i_x = c_1_x + h * (c_2_x - c_1_x)

c_i_x = 0 + 0.5 * (2 - 0) = 0.5 * 2

1 = c_i_x

c_i_y = c_1_y + h * (c_2_y - c_1_y)

c_i_y = 0 + 0.5 * (0- 0)

0 = c_i_y

c_i_z = c_1_z + h * (c_2_z - c_1_z)

c_i_z = 0 + 0.5 * (0 - 0)

0 = c_i_z

c_i = (c_i_x, c_i_z, c_i_z) = (1, 0, 0)

Затем, изменив одно из наших ранних пифагорейских отношений, мы найдем r_i:

r_i = sqrt (r_1 * r_1 - h h d * d)

r_i = sqrt (4 - .5 * .5 * 2 * 2)

r_i = sqrt (4 - 1)

r_i = sqrt (3)

r_i = 1.73205081

Итак, если мои расчеты верны, я знаю, что круг, где пересекаются две мои сферы, центрирован в (1, 0, 0) и имеет радиус 1.73205081

Я чувствую некоторую уверенность во всех вышеперечисленных вычислениях, шаги имеют смысл, пока я не допустил математических ошибок. Я знаю, что становлюсь ближе, но мое понимание начинает ослабевать, начиная с этого момента. Моя конечная цель - найти точку пересечения, ближайшую к (0,0,1), и у меня есть круг пересечения, поэтому я думаю, что мне нужно сделать, это найти точку на том круге, которая ближе всего к (0,0 , 1) верно?

Следующий шаг из этого решения говорит:

Итак, теперь у нас есть центр и радиус нашего пересечения. Теперь мы можем вращать это вокруг разделяющей оси, чтобы получить наш полный круг решений. Круг лежит в плоскости, перпендикулярной разделительной оси, поэтому мы можем принять n_i = (c_2 - c_1) / d как нормаль этой плоскости.

Таким образом, нахождение нормали плоскости включает в себя 1102 *, мне нужно сделать что-то похожее, чтобы снова найти n_i для x, y и z?

n_i_x = (c_2_x - c_1_x)/d = (2-0)/2 = 2/2 = 1

n_i_y = (c_2_y - c_1_y)/d = (0-0)/2 = 0/2 = 0

n_i_z = (c_2_z - c_1_z)/d = (0-0)/2 = 0/2 = 0

Выбрав тангенс и битангенс t_i и b_i перпендикулярно этому нормальному и друг другу, вы можете написать любую точку на этом круге как: p_i(theta) = c_i + r_i * (t_i * cos(theta) + b_i sin(theta));

Могу ли я выбрать t_i и b_i из точки, к которой я хочу быть ближе всего? (0,0,1)

Из-за теоремы о волосатых шариках не существует единого универсального способа выбора касательной / битангенса для использования. Я бы рекомендовал выбрать одну из координатных осей, не параллельных n_i, и установить t_i = normalize(cross(axis, n_i)), b_i = cross(t_i, n_i) или что-то подобное.

1 Ответ

0 голосов
/ 17 марта 2020
 c_i = c_1 + h * (c_2 - c_1)

Это выражение vector , вы должны написать подобное для каждого компонента, подобного этому:

 c_i.x = c_1.x + h * (c_2.x - c_1.x)
 and similar for y and z

В результате вы получите координаты центра круга:

c_i = (1, 0, 0)

Как говорит ваш цитат, выберите ось, не параллельную n vect0r - например, ось y, получите вектор направления Y_dir=(0,1,0) и умножьте на n

 t = Y_dir x n = (0, 0, 1)
 b = n x t = (0, 1, 0) 

Теперь у вас есть два вектора t,b в круговой плоскости для построения точек окружности.

...