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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产 HDMI 发送芯片,兼容 HDMI1.4b 及 HDMI 1.4b 下的视频 3D 传输格式。

最高分辨率高达 4K30Hz&#xff0c;最高采样率达到 300MHz.支持 YUV 和 RGB 之间的色彩空间转 换&#xff0c;数字接口支持 YUV 以及 RGB 格式输入的 IIS 接口以及 S/PDIF 接口支持高清音频的 传输&#xff0c;其中 S/PDIF 接口既可以兼容IEC61937 标准下的压缩音频传输&#x…

图像增强——传统算法伽马校正实现暗光增强(附Python代码)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《图像增强》 &a…

OpenSearch迁移方案

一、背景 因业务需要迁移Opensearch 集群&#xff0c;当前集群数据量高达21TB&#xff0c;采用常规工具进行迁移估计不可取&#xff0c;需要使用对象存储做中转&#xff0c;进行OpenSearch数据迁移。 二、OpenSearch迁移方案 前期进行OpenSearch数据迁移调研 序号方案诠释备…

java项目之科研工作量管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的科研工作量管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 科研工作…

介绍Java

Java简介 Java是一门由Sun公司&#xff08;现被Oracle收购&#xff09;在1995年开发的计算机编程语言&#xff0c;其主力开发人员是James Gosling&#xff0c;被称为Java之父。Java在被命名为“Java”之前&#xff0c;实际上叫做Oak&#xff0c;这个名字源于James Gosling望向…

Basic Pentesting_ 2靶机渗透

项目地址 plain https://download.vulnhub.com/basicpentesting/basic_pentesting_2.tar.gz 修改静态ip 开机按e 输入rw signie init/bin/bash ctrlx 进入编辑这个文件 vi /etc/network/interfaces修改网卡为ens33 保存退出 实验过程 开启靶机虚拟机 ![](https://img-bl…

paimon,基础查询语句测试

基础设置 -- 创建catalog/加载catalog&#xff0c;如果这个catalog已经存在就不会创建&#xff0c;自动加载元数据信息CREATE CATALOG fs_paimon_catalog WITH ( type paimon, warehouse hdfs://wsl01:8020/paimon/catalog ); -- 使用catalog use catalog fs_paimon_catalog…

Java中二维数组-杨辉三角

使用二维数组打印一个10行杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1&#xff09;第一行有1个元素&#xff0c;第n行有n个元素 2&#xff09;每一行的第一个元素和最后一个元素都是1 3&#xff09;从第三行开始&#xff0c;对于非第一个元素和最后一个元素的元素…

差分注意力,负注意力的引入

文章目录 Differential Transformer差分注意力&#xff0c;负注意力的引入相关链接介绍初始化函数多头差分注意力 Differential Transformer差分注意力&#xff0c;负注意力的引入 相关链接 ai-algorithms/README.md at main Jaykef/ai-algorithms (github.com) unilm/Diff…

response和验证码、文件下载操作

目录 Response对象 案例&#xff1a; 1、完成重定向 2、服务器输出字符输出流到浏览器 3、服务器输出字节输出流到浏览器 4、验证码 ServletContext对象 Response对象 功能&#xff1a;设置响应消息 1、设置响应行 格式&#xff1a;HTTP/1.1 200 ok 设置状态码 se…

RabbitMQ 高级特性——死信队列

文章目录 前言死信队列什么是死信常见面试题死信队列的概念&#xff1a;死信的来源&#xff08;造成死信的原因有哪些&#xff09;死信队列的应用场景 前言 前面我们学习了为消息和队列设置 TTL 过期时间&#xff0c;这样可以保证消息的积压&#xff0c;那么对于这些过期了的消…

【更新】上市公司企业机构投资者实地调研数据(2013-2023年)

一、测算方式&#xff1a; 参考《会计研究》逯东&#xff08;2019&#xff09;老师的做法&#xff0c;考虑投资者实地调研的频率和可能性&#xff0c;设立了下述变量来衡量上市公司接待投资者调研情况: 首先&#xff0c;使用年度范围内接待投资者调研的总次数 ( Visitnmb) 作为…

卸载PLSQL及标准卸载流程

目录 1. 卸载PLSQL2. 删除注册表3. 删除数据信息 1. 卸载PLSQL 等待进度条走完 2. 删除注册表 regedit 右击删除 3. 删除数据信息 由于AppData是隐藏文件&#xff0c;需要勾选隐藏的项目。 重启电脑&#xff0c;PLSQL就卸载成功了。

低代码工单管理app评测,功能与效率解析

预计到2030年&#xff0c;低代码平台市场将达1870亿美元。ZohoCreator助力企业构建定制化软件应用&#xff0c;以建筑行业工作订单管理app为例&#xff0c;简化流程&#xff0c;提升管理效率&#xff0c;降低成本。其用户友好界面、自动化管理、跨平台使用及全面报告功能受企业…

项目优化内容及实战

文章目录 事前思考Prometheus 普罗米修斯概述架构安装及使用 Grafana可视化数据库读写分离实战1-PrometheusGrafanaspringboot 事前思考 需要了解清楚&#xff1a;需要从哪些角度去分析实现&#xff1f;使用了缓存&#xff0c;就需要把缓存命中率数据进行收集&#xff1b;使用…

企业在隔离网环境下如何进行安全又稳定的跨网文件交换?

在数字化时代&#xff0c;企业的数据流通如同血液一般重要。然而&#xff0c;当企业内部实施了隔离网环境&#xff0c;跨网文件交换就成了一个棘手的问题。今天我们将探讨在隔离网环境下&#xff0c;企业面临的跨网文件交换挑战&#xff0c;以及如何通过合规的跨网文件交换系统…

数字电路——触发器1(RS和钟控触发器)

触发器&#xff1a;能够存储一位二进制信息的基本单元电路称触发器(Flip-Flop) 特点&#xff1a; 具有两个能自行保持的稳定状态&#xff0c;用来表示逻辑状态的“0”或“1”。具有一对互补输出。有一组控制(激励、驱动)输入。或许有定时(时钟)端CP(Clock Pulse)。在输入信号…

PostgreSQL 16.4安装以及集群部署

1. 环境准备 1.1 主机环境 主机 IP: 192.24.215.121操作系统: CentOS 9PostgreSQL 版本: 16.4 1.2 从机环境 从机 IP: 192.24.215.122操作系统: CentOS 9PostgreSQL 版本: 16.4 2. 安装 PostgreSQL 16.4 在主从两台机器上都需要安装 PostgreSQL 16.4。 2.1 添加 Postgre…

银行卡基础信息查询 API 对接说明

本文将介绍一种 银行卡基础信息查询 API 对接说明&#xff0c;它可用于银行卡基础信息查询。 接下来介绍下 银行卡基础信息查询 API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 银行卡基础信息查询 API 对应页面申请对应的服务&#xff0c;进入页面之后&#xf…

Python自定义异常类:实际应用示例之最佳实践

Python自定义异常类&#xff1a;实际应用示例之最佳实践 前言 在软件开发中&#xff0c;合理处理异常是保证程序稳定性的重要环节。虽然 Python 内置了丰富的异常类型&#xff0c;但在处理复杂业务逻辑时&#xff0c;自定义异常类能够使代码更加清晰且具备可扩展性。 本文将…