matlab - 从V1逆时针转到V2,如何判断V3是否在V1和V2之间?

标签 matlab vector geometry angle

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

解释:

二维向量 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)

以上逻辑检查应该涵盖所有可能的情况。运算符 || && 是 short circuit operators在 MATLAB 中:如果不需要,他们将跳过第二个语句。例如,如果 OR 中的第一个语句为真,则没有理由检查第二个语句,因为 OR 中只有一个参数需要为真才能使结果为真。

关于matlab - 从V1逆时针转到V2,如何判断V3是否在V1和V2之间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/693806/

相关文章:

algorithm - 用于生成三次样条轨迹(不是插值)的库?

three.js - 如何使用顶点在三个js中绘制多边形?

Matlab:保存后翻转图例顺序和图例重叠图

r - 从R中的向量中提取交替序列

matlab - 按顺序从向量中随机选择子集(Matlab)

c++ - 如何使用vector <vector <int >>找到严格位于矩阵次对角线上的元素之和?

C++ 使用 QuickSort 对数组结构进行排序

ios - 在 objective-c 中对多边形进行三角剖分

arrays - 如何从矩阵中删除重复行

matlab - MATLAB 中的高效数组预分配