You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:55:25