Выразите строку как функцию t
:
{ x(t) = x0*(1-t) + t*x1
{ y(t) = y0*(1-t) + t*y1
{ z(t) = z0*(1-t) + t*z1
Когда t = 0
, это будет в одной конечной точке (x0,y0,z0)
. Когда t = 1
, это будет в другой конечной точке (x1,y1,z1)
.
Напишите формулу для расстояния до центра сферы (в квадрате) в t
(где (xc,yc,zc)
- центр сферы):
f(t) = (x(t) - xc)^2 + (y(t) - yc)^2 + (z(t) - zc)^2
Решите для t
, когда f(t)
равно R^2
(R
- радиус сферы):
(x(t) - xc)^2 + (y(t) - yc)^2 + (z(t) - zc)^2 = R^2
A = (x0-xc)^2 + (y0-yc)^2 + (z0-zc)^2 - R^2
B = (x1-xc)^2 + (y1-yc)^2 + (z1-zc)^2 - A - C - R^2
C = (x0-x1)^2 + (y0-y1)^2 + (z0-z1)^2
Решить A + B*t + C*t^2 = 0
для t
. Это нормальное квадратное уравнение .
Вы можете получить до двух решений. Любое решение, где t
лежит между 0 и 1. Действительны.
Если вы получили правильное решение для t
, включите его в первые уравнения, чтобы получить точку пересечения.
Я предположил, что вы имели в виду отрезок (две конечные точки). Если вместо этого вам нужна полная линия (бесконечной длины), вы можете выбрать две точки вдоль линии (не слишком близко) и использовать их. Также позвольте t
быть любым действительным значением, не только между 0 и 1.
Редактировать: Я исправил формулу для B
. Я перепутал знаки. Спасибо, М. Кац, за упоминание, что это не сработало.