按右手定則求已經知三點的法向量


 

編程這么久了還沒有一個自己常用的數學庫,每每需要求解什么算法,都在網上查找相關資料,不過好處是可以復習一些已經忘卻很久的知識,體驗一下溫故而知新。

背景知識

向量積,已知向量

a=(a1,a2,a3) b=(b1,b2,b3)


其向量積可表示為:

a×b=(a2b3-a3b2,a3b1-a1b3,a1b2-a2b1)

問題抽象

已知三點 P1(x1,y1,y1),P2(x2,y2,y2),P3(x3,y3,y3)。要求求出這三個點構成平面的法向量。

高中知識解法

我們知道法向量是和平面垂直的,因此法向量也和該平面上任意一條向量垂直,即點乘積為 0。
利用這個性質,我們可以構造兩個方程,此時我們不妨設法向量 n→=(x,y,z) 。

 將 P1 P2 P3​ 坐標帶入即可。

 

然后我們不妨假設 x=1, 這樣即可求出 x y z(三個方程三個未知量)。

 

大學知識解法

具體代碼

 //計算三點成面的法向量 三個點v1,v2,v3,法向量vn
 void GetNormal(const Vec3d& v1, const Vec3d& v2, const Vec3d& v3, Vec3d &vn)
 {
     double na = (v2.y - v1.y)*(v3.z - v1.z) - (v2.z - v1.z)*(v3.y - v1.y);
     double nb = (v2.z - v1.z)*(v3.x - v1.x) - (v2.x - v1.x)*(v3.z - v1.z);
     double nc = (v2.x - v1.x)*(v3.y - v1.y) - (v2.y - v1.y)*(v3.x - v1.x);
 
     //平面法向量
     vn.Set(na, nb, nc);
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM