不共线三点确定特征平面并求解平面系数
生活随笔
收集整理的這篇文章主要介紹了
不共线三点确定特征平面并求解平面系数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.基本原理
?已知三點p1,p2,p3,求其平面方程,p1=[x1,y1,z1];p2=[x2,y2,z2];p3=[x3,y3,z3];那么求解下面矩陣q行列式就是了:q=[ones(4,1),[x,y,z];p1;p2;p3];detb=det(q);最后令q=0;
這里的求解方法是四階矩陣的行列式求解,可以從三階矩陣的行列式推導出來,那就是常規的求解方法:方程組寫成[p1;p2;p3]=D,其中D=[d,d,d]'表示平面方程的常數項,先求q=[p1;p2;p3]的行列式,再分別求D與三個坐標兩個分量合成的三階矩陣的行列式,設為q1,q2,q3;那么所求的平面方程的四個參數就是A=q1/q;B=q2/q;c=q3/q;D=d;同時乘以q/d所得結果本質上就是上面四階矩陣行列式解。
2.Matlab代碼
<span style="font-size:14px;">function [a,b,c,d] = TriPts2Plane( A,B,C ) %不共線三點確定一個平面 %具體指,2DUS提供的數據點確定3DCT中的一個參考平面 % A,B,C 不共線的三個點 %a,b,c,d 確定平面方程的參數 %沈春旭/沈子恒 2016.4.8 %-------------------------------Step1:確定平面方程-------------------------%syms x y z %D的行列式等于零就是平面方程。 if (det([A;B;C]) == 0)msgbox('特征點線性相關,不足以構成平面');return; elseD=[ones(4,1),[[x,y,z];A;B;C]];detd = det(D);str = char(detd); %---------------------------------Step2: 提取系數--------------------------%amark = find(str=='x');bmark = find(str=='y');cmark = find(str=='z'); %------------------------------------------- if(size(amark,2))a = coeffs(detd,x); a = double(a(2));%系數按照升冪順序排列elsea = 0;end %------------------------------------------- if(size(bmark,2))b = coeffs(detd,y); b = double(b(2)); elseb = 0;end %------------------------------------------- if(size(cmark,2))c = coeffs(detd,z); c = double(c(2)); elsec = 0;end %------------------------------------------- [~,num] = size(str);if(num>max([amark,bmark,cmark]))d = coeffs(detd); d = double(d(1));elsed = 0;end %------------------------------------------- end end</span>測試代碼: clc; clear all; close all; A=[0,0,105];%A,B,C的坐標由自己定義。 B=[0,512,105]; C=[512,0,95]; [a,b,c,d]=TriPts2Plane(A,B,C); plane = [A;B;C;A]; plot3(plane(:,1),plane(:,2),plane(:,3),'*'); hold on %ezmesh(z)plot3(plane(:,1),plane(:,2),plane(:,3),'b-'); axis([0 512 0 512 0 163]) grid on;
測試結果:
總結
以上是生活随笔為你收集整理的不共线三点确定特征平面并求解平面系数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 是程序员就应该知道的东西
- 下一篇: 关于Debug和Release之本质区别