我有三个向量 V1、V2 和 V3。它们的原点在轴的原点上。从V1逆时针移动到V2,如何判断V3是否在V1和V2之间?
alt text http://www.freeimagehosting.net/uploads/1448ea8896.jpg
无法通过获取它们的角度和评估这些条件(伪代码)来完成:
if angle(V3) > angle(V1) && angle(V3) < angle(V2)
printf("V3 is between V1 and V2")
else
printf("out of the interval")
要看出它的缺陷,假设 angle
函数给出 [-pi pi] 范围内的角度。所以,如果 angle(V1) = 120(以度为单位)、angle(V2) = -130 和 angle(V3) = 150 那么答案(根据上面的代码)是“超出间隔”,尽管如果你四处走动从V1逆时针到V2,在它们之间。
你可能会建议将 2*pi 添加到 angle(V2) 或类似的东西,但我已经尝试过这样的事情,但它不起作用。
我在 MATLAB 中编程。
编辑 1:它是二维的。
最佳答案
由于您是在 MATLAB 中执行此操作,因此这里有一个应该可行的解决方案:
crossProds = [V1(1)*V2(2)-V1(2)*V2(1) ...
V1(1)*V3(2)-V1(2)*V3(1) ...
V3(1)*V2(2)-V3(2)*V2(1)];
if (all(crossProds >= 0) || ...
(crossProds(1) < 0) && ~all(crossProds(2:3) < 0)),
disp("V3 is between V1 and V2");
else
disp("out of the interval");
end
解释:
二维向量 V1 和 V2 之间的叉积存储在 crossProds 的第一个元素中。如果 V1 和 V2 之间的逆时针角度介于 0 度和 180 度之间(含 0 度和 180 度),则此值将大于或等于零。在这种情况下,当 V3 在逆时针方向上位于 V1 和 V2 之间时,叉积 (V1,V3) 和 (V3,V2) 也大于或等于零。这解释了第一个逻辑检查:
all(crossProds >= 0)
如果 V1 和 V2 之间的逆时针角度大于 180 度,则这两个向量的叉积将小于零。在这种情况下,当V3在顺时针方向上位于V1和V2之间时,叉积 (V1,V3) 和(V3,V2) 也小于零。因此,如果这些叉积不都小于零,则 V3 必须在 V1 和 V2 之间逆时针方向。这解释了接下来的两个逻辑检查:
(crossProds(1) < 0) && ~all(crossProds(2:3) < 0)
以上逻辑检查应该涵盖所有可能的情况。运算符 || && 是 short circuit operators在 MATLAB 中:如果不需要,他们将跳过第二个语句。例如,如果 OR 中的第一个语句为真,则没有理由检查第二个语句,因为 OR 中只有一个参数需要为真才能使结果为真。
关于matlab - 从V1逆时针转到V2,如何判断V3是否在V1和V2之间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/693806/