我有三个向量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]范围内的角度.因此,如果角度(V1)= 120(度),角度(V2)= -130,角度(V3)= 150,那么答案(根据上面的代码)是"超出间隔",但如果你四处走动逆时针从V1到V2,它们介于它们之间.
您可能建议将2*pi添加到角度(V2)或类似的东西,但我已经尝试过这样的东西而且它不起作用.
我在MATLAB中编程.
编辑1:它是2D.
既然你在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
说明:
2-D矢量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)
上述逻辑检查应涵盖所有可能的情况.运营商|| 和&&是MATLAB中的短路运算符:如果没有必要,它们将跳过第二个语句.例如,如果OR中的第一个语句为true,则没有理由检查第二个语句,因为OR中只有一个参数需要为true才能使结果为true.