在深入我的舊微積分後,我發現這個問題的數學答案。
既然我已經得到了在空間中的三個點,我可以形成一個平面:
P: (Px, Py, Pz)
Q: (Qx, Qy, Qz)
R: (Rx, Ry, Rz)
這些點並在這裏http://tutorial.math.lamar.edu/Classes/CalcIII/EqnsOfPlanes.aspx描述的數學讓我向前走。
Vector(PQ) = (PQx, PQy, PQz)
Vector(PR) = (PRx, PRy, PRz)
現在我申請的交叉產品,這兩個向量,這給(這裏所描述的跨產品的數學:http://tutorial.math.lamar.edu/Classes/CalcII/CrossProduct.aspx#Vectors_CrossProd_Ex2)
平面的法向量
Vector(PQ) x Vector(PR) = Vector(PQy * PRz - PQz * PRy,
PQz * PRx - PQx * PRz,
PQx * PRy - PQy * PRx)
所以,這就是我得趕緊爲平面方程,不尊重,它必須通過槽的要點之一:
x(PQy * PRz - PQz * PRy) + y(PQz * PRx - PQx * PRz) + z(PQx * PRy - PQy * PRx) = 0
要得到充分方程式我的飛機通過了所有的點,我必須應用一個點,如第一個鏈接中的示例1所述。
x(PQy * PRz - PQz * PRy) + y(PQz * PRx - PQx * PRz) + z(PQx * PRy - PQy * PRx) =
Px(PQy * PRz - PQz * PRy) + Py(PQz * PRx - PQx * PRz) + Pz(PQx * PRy - PQy * PRx)
要將我的例子,這個公式我得到下面的公式:
P: (90, 6, 5)
Q: (70, 6, 6)
R: (70, 8, 7)
Vector(PQ) = (20, 0, -1)
Vector(PR) = (20, -2, -2)
這些跨產品給了我這個公式:
-2x + 20y - 40z = 0
如果我現在申請點P到這我可以得到我的飛機的完整方程式:
-2x + 20y - 40z = -2 * 90 + 20 * 6 - 40 * 5
-2x + 20y - 40z = -260
z = (-2x + 20y + 260)/40
當我尋找其中x = 6和y = 80的z值時,我將這些值放入等式中。
x = 80
y = 6
z = (-2 * 80 + 20 * 6 + 260)/40
z = 5.5
5.5是這個例子中,預期的答案,因爲它正好在P和Q
最終實現該算法的中間:
float TargetSpeed::PlaneInterpolation(Point3D p, Point3D q, Point3D r, int x, int y)
{
Point3D pq = Point3D(p.X - q.X, p.Y - q.Y, p.Z - q.Z);
Point3D pr = Point3D(p.X - r.X, p.Y - r.Y, p.Z - r.Z);
Point3D n = Point3D(pq.Y * pr.Z - pq.Z * pr.Y,
pq.Z * pr.X - pq.X * pr.Z,
pq.X * pr.Y - pq.Y * pr.X);
float d = n.X * p.X + n.Y * p.Y + n.Z * p.Z;
float z = (d - n.X * (float)x - n.Y * (float)y)/n.Z;
return z;
}
歡迎stackoverflow.com。請花些時間閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以問些什麼話題?」]的章節(http://stackoverflow.com/help/)討論話題)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。請參閱[tour](http://stackoverflow.com/tour)並閱讀[如何提出良好問題](http://stackoverflow.com/help/how-to-ask)。最後,請學習如何創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Weaboo
我並不是要求一個完整的解決方案,只是一個指向用來着色多邊形的算法的指針。 – user2135792
檢查答案,並讓我知道它是否有幫助。 – Weaboo