我有这个问题:验证点是否属于3D中的光线。经过一些数学研究,我已经编写了解决方案,但它似乎无法正常工作。 这就是说明。 P 是重点。 E - 光线的终点。 V - 射线的方向矢量。
double x, y, z, e1, e2, e3, v1, v2, v3, d, xVectorFromEToP,
dirVectorMagnitude, vectorEPMagnitude, yVectorFromEToP, zVectorFromEToP,
cpX, cpY, cpZ;
cin >> x >> y >> z >> e1 >> e2 >> e3 >> v1 >> v2 >> v3;
// HERE I'M FORMING THE EP vector - from point P to end-point E
xVectorFromEToP = x - e1;
yVectorFromEToP = y - e2;
zVectorFromEToP = z - e3;
//HERE I'M CALCULATING CROSS-PRODUCT of THE VECTORS: EP and V
cpX = ((v2 * zVectorFromEToP) - (v3 * yVectorFromEToP));
cpY = ((v1 * zVectorFromEToP) - (v3 * xVectorFromEToP)) * -1;
cpZ = ((v1 * yVectorFromEToP) - (v2 * xVectorFromEToP));
// HERE I'M CALCULATING MAGNITUDES OF THOSE VECTORS AND DEBUGGING IN COUT
vectorsEpVMagnitude = sqrt(pow(cpX, 2) + pow(cpY, 2) + pow(cpZ, 2));
dirVectorMagnitude = sqrt(pow(v1, 2) + pow(v2, 2) + pow(v3, 2));
cout << "EP: " << vectorsEpVMagnitude << endl;
cout << "dir: " << dirVectorMagnitude << endl;
// final formula for calculating distance
d = vectorsEpVMagnitude / dirVectorMagnitude;
// precision is 1e-8: 1 means belong, otherwise - 0;
if (d < 1e-8) {
cout << "distance: " << d << endl;
cout << 1;
} else {
cout << "distance: " << d << endl;
cout << 0;
}
我有样品输入:1)P(2.0 1.0 0.0),E(2.0 1.0 1.0),V(0.0 0.0 1.0)应为0;
2)P(2.0 1.0 0.0),E(2.0 1.0 1.0),V(0.0 0.0 -1.0)应为1!
然而,它们都有距离等于0,而如上所述它们应该有不同的距离。我将不胜感激任何帮助,澄清等等。
答案 0 :(得分:3)
您的代码计算到无限行的距离(看起来很好),因此在这两种情况下,点位于该行上(基本上它是同一行)。
编辑:请注意,在第二种情况下,点位于光线上,而不是第一种情况,正如Amir Krasnic在评论中注意到的那样。
要检查P的投影是否位于光线上,请计算 EP 和 V 的标量(点)积并查看其符号。
如果是正数,则P的投影位于光线上,d = vectorsEpVMagnitude / dirVectorMagnitude;
是有效结果
如果负点位于光线后面(后面?),在这种情况下只计算 EP 长度