球体与3D线段之间交点的具体位置

时间:2015-09-14 18:03:14

标签: 3d computational-geometry

我知道交叉点是否已经回答的问题,但我一直无法找到。

我的分类如下。

Circle (alpha, beta, gamma) with radius r
Points at (a,b,c) and (d,e,f)

m = (e-b)/(d-a) slope of xy
n = (f-c)/(d-a) slope of xz

y = m(x-a) + b
z = m(x-a) + c

Combine equation of sphere and line

(x-alpha)^2 + (m(x-a) + b - beta)^2 + (n(x-a) + c - gamma)^2 = r^2

after algebra

(1+m^2+n^2)x^2 + (-2*alpha + 2*m*(-m*a + b - beta) + 2*n*(-n*a + c - gamma))x + (alpha^2 + (-m*a + b - beta)^2 + (-n*a + c - gamma)^2 - r^2) = 0

然后我尝试在二次公式中使用上面的内容,但是使用2,3,1的半径为2的圆圈和0,0,04,4,4的一行我得到x值25.3510.65似乎不对。

任何有关弄清楚我在这里做错了什么的帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

不失一般性,球体的中心是原点(如果不是,则从所有点中减去中心坐标)。

球体的隐式方程是

X² + Y² + Z² = R².

线段的参数方程:

X = X0 + t X01, Y = Y0 + t Y01, Z = Z0 + t Z01.

将第二个等式插入第一个等式,

(X01² + Y01² + Z01²) t² + 2 (X01.X0 + Y01.Y0 + Z01.Z0) t + X0² + Y0² + Z0² - R² = 0

这是您为t求解的标准二次方程式。

两个根定义了球体内部的间隔,它足以与[0, 1]相交以了解线段的有用部分。

答案 1 :(得分:0)

你在寻找距球或球的距离吗?球体是球的表面。在球体情况下,如果整个球体在球体内部,则距离大于0。

足以计算终点(D1,D2)到球心(C)的距离,并找到最接近球心(X)的线上(非线段)。有了这个:

在球赛中:

if X is on segment:
  return max(0, dist(X,C)-R)
return max(0, min(D1, D2)-R)

在球形案例中:

if X is on segment:
  if dist(X,C) < R:        # Nearest point is inside sphere
    if max(D1, D2) >= R:   # One of points is out
      return 0             # Than segment intersects sphere
    return R - max(D1, D2) # Whole segment is inside sphere, end point is nearest (because of ball convexity)
  return R - dist(X,C)     # Whole segment is out
if D1 < R and D2 < R:      # Whole segment is in
  return R - max(D1, D2)
if D1 >= R and D2 >= R:    # Whole segment is out
  return R - min(D1, D2)
return 0                   # Segment intersects sphere