Как я могу узнать, пересекаются ли две линии?

#javascript #geometry #boolean-logic

#javascript #геометрия #логическая логика

Вопрос:

Моя функция принимает два объекта, которые представляют строки, и должна возвращать, перекрываются они или нет.

Перекрывающиеся возвраты true , но не перекрывающиеся, похоже, не возвращаются false .

Есть идеи, почему?

 function checkOverlap (line1, line2) {
  if (line2.start <= line1.end || line1.start <= line2.end) {
    return true;
  } else {
    return false;
  }
}
 

Комментарии:

1. Какой код вы пробовали?

Ответ №1:

Вы должны проверить, находится ли начало одной строки между началом и концом другой строки.

   if((line2.start <= line1.end amp;amp; line2.start >=line1.start) || (line1.start <=line2.end amp;amp; line1.start >= line2.start)) { 
       return true;
    }
 

Комментарии:

1. Спасибо. Я попробовал ваш оператор if и добавил else (else: false). Это дает мне «истинный» результат для «перекрытия», но не ложный результат для «не перекрывается». Должен ли я что-либо делать с моим оператором else?

2. Я отредактировал. Теперь он проверяет, находится ли начало одной строки между началом и концом другой строки.

3. Потрясающе. Большое спасибо.

Ответ №2:

Я думаю, что это самая простая логика, которая работает.

A.start <= B.end amp;amp; B.start <= A.end

Легко понять, почему это имеет смысл, если вы рассматриваете некоторую точку X, которая существует в обоих диапазонах (при условии перекрытия)…

 A    (start)-------- X --------(end)
B        (start)---- X -------------(end)
 

Представьте, что вы перемещаете начало и конец с требованием, чтобы они не могли пересекать X (если это произойдет, то X больше не будет в обоих диапазонах). Становится довольно легко увидеть, что начало всегда находится перед концом B и наоборот.

Вы можете настроить <= в < зависимости от того, как вы хотите обрабатывать края.

 console.clear()
let l = console.log

function checkOverlap(A, B){
  return (A.start <= B.end amp;amp; B.start <= A.end)
}

// Checking All combinations
l(checkOverlap({start: 0, end: 2},{start: 3, end: 5})) // false
l(checkOverlap({start: 0, end: 4},{start: 3, end: 5})) // true
l(checkOverlap({start: 0, end: 6},{start: 3, end: 5})) // true

l(checkOverlap({start: 3, end: 5},{start: 0, end: 2})) // false
l(checkOverlap({start: 3, end: 5},{start: 0, end: 4})) // true
l(checkOverlap({start: 3, end: 5},{start: 0, end: 6})) // true 

Ответ №3:

Вы должны убедиться, что line2.start находится на line1, но не в конце, или line1.start находится на line2, но не в его конце.

 if ( (line2.start >= line1.start and line2.start < line1.end)
     OR (line1.start >= line2.start and line1.start < line2.end) ) {
    // We have an overlap
}