继续上一节的内容,本节主要讲解三维空间中射线、线段与平面及三维物体的交点及距离的计算,它们在碰撞检测和可见性剔除等应用中是必不可少的。首先给出3D空间下点乘和叉乘的定义与定理的推导,再谈如何应用到程序编码的工作中。

设三维空间中任意两矢量V(v1,v2,v3)和W(w1,w2,w3)

由三角形的余弦公式:

cosα = (a2 + b2 – c2)/2ab

则两矢量夹角α的余弦 : cosα = {(v1*v1 + v2*v2 + v3*v3) + (w1*w1+w2*w2+w3*w3)- [ (w1 - v1)2+( w2 - v2)2+( w3 - v3)2] } / 2 |V| |W| = (v1w1+ v2w2 + v3w3)/ |V| |W|

由于将矢量的点乘定义为 : V·W = v1w1+ v2w2 + v3w3 ;

所以 |V| |W| cosα = V·W;

由上面的结论引申,可知道如果两矢量的点乘为0,则说明夹角α的余弦为0,即矢量的夹角是90度,互相垂直。

再来看两矢量的叉乘,与点乘的计算结果定义为一数值不同,叉乘的结果定义为另外一个矢量 U (u1,u2,u3) ,其中:

u1 = v2w3 - v3w2;

u2 = v3w1 - v1w3;

u3 = v1w2 - v2w1;

由这个定义我们来推导:

V·U = v1(v2w3 - v3w2) + v2(v3w1 - v1w3) + v3(v1w2 - v2w1) = v1v2w3 - v1 v3w2 + v2v3w1-v2 v1w3 + v3v1w2-v3 v2w1 = 0;两矢量的点乘为0,说明它们互相垂直。

W·U = w1(v2w3 - v3w2) + w2(v3w1 - v1w3) + w3(v1w2 - v2w1) = 0,说明它们也是互相垂直的。

在三维空间中,U与V、W都垂直,说明U是垂直与V与W构成的平面,也就是这个平面的法向量。

U虽然是矢量,但其模|U|依旧是一个数值,表明其长度。

|U|2 = u1*u1 + u2*u2 + u3*u3 = (v2w3 - v3w2)2+( v3w1 - v1w3)2+( v1w2 - v2w1)2

同时考虑,在α是V、W两矢量的夹角条件下,(|V| |W|sinα)2= |V|2|W|2(1-cos2α)= |V|2|W|2- |V|2|W|2cos2α = |V|2|W|2- (V·W)2= (v1*v1 + v2*v2 + v3*v3)( w1*w1+w2*w2+w3*w3) - (v1w1+ v2w2 + v3w3)2

通过化解,可以得到一个数学等式,即:

(bz-cy)2+(cx-az)2+(ay-bx)2=(a2+b2+c2)(x2+y2+z2)-(ax+by+cz)2

所以 (v2w3 - v3w2)2+( v3w1 - v1w3)2+( v1w2 - v2w1)2  = (v1*v1 + v2*v2 + v3*v3)( w1*w1+w2*w2+w3*w3) - (v1w1+ v2w2 + v3w3)2

即                          |U|2 = (|V| |W|sinα)2

|U| = |V| |W|sinα

在完成三维空间的点乘和叉乘定义与公式推导后,可以直接运用结论到程序的编写中,这些结论包括利用点乘来求得夹角的余弦,利用点乘为0来求得垂直于某向量的另一向量,利用两向量的叉乘来求得平面的法向量,利用叉乘的模来求得三角形的面积等。

三维空间中点到直线、射线和线段的距离。即从点P作垂直于线段(P0,P1)的垂线,求得垂心T后,计算两点之间的距离。

设置T点为参数表达方式: T = P0 + t(P1 –P0);将T点看作是从P0开始往P1移动的动态点,则矢量PT为PP0与P0T两个矢量之和,当PT垂直于P0P1时,利用两个矢量的点乘为0列等式,求得参数t的数值。

(PP0 + P0T) ·P1P0 = 0;

即 (P-P0)·(P1 –P0) + t(P1 –P0) ·(P1 –P0) = 0;

t = - (P-P0)·(P1 –P0) / (P1 –P0) ·(P1 –P0)

可以看出分子是需要计算两个矢量的点乘,而分母是矢量P0P1点乘自身,即为模的平方。

double CDEMAlgorithm::dist_Point_to_Line( Point P, Line L)

{

Vector v = L.P1 - L.P0;                                     //顶点相减得到矢量

Vector w = P - L.P0;                                    //顶点相减得到矢量

double c1 = Dot(w,v);                                   //两矢量的点乘

double c2 = Dot(v,v);                                   //两矢量的点乘

double b = c1 / c2;                                     //求得参数

Point Pb = L.P0 + b * v;                                //解得参数后,得到垂心位置

return d(P, Pb);                                        //返回两点之间的距离

}

