Как определить, является ли V3 между V1 и V2, когда мы идем от V1 до V2 против часовой стрелки?

Я добавил код согласно вашему эталонному изображению. Вы можете настроить высоту announce и header по желанию.

.announce {
    height: 45px;
    width: 100%;
    position: relative;
}

.header {
    background: blue;
    width: 100%;
    height: 50px;
}

.header img {
    max-width: 100%;
    max-height: 50px;
}
<div class="announce">
    <div class="header">
        <img src="https://via.placeholder.com/300x100">
    </div>
</div>

6
задан Bill the Lizard 19 September 2012 в 12:34
поделиться

4 ответа

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

8
ответ дан 9 December 2019 в 22:39
поделиться

Вычислите угол (V1), угол (V2) и угол (v3) (a1, a2, a3).

Измените a2, и a3 (добавьте 2*pi в случае необходимости) так, чтобы

a1 <= a2 < a1 + 2*pi
a1 <= a3 < a1 + 2*pi

Теперь просто необходимо сравнить a2 и a3. V3 между V1, и V2 заканчивается, a3 является нижним к a2.

3
ответ дан 9 December 2019 в 22:39
поделиться

V1 является отвлекающим маневром. Вы просто собираетесь смутить себя, думая приблизительно 3 угла сразу.

  1. Поверните все по часовой стрелке на угол (V1)
  2. Нормализуйте оставление двумя углами к [0,360),

Теперь вопрос состоит в том, чтобы просто сравнить норму (угол (V2) - угол (V1)) и норму (угол (V3) - угол (V1)).

2
ответ дан 9 December 2019 в 22:39
поделиться

Для тестирования этого условия, необходимо вычислить обмотку двух треугольников:

  1. Треугольник сформирован V1, источником и V3. Этот треугольник должен быть против часовой стрелки.

  2. Треугольник сформирован V3, источником и V2. Этот треугольник должен быть против часовой стрелки также.

Для тестирования обмотки треугольника, достаточно проверить знак 2D векторного произведения вершин.

Тест похож на это (извините - C-код):

int IsBetween (vector v1, vector v2, vector v3)
{
  float winding1 = (v1.x * v3.y - v1.y * v3.x);
  float winding2 = (v3.x * v2.y - v3.y * v2.x);

  // this test could be exactly the wrong way around. This depends
  // on how you define your coordinate system (e.g. is Y going up or down?)

  if ((winding1 <0) && (winding2 < 0))
  {
    printf ("V3 is between them\n");
  }
  else
  {
    printf ("it's not\n");
  }
}
-2
ответ дан 9 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: