import numpy as np
def calculate_intersection_points(cuboid_size, point, direction):
point = np.array(point, dtype=float)
direction = np.array(direction, dtype=float)
cuboid_size = np.array(cuboid_size, dtype=float)
t_min = []
t_max = []
# 遍历每个维度 x, y, z
#对于每一个方向的分量,算出它到三个最大面的时间,取最小值,就是最先碰到的面;算出农户它到三个最小面的时间,
for i in range(3):
if direction[i] != 0:
t1 = -point[i] / direction[i]
print('t1',t1)
t2 = (cuboid_size[i] - 1 - point[i]) / direction[i]
print('t2:',t2)
t_values = [t1, t2]
t_min.append(min(t_values))
t_max.append(max(t_values))
print(t_max)
print(t_min)
# 选择最大的 t_min 和最小的 t_max
largest_t_min = max(t_min)
smallest_t_max = min(t_max)
print(largest_t_min,smallest_t_max)
# 计算出两个交点
intersection1 = point + largest_t_min * direction
intersection2 = point + smallest_t_max * direction
# 两个交点之间的距离
length = np.linalg.norm(intersection2 - intersection1)
return intersection1, intersection2, length
# 示例调用
cuboid_size = (512, 512, 425)
point = (200, 100, 212)
# 示例1
direction1 = [0.33708, -0.94147, 0]
#intersection1_1, intersection1_2, length1 = calculate_intersection_points(cuboid_size, point, direction1)
#
# 示例2
# direction2 = [1, 1, 0]
# intersection2_1, intersection2_2, length2 = calculate_intersection_points(cuboid_size, point, direction2)
#
direction3 = [200, 512, 425]
intersection3_1, intersection3_2, length3 = calculate_intersection_points(cuboid_size, point, direction3)
#print("Example 1 - Intersection Points:", intersection1_1, intersection1_2, "Length:", length1)
# print("Example 2 - Intersection Points:", intersection2_1, intersection2_2, "Length:", length2)
print("Example 3 - Intersection Points:", intersection3_1, intersection3_2, "Length:", length3)
### 直观解释
1. **理解 \( t \) 的几何意义**:
- \( t \) 值表示沿着直线移动的距离比例。
- 当 \( t = 0 \) 时,表示在起始点。
- 当 \( t > 0 \) 时,表示在沿着方向向量正方向。
- 当 \( t < 0 \) 时,表示在沿着方向向量反方向。
2. **多维度下的直线与平面的交点**:
- 假设你有一个长方体和一条穿过它的直线,直线会在每个轴(x, y, z)上与长方体的边相交。
- 对于每个轴,你有两个面:例如,x轴有 x=0 和 x=x_max,y轴有 y=0 和 y=y_max。通过求解直线方程相对这些面,得到交点的 \( t \) 值。
3. **最小的 \( t \) 表达初次出界**:
- 对于每个轴最小的 \( t \),说明是沿那个轴所到达的最早的边界。选择最大 \( t_{\text{min}} \) 就是选择所有轴中最后进入长方体的某一个面。
4. **最大的 \( t \) 表达最后出界**:
- 对于每个轴最大的 \( t \),说明最终离开长方体的边界。选择最小 \( t_{\text{max}} \) 意味着这条直线即将离开的第一个面。
### 形象化解释
想象你正在穿过一个隧道(长方体):
- **开始进入**(初次出界):你可能沿 x、y、z 方向进入长方体。在这些方向中,最后真正进入长方体的时刻决定了你真正进入的初始点,这确保你不是误入某个别的未封闭区域。
- **准备离开**(最后出界):在长方体内,你朝着不同方向前进。无论在 x、y、z 方向,最早离开长方体的时刻决定你真正离开的终点。这个最早的时刻,就避免了穿过有些边界未到达另一边界的可能性。
总结,相当于我们从多个候选的入点和出点中,选择最晚入点和最早出点,以确保直线在长方体内的所有可能交界处之间计算。这也就是为什么要在所有最小 \( t \) 中挑最大,以及最大 \( t \) 中挑最小的原因。这确保了始终选择合理的两个界面,进而真正找到线段在长方体内的长度。