空间直线与平面的交点

这内容属于计算几何,在 3D游戏开发编程基础 或者在游戏开发中的数学和物理算法 这种资料上也可以找到相关的内容和代码。或者更广泛点称为是计算机图形学,

      接下来我们进入正题,如果直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),

求得直线与平面的交点O的坐标(x,y,z):

       将直线方程写成参数方程形式,即有:

  x = m1+ v1 * ty = m2+ v2 * t               (1)式z = m3+ v3 * t

       将平面方程写成点法式方程形式,即有:

  vp1 * (x – n1) + vp2 * (y – n2) + vp3 * (z – n3) = 0             (2)式

       则直线与平面的交点一定满足式(1)式和(2)式,联立两式,求得:

    t = ((n1 – m1)*vp1+(n2 – m2)*vp2+(n3 – m3)*vp3) / (vp1* v1+ vp2* v2+ vp3* v3)              (3)式

      如果(3)式中分母(vp1* v1+ vp2* v2+ vp3* v3)为0,则表示直线与平面平行,即直线与平面没有交点。求解出t后,然后将t代入式(1)即可求得交点O的坐标(x,y,z)。定义一个求直线与平面交点坐标的函数CalPlaneLineIntersectPoint(),

其代码如下:

 1 /// <summary>
 2 /// 求一条直线与平面的交点
 3 /// </summary>
 4 /// <param name="planeVector">平面的法线向量,长度为3</param>
 5 /// <param name="planePoint">平面经过的一点坐标,长度为3</param>
 6 /// <param name="lineVector">直线的方向向量,长度为3</param>
 7 /// <param name="linePoint">直线经过的一点坐标,长度为3</param>
 8 /// <returns>返回交点坐标,长度为3</returns>
 9 
10 private float[] CalPlaneLineIntersectPoint(float[] planeVector, float[] planePoint, float[] lineVector, float[] linePoint)
11 {
12     float[] returnResult = new float[3];
13     float vp1, vp2, vp3, n1, n2, n3, v1, v2, v3, m1, m2, m3, t,vpt;
14     vp1 = planeVector[0];
15     vp2 = planeVector[1];
16     vp3 = planeVector[2];
17     n1 = planePoint[0];
18     n2 = planePoint[1];
19     n3 = planePoint[2];
20     v1 = lineVector[0];
21     v2 = lineVector[1];
22     v3 = lineVector[2];
23     m1 = linePoint[0];
24     m2 = linePoint[1];
25     m3 = linePoint[2];
26     vpt = v1 * vp1 + v2 * vp2 + v3 * vp3;
27     //首先判断直线是否与平面平行
28     if (vpt == 0)
29     {
30         returnResult = null;
31     }
32     else
33     {
34         t = ((n1 - m1) * vp1 + (n2 - m2) * vp2 + (n3 - m3) * vp3) / vpt;
35         returnResult[0] = m1 + v1 * t;
36         returnResult[1] = m2 + v2 * t;
37         returnResult[2] = m3 + v3 * t;
38     }
39     return returnResult;
40 }
41                     

 

参考了:http://m.blog.csdn.net/article/details?id=6688080

转载于:https://www.cnblogs.com/www-caiyin-com/p/6758548.html

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

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

相关文章

iphone导出视频 无法连接到设备_拷贝iphone照片,显示无法连接设备?TRIZ 3秒钟解决...

手机存储满了&#xff0c;想把手机里面的照片和视频拷贝出来。 又不想交给苹果cloud的“苹果税”。USB手动连上IPHONE&#xff0c;结果每次复制了几百兆&#xff0c;就会弹出“无法连接设备”&#xff0c;导致拷贝失败。并且每次重新连接之后&#xff0c;删掉的照片又出现在手机…

【Python基础入门系列】第07天:Python 数据结构--序列

python内置序列类型最常见的是列表&#xff0c;元组和字符串。&#xff08;序列是python中最基础的数据结构&#xff0c;而数据结构是计算机存储&#xff0c;组织数据的方式。&#xff09; 另外还提供了字典和集合的数据结构&#xff0c;但他们属于无顺序的数据集合体&#xf…

springBoot(20):使用Spring Session实现集群-redis

一、session集群的解决方案1.1、扩展指定server利用Servlet容器提供的插件功能&#xff0c;自定义HttpSession的创建和管理策略&#xff0c;并通过配置的方式替换掉默认的策略。缺点&#xff1a;耦合Tomcat/Jetty等Servlet容器&#xff0c;不能随意更换容器。1.2、利用Filter利…

docker desktop ubuntu镜像_原创 | Docker入门,看了不理解,假一赔命

写在前面这篇博客适合谁&#xff1f;对于Docker并不了解&#xff0c;只是有一点模糊的感觉&#xff0c;觉得Docker可以当成虚拟机用之类的只是下载了Docker软件&#xff0c;对于怎么配置&#xff0c;怎么玩&#xff0c;第一步干什么&#xff0c;完全一无所知其二&#xff0c;我…

【Python基础入门系列】第08天:Python List

Python内置的一种数据类型是列表&#xff1a;list。list是一种有序的集合&#xff0c;可以随时添加和删除其中的元素。 LIST 列表 比如&#xff0c;列出班里所有同学的名字&#xff0c;就可以用一个list表示&#xff1a; >>> classmates [liuwang, xuezhang, al…

【Python基础入门系列】第09天:Python tuple

Python 中的数据结构是通过某种方式组织在一起的数据元素的集合&#xff0c;这些数据元素可以是数字、字符、甚至可以是其他数据结构 在 Python 中&#xff0c;最基本的数据结构是序列&#xff08;在前面文章我们也说过序列&#xff09;&#xff0c;序列中的每个元素都有一个序…

