Поскольку вы делаете это в 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 градусов включительно. В этом случае, когда 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: они пропустят вторые операторы, если в них нет необходимости. Например, если первый оператор в операторе «ИЛИ» имеет значение «истина», нет смысла проверять второй оператор в операторе «ИЛИ», поскольку для истинного результата требуется только один аргумент в операторе «ИЛИ».