Python3.9实现3D空间7次非重复镜像反射坐标计算方案咨询
3D矩形空间7次镜像反射坐标计算实现(禁止连续重复反射函数)
需求说明
- 使用Python 3.9实现
- 基于现有6个镜像反射函数(mirror1~mirror6),执行7次反射操作
- 禁止连续使用同一个反射函数
- 计算3D矩形房间内任意目标点,经过6面墙(含天花板、地板)反射7次后的镜像坐标
现有反射函数说明
以下是给定的基础代码,每个函数对应房间某一面墙的反射逻辑:
import numpy as np # 房间尺寸 xwide = 20 # x轴方向宽度(x∈[0,20]) ywide = 15 # y轴方向宽度(y∈[0,15]) zwide = 5 # z轴方向宽度(z∈[0,5]) # 目标点初始坐标 target = np.array([2, 2, 2]) # 原点所在墙面的反射变换矩阵 # x=0墙面(yz平面)的x方向反射矩阵 yzmirror = np.array([[-1, 0, 0], [0, 1, 0], [0, 0, 1]]) # y=0墙面(xz平面)的y方向反射矩阵 xzmirror = np.array([[1, 0, 0], [0, -1, 0], [0, 0, 1]]) # z=0墙面(xy平面)的z方向反射矩阵 xymirror = np.array([[1, 0, 0], [0, 1, 0], [0, 0, -1]]) # 墙面法向量(指向房间外侧) xn = np.array([-1, 0, 0]) # x=xwide墙面的法向量 yn = np.array([0, -1, 0]) # y=ywide墙面的法向量 zn = np.array([0, 0, -1]) # z=zwide墙面的法向量 # 6个反射函数:对应6面墙的反射计算 def mirror1(a): # x=0墙面的x方向反射 return np.dot(a, yzmirror) def mirror2(a): # y=0墙面的y方向反射 return np.dot(a, xzmirror) def mirror3(a): # z=0墙面的z方向反射 return np.dot(a, xymirror) def mirror4(a): # x=xwide墙面的x方向反射 return a - (2 * (np.dot(a, xn) + xwide)) * xn def mirror5(a): # y=ywide墙面的y方向反射 return a - (2 * (np.dot(a, yn) + ywide)) * yn def mirror6(a): # z=zwide墙面的z方向反射 return a - (2 * (np.dot(a, zn) + zwide)) * zn
完整实现方案
1. 生成合法反射序列
生成长度为7的反射函数序列,确保相邻两个函数不重复,可通过随机选择实现:
import random def generate_valid_sequence(length=7): # 将6个反射函数存入列表,方便索引调用 mirrors = [mirror1, mirror2, mirror3, mirror4, mirror5, mirror6] sequence = [] prev_idx = -1 # 记录上一次选择的函数索引,初始无前置 for _ in range(length): # 可选函数索引:排除上一次的索引 available_idx = [i for i in range(6) if i != prev_idx] current_idx = random.choice(available_idx) sequence.append(mirrors[current_idx]) prev_idx = current_idx return sequence
2. 执行反射计算
遍历合法序列,依次对目标点执行反射操作:
def calculate_mirrored_coordinate(initial_point, sequence): current_point = initial_point.copy() for idx, mirror_func in enumerate(sequence, 1): current_point = mirror_func(current_point) print(f"第{idx}次反射后坐标:{current_point}") return current_point # 生成合法序列 reflection_sequence = generate_valid_sequence() # 执行计算 final_mirrored_point = calculate_mirrored_coordinate(target, reflection_sequence) print("\n最终镜像坐标:", final_mirrored_point)
3. 固定序列计算(可选)
若需要指定具体反射顺序,可直接构造合法序列:
# 示例:手动指定合法序列(mirror1→mirror2→mirror3→mirror4→mirror5→mirror6→mirror1) fixed_sequence = [mirror1, mirror2, mirror3, mirror4, mirror5, mirror6, mirror1] final_point_fixed = calculate_mirrored_coordinate(target, fixed_sequence)
说明
- 随机序列每次运行会生成不同的合法反射顺序,需稳定结果可使用固定序列
- 所有反射基于numpy数组操作,保证3D坐标向量运算效率
- 每个反射函数严格对应房间6个墙面的物理反射逻辑
内容的提问来源于stack exchange,提问作者LumoLumo
相关产品推荐
相关产品推荐

