大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
假设在三维世界中存在一个平面,如图
一个平面可以通过如下表达式表达
(1)
其中,(x,y,z)是在该平面上上的点的3D坐标。(A,B,C)能够构成该平面的一个法向量n。
那么,怎么通过一堆离散的点来求解这个平面呢?首先我们可以简单的用一个平面的法向量来表征一个平面。
方法1:
假设在某个平面中存在着三个坐标点分别是M1(x1,y1,z1),M2(x2,y2,z2),M2(x2,y2,z2),那么我们可以得到该平面上的两个向量
M1M2=M2-M1
M1M3=M3-M1
那么,我们需要求解的平面是不是就和这两个向量都平行呢?当然平行!换而言之,这两个向量所构成的平面就是我们所求解的平面。所以我们所求平面的法向量也就必定和这两个向量所构成的平面垂直。最后,也就是说法线必定与上述两个向量垂直。
根据叉积的定义(https://baike.baidu.com/item/%E5%90%91%E9%87%8F%E7%A7%AF/4601007?fr=aladdin&fromid=2812058&fromtitle=%E5%8F%89%E7%A7%AF),我们可以找到和上述两个向量都垂直的向量
n= M1M2 x M1M3
最终,我们通过平面中的3个点求解出来平面的法向量来表征该平面。
方法2:
方法1比较简单,利用高中的几何知识就可以轻易解决,那么大家有没有想过一个问题:在实际情况中,我们得到的某个平面的点集可能是存在一定的误差的,换而言之,某一些点虽然被归为某一个平面,但是由于测量误差的存在,它们可能是在三维坐标系中的位置是高于或者低于我们所求平面的。所以,当我们从中选取3个点去求解平面的时候就会存在比较明显的误差。所以,要是能够充分利用所有测量到的平面中的点的信息,则会增加我们的估计精度。
假如我们有N个点,这N个点都是基本满足公式(1),虽然存在一些误差。那么,它们应该基本满足下面的公式:
针对上述问题,我们可以将它归为一个最小二乘问题:
这是一个AX=0的线性欠定方程。在假设法线模为1的前提下,忽略对D的求解,我们可以对左边矩阵进行SVD分解,得到在未知向量模为1下的解。最终实现对平面法线的求解,当然这是一个近似解啦~
方法3
那么问题来了,要是这一对点中有少数特别离谱的点怎么办?这肯定会影响我们的求解精度啊!其实也简单,用RANSAC方法(https://en.wikipedia.org/wiki/Random_sample_consensus)就可以啦!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234078.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...