在深入我的旧微积分后,我发现这个问题的数学答案。
既然我已经得到了在空间中的三个点,我可以形成一个平面:
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