转载于:https://www.cnblogs.com/wuhanhoutao/archive/2008/03/08/1096224.html

计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)相关推荐

  1. 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续7)

    介绍求取平面上顶点集合凸包的Graham Scan和Andrew's Monotone Chain方法.基本原理是在顶点排序好后,初始化一栈,循环取出顶点集合中每个顶点元素,将其与栈顶两元素进行判别, ...

  2. opencv检测相交点_在网络摄像头feed opencv中检测2条线之间的交点

    我正在尝试检测摄像头Feed中两条线之间的交点.这是我已经拥有的屏幕截图 我尝试找到红线和绿线之间的交点. 这是我已经拥有的代码 #include "stdafx.h" #incl ...

  3. ad16 怎么设置单独元件间距_AD软件中怎么添加不同元素之间的间距规则?

    我们在进行PCB设计的时候,一定会碰到各种元素与各种元素之间的间距规则的设置.比如想要设置铜皮跟走线的间距,或者设置过孔跟丝印的间距.这些都涉及到我们最基本的PCB设计,所以足以看出这项技能在PCB设 ...

  4. pandas使用pct_change计算数据列的百分比变化、环比变化率:计算当前元素和前一个元素之间的百分比变化、使用style函数指定format的格式:百分比、缺失值替换、用颜色标注极大值和极小值

    pandas使用pct_change计算数据列的百分比变化.环比变化率:计算当前元素和前一个元素之间的百分比变化.使用style函数指定format的格式:百分比.缺失值替换.用颜色标注极大值和极小值 ...

  5. pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)

    pandas使用pct_change函数计算当前元素和前一个元素之间的百分比变化:默认情况下pct_change函数计算与紧邻前一行相比的百分比变化.计算当前元素和前一个元素之间的百分比变化(包含Na ...

  6. R语言使用forestplot包绘制森林图:编码创建森林图仿真数据、汇总线修改、元素位置调整、垂直线、字体、风格、置信区间、线型、图例、刻度、标签等

    R语言使用forestplot包绘制森林图:编码创建森林图仿真数据.汇总线修改.元素位置调整.垂直线.字体.风格.置信区间.线型.图例.刻度.标签等 目录

  7. bootstrap4 调整元素之间距离

    https://blog.csdn.net/jianye5461/article/details/79463014 影响元素之间的间距是可以通过style的margin或padding属性来实现,但这 ...

  8. 如何删除内联块元素之间的空间?

    鉴于此HTML和CSS: span { display:inline-block; width:100px; background-color:palevioletred; } <p> & ...

  9. 051_元素之间空白间隙解决方案

    1. 元素li和li之间, 以及多个图片直接会有一段空白的, 空白符会造成元素显示有间隙.消除间隙就不能有空白符.不留空白代码格式又显得糟糕. 2. 我们有消除间隙小窍门, 在元素的父容器中设置: f ...

最新文章

  1. [Job Interview] C/C plus plus Programming
  2. 复制介绍、复制的实用价值
  3. 世界无烟日丨如何科学戒烟?
  4. WebSocket FlashSocket
  5. ITK:对图像中的结构进行分割
  6. 从零实现一个自定义 HTML5 播放器
  7. 虚拟机ping不通百度等外部网络
  8. 查看oracle的块大小,查看操作系统块大小
  9. 机器学习从理论到工程的第二步-开发环境与工具篇
  10. 增大表名最大长度_风电叶片材料的发展变迁史,及风力发电机叶片长度发展历程...
  11. 笨办法学 Python · 续 练习 12:复习
  12. sed -i 单引号中嵌套双引号_【函数应用】IF函数的多层嵌套
  13. Jquery重新学习之七[Ajax运用总结A]
  14. 台湾出境旅游项目数据分析
  15. npm-scripts 在 windows 下的兼容问题
  16. 直播预告 | 全场景音视频技术解析
  17. 从零开始写触摸屏驱动(Linux4.3.2 JZ2440V3 480*272)
  18. python编程输入法_用Python写一个拼音输入法
  19. 法信智推搜索引擎_法学工具分享
  20. coreldraw2021全名和序列号 cdr2021安装下载图文教程

热门文章

  1. 第一个spring boot应用
  2. DataGridView取得或者修改当前单元格的内容
  3. Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统【转】
  4. 京东方剑指物联网领域
  5. ES6 module 简单整理
  6. FileMaker中的腳本觸發器學習筆記
  7. JavaScript引擎大战:Google提出StrongMode和SoundScript议案,增强V8性能
  8. Spring+Hibernate项目在weblogic中部署的一些问题
  9. 网络名词--“环路”
  10. cocos2d-x android 移植 问题