elementui table某一列是否显示_Vue项目引进ElementUI组件的方法

环境要求NodejsNodejs官网下载地址&#xff1a;http://nodejs.cn/download/具体安装参考其他资料打开cmd命令行&#xff0c;输入npm -v&#xff0c;如果出现如下图的显示&#xff0c;说明已经安装正确。如果安装版本比较老&#xff0c;想升级新版本npm install npm -g安装 webp…

集成电路版图与工艺课程设计之用CMOS实现Y=AB+C电路与版图

1 绪论 1.1 设计背景 集成电路设计&#xff08;Integrated circuit design, IC design&#xff09;&#xff0c;亦可称之为超大规模集成电路设计&#xff08;VLSI design&#xff09;&#xff0c;是指以集成电路、超大规模集成电路为目标的设计流程。集成电路设计涉及对电子器…

硬盘显示容量和实际容量不符合_买移动固态硬盘纠结大半天?花2分钟看完这篇,购买时不再被坑...

如今移动硬盘已成为很多办公用户标配的物品&#xff0c;纵观整个移动硬盘市场&#xff0c;主要有移动机械硬盘和移动固态硬盘两种类型&#xff0c;前者容量大&#xff0c;价格较亲民&#xff1b;而后者具备了轻薄、读写速度快、耐振动不怕摔等优点。不少追求高效率的用户&#…

【Python基础入门系列】第10天:Python 类与对象

首先&#xff0c;我已经假定你是个萌新或已经看了无数遍的垃圾文章&#xff0c;然后依然搞不懂类和对象&#xff0c;但是呢起码知道有类和对象这么两个玩意儿&#xff0c;我觉得有必要找一篇生动形象的示例来讲解。 由于你可能没有编程经验&#xff0c; 所以无法从学过的编程…

数字电子技术课程设计之基于触发器的三位二进制同步减法计数器无效态000/110

基于触发器的三位二进制同步减法计数器无效态000/110 1 课程设计的目的与作用 掌握用multisim 的电路仿真程序 熟悉同步计数器工作原理和逻辑功能 熟悉计数器电路的分析和设计方法 掌握161 芯片集联成任意进制同步加法计数器 2 设计任务 三位二进制减法计数器&#xff08;无…

【Python的黑魔法】实例方法、静态方法和类方法

class Bird:# classmethod修饰的方法是类方法classmethoddef fly (cls):print(类方法fly: ,cls)# staticmethod修饰的方法是静态方法# staticmethoddef info (p):print(静态方法info: , p)if __name__ __main__:# 调用类方法&#xff0c;Bird类会自动绑定到第一个参数Bird.fl…

基于dreamweaver软件设计和开发一网站_基于 abp vNext 和 .NET Core 开发博客项目 Blazor 实战系列(一)...

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

LINUX 内存使用情况

# free 显示结果如下&#xff1a; Mem&#xff1a;表示物理内存统计 total 内存总数 8057964KBused 已使用的内存 7852484KBfree 空闲的内存数 205480KBshared 当前已经废弃不用&#xff0c;总是0buffers Buffer 缓存内存数: 290432KBcached Page 缓存内存数:5735024KB(存在关…

vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)

阅读目录 下载redis解压redis编译安装redis配置redisredis开机自启动系统参数的调整上一篇php7环境的搭建 真是火爆&#xff0c;仅仅两天时间&#xff0c;就破了我之前swagger系列的一片文章&#xff0c;看来&#xff0c;大家对搭建环境真是情有独钟。 为了访问量&#xff0c;我…

【技术分享】Ubuntu下使用微信教程

做后端开发的同学用的Linux&#xff08;ubuntu&#xff09;,肯定会因为没有适配微信版本会感觉不太舒服&#xff0c;很多时候因为缺少一些办公通讯软件而感到不便。现在已经有很方便的Wine WeChat方案&#xff0c;但是微信在Wine上配置还有许多bug&#xff0c;今天在github上看…

python join函数_Python join()函数

原博文 2016-08-12 10:16 − 今天写python 100例时&#xff0c;有个题目是大致是这样的&#xff1a;已知输入形式是1321&#xff0c;要求输出形式为1123 一开始思路是将输入的字符串用split()函数划分成数组&#xff0c;在对数组进行排序&#xff0c;再用for循环输出 代码附上&…

CSS中的盒子

盒子 盒子模型解释元素在页面中显示成一个方块&#xff0c;类似一个盒子&#xff0c;CSS盒子模型就是使用现实中盒子来做比喻&#xff0c;帮助我们设置元素对应的样式。盒子模型示意图如下&#xff1a; 把元素叫做盒子&#xff0c;设置对应的样式分别为&#xff1a;盒子的边框…

Djang重新整理migrations,解决:Django Table xxx already exist

在开发过程中&#xff0c;由于需求变更或者自我重构&#xff0c;需要清理migrations&#xff0c;以保持代码整洁和后续的可维护性。 场景一 不考虑数据库数据表&#xff0c;可以完全清空数据库里面的表的数据。 步骤&#xff1a; 删除所有migrations find . -path "/migr…

安全随笔2:对称加密应用场景

MD5或者说HASH值是一种不可逆的算法。如果需要从密文还原成明文&#xff0c;那么就需要对称和非对称这两类可逆算法。 首先&#xff0c;简单介绍下这两类算法。图9-1是对称算法的示意图&#xff1a; 图9-1 对称算法 在对称算法中&#xff0c;首先需要发送方和接收方协定一个密钥…