gpt4 book ai didi

c++ - 判断点是否属于 3D 空间中的射线

转载 作者:行者123 更新时间:2023-11-30 02:24:22 26 4
gpt4 key购买 nike

我有这个问题:验证点是否属于 3D 中的射线。经过一些数学研究,我编写了解决方案,但它似乎行不通。 就是这个例子。 P 是重点。 E - 射线的终点。 V - 射线的方向 vector 。

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 的投影是否在射线上,请计算 EPV 的标量(点)积并查看其符号。

如果为正,则P的投影在射线上,d = vectorsEpVMagnitude/dirVectorMagnitude;为有效结果

如果负数 - 点位于射线后面(后面?),在这种情况下只需计算 EP 长度

关于c++ - 判断点是否属于 3D 空间中的射线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com