gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:32:34 24 4
gpt4 key购买 nike

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

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