三维空间中平面的法向量计算
取平面上三点分别为: P1(x1,y1,z1), P2(x2,y2,z2), P3(x3,y3,z3), 设法向量为(dx,dy,dz), 则法向量满足以下等式:
(x2-x1)*dx+(y2-y1)*dy+(z2-z1)*dz=0;
(x3-x1)*dx+(y3-y1)*dy+(z3-z1)*dz=0;
(x3-x2)*dx+(y3-y2)*dy+(z3-z2)*dz=0;
本质即为求解三个未知数三个方程的方程组,依据克莱姆法则,计算法向量如下:
bool flag=CalNormalVector(x1,y1,z1,x2,y2,z2,x3,y3,z3,dx,dy,dz);
if(flag)
{//求解成功
}
else
{//没有法向量
}
bool CalNormalVector(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float &dx,float &dy,float &dz)
{//float a1,a2,b1,b2,c1,c2;//float _a1=x2-x1; float _b1=y2-y1; float _c1=z2-z1;float _a2=x3-x1; float _b2=y3-y1; float _c2=z3-z1;float _a3=x3-x2; float _b3=y3-y2; float _c3=z3-z2;//_a1x+_b1y+_c1z=0;//_a2x+_b2y+_c2z=0;//_a3x+_b3y+_c3z=0;//3个未知数3个方程组成的齐次方程组求解//系数矩阵A//| _a1 _b1 _c1 |//| _a2 _b2 _c2 |//| _a3 _b3 _c3 |//如果行列式A的值不等于0,则有唯一解且为零解float DA=_a1*_b2*_c3+_b1*_c2*_a3+_a2*_b3*_c1-_a3*_b2*_c1-_a1*_b3*_c2-_a2*_b1*_c3;if (DA!=0){dx=0.0f;dy=0.0f;dz=0.0f;return false;}//---------------------------------------------////如果行列式A的值等于0,则有非零解//非零解即x!=0时有解或者y!=0时有解或者z!=0时有解float x=0.0f,y=0.0f,z=0.0f;//若z!=0时有解,取z=-1//_a1x+_b1y=_c1;---(1)//_a2x+_b2y=_c2;---(2)//_a3x+_b3y=_c3;---(3)//任取2个方程即可,在此取(1)(2)x=0.0f;y=0.0f;bool flag3=GetTwoLineIntersection(_a1,_b1,_c1,_a2,_b2,_c2,x,y);if (flag3)//假设成立{dx=-x;dy=-y;dz=1.0f;return true;}//假设不成立,继续试验另一个假设//若x!=0时有解取x=-1,平面中两条直线求交点问题//_b1y+_c1z=_a1;---(1)//_b2y+_c2z=_a2;---(2)//_b3y+_c3z=_a3;---(3)//任取2个方程即可,在此取(1)(2)y=0.0f;z=0.0f;bool flag1=GetTwoLineIntersection(_b1,_c1,_a1,_b2,_c2,_a2,y,z);if (flag1)//假设成立{dx=1.0f;dy=-y;dz=-z;return true;}//假设不成立,继续试验另一个假设//若y!=0时有解取y=-1,平面中两条直线求交点问题//_a1x+_c1z=_b1;---(1)//_a2x+_c2z=_b2;---(2)//_a3x+_c3z=_b3;---(3)//任取2个方程即可,在此取(1)(2)x=0.0f;z=0.0f;bool flag2=GetTwoLineIntersection(_a1,_c1,_b1,_a2,_c2,_b2,x,z);if (flag2)//假设成立{dx=-x;dy=1.0f;dz=-z;return true;}//所有假设都不成立,求解失败return false;
}
两个未知数两个方程的方程组,根据克莱姆法则求解如下:
bool GetTwoLineIntersection(float _a1,float _b1,float _c1,float _a2,float _b2,float _c2,float &x,float &y)
{//_a1x+_b1y=_c1;---(1)//_a2x+_b2y=_c2;---(2)//if (_c1==0&&_c2==0){//2个未知数2个方程组成的齐次方程组求解//系数矩阵B//| _a1 _b1 |//| _a2 _b2 |float DB=_a1*_b2-_a2*_b1;if (DB!=0)//有唯一零解{x=0;y=0;return true;}else//有无数解{x=0;y=0;return false;}}else{//2个未知数2个方程组成的非齐次方程组求解//系数矩阵B//| _a1 _b1 |//| _a2 _b2 |//float DB=_a1*_b2-_a2*_b1;if (DB!=0)//有唯一解{float dD1 = _c1 * _b2 - _c2 * _b1;float dD2 = _a1 * _c2 - _a2 * _c1;x = dD1 / DB;y= dD2 / DB;return true;}else//有无数解或者无解{x=0;y=0;return false;}}return false;
}
三维空间中平面的法向量计算相关推荐
- 三维空间中平面的法向量计算(2)
假如平面上有三个不同点P1(x1,y1,z1),P2(x2,y2,z2),P3(x3,y3,z3),则该平面的法向量n是一个跟向量P1P2,向量P2P3,向量P1P3,都垂直的向量.之前用垂直向量的数 ...
- 三维重建:三维空间中平面的旋转公式
参考:三维重建3:旋转矩阵-病态矩阵.欧拉角-万向锁.四元数--- 问题描述: 三维空间内,给定一个多边形平面,得出旋转到任一平面的方法步骤. 问题分析: 每一个平面方向可以由法线唯一确定,空间平面可 ...
- 使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角
使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角 写这篇博客源于博友的提问,他坚定了我继续坚持学习的心,带给了我充实与快乐. 将介绍以下5部分 ...
- Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
如有错误,恳请指出. 从这一篇博客开始,开始利用Open3d来处理点云数据.之后将围绕点云数据的多种处理方式来记录笔记.本篇博客的内容包括点云的文件格式介绍,点云数据的读取,以及点云的配准与点云的法向 ...
- VTK修炼之道47:图形基本操作进阶_法向量计算
1.点法向量和单元法向量 三维平面的法向量是指垂直于该平面的三维向量.曲面在某点P处的法向量为垂直于该点切平面的向量.对于一个网格模型,其每一个点和单元都可以计算一个法向量,在三维计算机图形学中法向量 ...
- java中10》》2_(10*(2-8)+10)/(5-5*2)在JAVA语言中,上面的表达式计算结果为(选一项)_学小易找答案...
[单选题]下列哪项不是药物的基本属性?( ) [单选题]已知 1 只共阴极 LED 显示器,其中 a 笔段为字形代码的最低位,若需显示数字 1 ,它的字形代码应为 ( ) (1.0分) [单选题]由于 ...
- 【心得】NXOpen通过选择控件选择点获取对应实体,以及选择面的法向量
NXOpen通过选择点控件,查询面与体的信息 说明:使用选择控件,通过设置选中的模式为面上的点. 通过点的tag,获得面上的点的平面 /// <summary>/// 从点找到对应面,返回 ...
- PCL编程-法向量计算
[原文:http://blog.csdn.net/q597967420/article/details/12220865] NormalEstimation:PCL中计算法向量的类.原理是通过对邻域点 ...
- OpenCV矩阵运算之顶点法向量计算
OpenCV进行顶点法向量计算 先介绍一下我接触此题的背景.我需要将一个.obj文件中的vn即顶点法向量计算出来.现在有的数据是f(三角面片索引),v(顶点坐标),但是网上找的代码不是很多,逻辑也不是 ...
最新文章
- 如何正确拒绝老板的加班要求?学起来!
- Linux下创建与解压zip, tar, tar.gz和tar.bz2文件及该文件压缩对比
- matlab 邵玉斌,matlab 清华大学出版社 邵玉斌编写的《通信系统建模与仿真实例分析》一书的所有MATLAB和SIMULINK代码 - 下载 - 搜珍网...
- spring AoP学习 -----AoP织入器ProxyFactory剖析
- matlab算概率,用matlab计算概率,再次吐槽某些吧友国战比赛七框选将的建议
- dubbo负载均衡策略和集群容错策略
- 前端学习(2537):vue源码解析2伪数组转换为真数组
- 后台拿webshell的方法总结
- 红帽yum安装httpd出现错误(This system is not registered to Red Hat Subscription Management. You can use subs)
- oracle 存储过程导出sql语句 导出为文件
- Pycharm 相关使用方法
- 5G时代下的移动边缘计算(MEC)探索系列之三
- UE4 粒子特效基础学习 (03-制作上升光线特效)
- 怎么看服务器cpu温度命令_ubuntu 命令行下查看及监测CPU温度的方法
- PyTorch代码学习-ImageNET训练
- 什么是UV PV DAU MAU
- Learning Multi-granularity Consecutive User Intent Unit for Session-based Recommendation
- 中科大自主招生2018年笔试数学之二
- python中str,int,list,list(str),list(int)的相互转换
- 国产化信创CPU、操作系统、数据库、中间件笔记
热门文章
- NVIDIA控制面板打开后闪退
- Rera1N环境Linux,iPhone降级不是梦!ReRa1n降级工具推出,支持任意降级
- 嵌入式工程师16个问题
- i2c-tools调试工具
- 蓝桥杯同一类型题目汇总
- 将QIIME2学习进行到底
- 光伏发电极其并网控制matlab simulink仿真文件,最大功率点跟踪采用扰动观察法
- HGame 2023 Week4 部分Writeup
- signature=839c980ea2bb48be66699d26946b8c01,3922张仅包含车牌的图片,图片名字表示车牌号码...
- Vivado2022.2安装教程