计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)
继续上一节的内容,本节主要讲解三维空间中射线、线段与平面及三维物体的交点及距离的计算,它们在碰撞检测和可见性剔除等应用中是必不可少的。首先给出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)相关推荐
- 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续7)
介绍求取平面上顶点集合凸包的Graham Scan和Andrew's Monotone Chain方法.基本原理是在顶点排序好后,初始化一栈,循环取出顶点集合中每个顶点元素,将其与栈顶两元素进行判别, ...
- opencv检测相交点_在网络摄像头feed opencv中检测2条线之间的交点
我正在尝试检测摄像头Feed中两条线之间的交点.这是我已经拥有的屏幕截图 我尝试找到红线和绿线之间的交点. 这是我已经拥有的代码 #include "stdafx.h" #incl ...
- ad16 怎么设置单独元件间距_AD软件中怎么添加不同元素之间的间距规则?
我们在进行PCB设计的时候,一定会碰到各种元素与各种元素之间的间距规则的设置.比如想要设置铜皮跟走线的间距,或者设置过孔跟丝印的间距.这些都涉及到我们最基本的PCB设计,所以足以看出这项技能在PCB设 ...
- pandas使用pct_change计算数据列的百分比变化、环比变化率:计算当前元素和前一个元素之间的百分比变化、使用style函数指定format的格式:百分比、缺失值替换、用颜色标注极大值和极小值
pandas使用pct_change计算数据列的百分比变化.环比变化率:计算当前元素和前一个元素之间的百分比变化.使用style函数指定format的格式:百分比.缺失值替换.用颜色标注极大值和极小值 ...
- pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)
pandas使用pct_change函数计算当前元素和前一个元素之间的百分比变化:默认情况下pct_change函数计算与紧邻前一行相比的百分比变化.计算当前元素和前一个元素之间的百分比变化(包含Na ...
- R语言使用forestplot包绘制森林图:编码创建森林图仿真数据、汇总线修改、元素位置调整、垂直线、字体、风格、置信区间、线型、图例、刻度、标签等
R语言使用forestplot包绘制森林图:编码创建森林图仿真数据.汇总线修改.元素位置调整.垂直线.字体.风格.置信区间.线型.图例.刻度.标签等 目录
- bootstrap4 调整元素之间距离
https://blog.csdn.net/jianye5461/article/details/79463014 影响元素之间的间距是可以通过style的margin或padding属性来实现,但这 ...
- 如何删除内联块元素之间的空间?
鉴于此HTML和CSS: span { display:inline-block; width:100px; background-color:palevioletred; } <p> & ...
- 051_元素之间空白间隙解决方案
1. 元素li和li之间, 以及多个图片直接会有一段空白的, 空白符会造成元素显示有间隙.消除间隙就不能有空白符.不留空白代码格式又显得糟糕. 2. 我们有消除间隙小窍门, 在元素的父容器中设置: f ...
最新文章
- [Job Interview] C/C plus plus Programming
- 复制介绍、复制的实用价值
- 世界无烟日丨如何科学戒烟?
- WebSocket FlashSocket
- ITK:对图像中的结构进行分割
- 从零实现一个自定义 HTML5 播放器
- 虚拟机ping不通百度等外部网络
- 查看oracle的块大小,查看操作系统块大小
- 机器学习从理论到工程的第二步-开发环境与工具篇
- 增大表名最大长度_风电叶片材料的发展变迁史,及风力发电机叶片长度发展历程...
- 笨办法学 Python · 续 练习 12:复习
- sed -i 单引号中嵌套双引号_【函数应用】IF函数的多层嵌套
- Jquery重新学习之七[Ajax运用总结A]
- 台湾出境旅游项目数据分析
- npm-scripts 在 windows 下的兼容问题
- 直播预告 | 全场景音视频技术解析
- 从零开始写触摸屏驱动(Linux4.3.2 JZ2440V3 480*272)
- python编程输入法_用Python写一个拼音输入法
- 法信智推搜索引擎_法学工具分享
- coreldraw2021全名和序列号 cdr2021安装下载图文教程