/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 這個確實好使.