三维点沿指定向量方向入射出射长方体,得到入射点出射点

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 \) 中挑最小的原因。这确保了始终选择合理的两个界面,进而真正找到线段在长方体内的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值