判断点是否属于 3D 中的射线 space
Tell if point belongs to ray in 3D space
我有这个问题:验证点是否属于 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,而如前所述,它们应该有不同的距离。我将不胜感激任何帮助、澄清等。
您的代码计算到 无限线 的距离(看起来不错),所以在这两种情况下,点都在线上(本质上是同一条线)。
编辑:请注意,在第二种情况下,点位于射线上,而不是在第一种情况下,正如 Amir Krasnic 在评论中注意到的那样。
要检查 P 的投影是否在射线上,计算 EP 和 V 的标量(点)积并查看其符号。
如果为正,则P的投影落在射线上,d = vectorsEpVMagnitude / dirVectorMagnitude;
为有效结果
如果负数 - 点位于射线后面(后面?),在这种情况下只需计算 EP 长度
我有这个问题:验证点是否属于 3D 射线。经过一些数学研究,我编写了解决方案,但它似乎行不通。
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,而如前所述,它们应该有不同的距离。我将不胜感激任何帮助、澄清等。
您的代码计算到 无限线 的距离(看起来不错),所以在这两种情况下,点都在线上(本质上是同一条线)。
编辑:请注意,在第二种情况下,点位于射线上,而不是在第一种情况下,正如 Amir Krasnic 在评论中注意到的那样。
要检查 P 的投影是否在射线上,计算 EP 和 V 的标量(点)积并查看其符号。
如果为正,则P的投影落在射线上,d = vectorsEpVMagnitude / dirVectorMagnitude;
为有效结果
如果负数 - 点位于射线后面(后面?),在这种情况下只需计算 EP 长度