У меня есть две сферы, которые пересекаются, и я пытаюсь найти точку пересечения, ближайшую в направлении точки (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)
или что-то подобное.