当前位置:  开发笔记 > 编程语言 > 正文

逆时针从V1到V2时,如何判断V3是否介于V1和V2之间?

如何解决《逆时针从V1到V2时,如何判断V3是否介于V1和V2之间?》经验,为你挑选了1个好方法。

我有三个向量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.



1> gnovice..:

既然你在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矢量V1V2之间的叉积存储在crossProds的第一个元素中.如果V1V2之间的逆时针角度在0到180度之间(包括0和180度),则该值将大于或等于零.在这种情况下,当V3在逆时针方向上在V1V2之间时,则叉积(V1,V3)(V3,V2)也大于或等于零.这解释了第一次逻辑检查:

all(crossProds >= 0)

如果V1V2之间的逆时针角度大于180度,那么这两个矢量的叉积将小于零.在这种情况下,当V3顺时针方向上在V1V2之间时,则叉积(V1,V3)(V3,V2)也小于零.因此,如果这些交叉积小于零,则V3必须在逆时针方向上在V1V2之间.这解释了接下来的两个逻辑检查:

(crossProds(1) < 0) && ~all(crossProds(2:3) < 0)

上述逻辑检查应涵盖所有可能的情况.运营商|| 和&&是MATLAB中的短路运算符:如果没有必要,它们将跳过第二个语句.例如,如果OR中的第一个语句为true,则没有理由检查第二个语句,因为OR中只有一个参数需要为true才能使结果为true.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有