将直线表示为函数t
:
{ x(t) = x0*(1-t) + t*x1
{ y(t) = y0*(1-t) + t*y1
{ z(t) = z0*(1-t) + t*z1
When t = 0
,它将在一个终点(x0,y0,z0)
. When t = 1
,它将在另一个端点(x1,y1,z1)
.
写出到球心的距离(平方)的公式t
(where (xc,yc,zc)
是球体的中心):
f(t) = (x(t) - xc)^2 + (y(t) - yc)^2 + (z(t) - zc)^2
求解t
when f(t)
equals 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
Solve A + B*t + C*t^2 = 0
for t
。这是正常现象二次方程 http://en.wikipedia.org/wiki/Quadratic_equation.
您最多可以获得两个解决方案。任何解决方案t
0 和 1 之间的值是有效的。
如果您有有效的解决方案t
,将其代入第一个方程以获得交点。
我假设你的意思是一条线段(两个端点)。如果您想要一条完整的线(无限长度),那么您可以沿线选取两个点(不要太近),然后使用它们。也让t
可以是任何实际值,而不仅仅是 0 和 1 之间的值。
Edit:我修正了公式B
。我混淆了这些标志。感谢 M Katz 提到它不起作用。