#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
}