三點定面的演算法實現

來源:互聯網
上載者:User
/Files/dunnice/GeometryHelper.txt

在做Gis的時候, 遇到一個通過三點定面的問題,在求解面公式的時候, 沒有找到簡單的第三方控制項.就自己寫了一個簡單的方法.

三點定面公式:
Ax + By + Cz + D =0
x: x軸值
y: y軸值
z: z軸值

以下是數值版的邏輯推理版本:
已知三點P(1,-1,1) Q(2,4,6) S(1,0,3)

求出兩個向量PQ(1,5,5)和PS(0,1,2)兩條線

三點確定一個平面
設平面上任意一點T的座標為(x,y,z)
則PT可以表示成aPQ+bPS  其中a,b為任意常數
即(x-1,y+1,z-1)=a(1,5,5)+b(0,1,2)=(a,5a+b,5a+2b)
所以
x-1=a
y+1=5a+b
z-1=5a+2b
把第一個式子代入第二個式子得
y+1=5(x-1)+b
b=y+1-5x+5=y-5x+6
代入第三個式子
z-1=5(x-1)+2(y-5x+6)
整理得
5x-2y+z-8=0
則
該平面的公式為
5x-2y+z-8=0

以下是純邏輯推理版本:
三個點:
(x1, y1, z1) (x2, y2, z2) (x2, y3, z3)

向量座標的基準點為(x1, y1, z1):
PQ(x2-x1, y2-y1, z2-z1)  =>  PQ(x4, y4, z4)
PS(x3-x1, y3-y1, z3-z1)  =>  PS(x5, y5, z5)

對於平面中人和一個點(x, y, z):
(x-x1, y-y1, z-z1) = a*PQ + b*PS => a*(x4, y4, z4) + b*(x5, y5, z5)
                   => (a*x4+b*x5, a*y4+b*y5, a*z4+b*z5)

所以:
x-x1 = a*x4 + b*x5
y-y1 = a*y4 + b*y5
z-z1 = a*z4 + b*z5

有第一個公式得出:
a = (x - x1 - b*x5)/x4
  => x/x4 - x1/x4 - b*x5/x4

將a的轉換公式代入第二個公式:
y-y1 = (x/x4 - x1/x4 - b*x5/x4)*y4 + b*y5
     => x*y4/x4 - x1*y4/x4 - b*x5*y4/x4 + b*y5
     => x*y4/x4 - x1*y4/x4 + b*(y5 - x5*y4/x4)
得出:
b = (y - y1 - x*y4/x4 + x1*y4/x4)/(y5 - x5*y4/x4)

將a的轉換公式代入第三個公式:
z-z1 = (x/x4 - x1/x4 - b*x5/x4)*z4 + b*z5
     => x*z4/x4 - x1*z4/x4 - b*x5*z4/x4 + b*z5
     => x*z4/x4 - x1*z4/x4 + b*(z5 - x5*z4/x4)

將b的轉換公式代入第三個公式得到:
z-z1 = x*z4/x4 - x1*z4/x4  + ((y - y1 - x*y4/x4 + x1*y4/x4)/(y5 - x5*y4/x4))*(z5 - x5*z4/x4)
     => x*z4/x4 - x1*z4/x4  + ((y - y1 - x*y4/x4 + x1*y4/x4)/(y5 - x5*y4/x4))*(z5 - x5*z4/x4)
     => x*z4/x4 - x1*z4/x4  + ((y - y1 - x*y4/x4 + x1*y4/x4)/(y5 - x5*y4/x4))*(z5 - x5*z4/x4)

設(y5 - x5*y4/x4) 為 k
設(z5 - x5*z4/x4) 為 j
設(x1*y4/x4- y1)  為 l

z-z1 => x*z4/x4 - x1*z4/x4  + ((y  - x*y4/x4 + l)/k)*j  
     => x*z4/x4 - x1*z4/x4  + y*j/k - x*y4*j/(x4*k) + l*j/k

所以平面公式為:
-x*z4/x4 + x1*z4/x4  - y*j/k + x*y4*j/(x4*k) - l*j/k + z - z1 = 0

將常量放到公式末尾:
x*(y4*j/(x4*k) - *z4/x4) - y*j/k + z + (x1*z4/x4 - l*j/k - z1) = 0

所以
A = j*y4/(x4*k) - z4/x4
B = -j/k
C = 1
D = x1*z4/x4 - l*j/k - z1

對應的程式就非常簡單了. 自己寫就行了.

  後來才發現, 上面的方法, 在求任何兩個點的x座標和y座標都不相同的時候, 是可以的, 但是如果有相同的情況, 那就處理不了了. 所以還是需要採用線性代數的方式進行求解.  Matrix類型如下:/Files/dunnice/Matrix.txt 具體求解的代碼如下:/Files/dunnice/GeometryHelper.txt 這個確實好使. 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.