三维空间中平面的法向量计算

取平面上三点分别为: 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;
}

三维空间中平面的法向量计算相关推荐

  1. 三维空间中平面的法向量计算(2)

    假如平面上有三个不同点P1(x1,y1,z1),P2(x2,y2,z2),P3(x3,y3,z3),则该平面的法向量n是一个跟向量P1P2,向量P2P3,向量P1P3,都垂直的向量.之前用垂直向量的数 ...

  2. 三维重建:三维空间中平面的旋转公式

    参考:三维重建3:旋转矩阵-病态矩阵.欧拉角-万向锁.四元数--- 问题描述: 三维空间内,给定一个多边形平面,得出旋转到任一平面的方法步骤. 问题分析: 每一个平面方向可以由法线唯一确定,空间平面可 ...

  3. 使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角

    使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角 写这篇博客源于博友的提问,他坚定了我继续坚持学习的心,带给了我充实与快乐. 将介绍以下5部分 ...

  4. Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算

    如有错误,恳请指出. 从这一篇博客开始,开始利用Open3d来处理点云数据.之后将围绕点云数据的多种处理方式来记录笔记.本篇博客的内容包括点云的文件格式介绍,点云数据的读取,以及点云的配准与点云的法向 ...

  5. VTK修炼之道47:图形基本操作进阶_法向量计算

    1.点法向量和单元法向量 三维平面的法向量是指垂直于该平面的三维向量.曲面在某点P处的法向量为垂直于该点切平面的向量.对于一个网格模型,其每一个点和单元都可以计算一个法向量,在三维计算机图形学中法向量 ...

  6. java中10》》2_(10*(2-8)+10)/(5-5*2)在JAVA语言中,上面的表达式计算结果为(选一项)_学小易找答案...

    [单选题]下列哪项不是药物的基本属性?( ) [单选题]已知 1 只共阴极 LED 显示器,其中 a 笔段为字形代码的最低位,若需显示数字 1 ,它的字形代码应为 ( ) (1.0分) [单选题]由于 ...

  7. 【心得】NXOpen通过选择控件选择点获取对应实体,以及选择面的法向量

    NXOpen通过选择点控件,查询面与体的信息 说明:使用选择控件,通过设置选中的模式为面上的点. 通过点的tag,获得面上的点的平面 /// <summary>/// 从点找到对应面,返回 ...

  8. PCL编程-法向量计算

    [原文:http://blog.csdn.net/q597967420/article/details/12220865] NormalEstimation:PCL中计算法向量的类.原理是通过对邻域点 ...

  9. OpenCV矩阵运算之顶点法向量计算

    OpenCV进行顶点法向量计算 先介绍一下我接触此题的背景.我需要将一个.obj文件中的vn即顶点法向量计算出来.现在有的数据是f(三角面片索引),v(顶点坐标),但是网上找的代码不是很多,逻辑也不是 ...

最新文章

  1. 如何正确拒绝老板的加班要求?学起来!
  2. Linux下创建与解压zip, tar, tar.gz和tar.bz2文件及该文件压缩对比
  3. matlab 邵玉斌,matlab 清华大学出版社 邵玉斌编写的《通信系统建模与仿真实例分析》一书的所有MATLAB和SIMULINK代码 - 下载 - 搜珍网...
  4. spring AoP学习 -----AoP织入器ProxyFactory剖析
  5. matlab算概率,用matlab计算概率,再次吐槽某些吧友国战比赛七框选将的建议
  6. dubbo负载均衡策略和集群容错策略
  7. 前端学习(2537):vue源码解析2伪数组转换为真数组
  8. 后台拿webshell的方法总结
  9. 红帽yum安装httpd出现错误(This system is not registered to Red Hat Subscription Management. You can use subs)
  10. oracle 存储过程导出sql语句 导出为文件
  11. Pycharm 相关使用方法
  12. 5G时代下的移动边缘计算(MEC)探索系列之三
  13. UE4 粒子特效基础学习 (03-制作上升光线特效)
  14. 怎么看服务器cpu温度命令_ubuntu 命令行下查看及监测CPU温度的方法
  15. PyTorch代码学习-ImageNET训练
  16. 什么是UV PV DAU MAU
  17. Learning Multi-granularity Consecutive User Intent Unit for Session-based Recommendation
  18. 中科大自主招生2018年笔试数学之二
  19. python中str,int,list,list(str),list(int)的相互转换
  20. 国产化信创CPU、操作系统、数据库、中间件笔记

热门文章

  1. NVIDIA控制面板打开后闪退
  2. Rera1N环境Linux,iPhone降级不是梦!ReRa1n降级工具推出,支持任意降级
  3. 嵌入式工程师16个问题
  4. i2c-tools调试工具
  5. 蓝桥杯同一类型题目汇总
  6. 将QIIME2学习进行到底
  7. 光伏发电极其并网控制matlab simulink仿真文件,最大功率点跟踪采用扰动观察法
  8. HGame 2023 Week4 部分Writeup
  9. signature=839c980ea2bb48be66699d26946b8c01,3922张仅包含车牌的图片,图片名字表示车牌号码...
  10. Vivado2022.2安装教程