Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вхождение числового диапазона в другой числовой диапазон. (http://www.flasher.ru/forum/showthread.php?t=181954)

Den_root 07.07.2012 13:58

Вхождение числового диапазона в другой числовой диапазон.
 
Подскажите, как проверить "пересекаются" ли числовые диапозоны А и В ? Скажем, A(5-8) B(6-10) == true, A(-1-4) B(-12 - -3) == false и .т.д

in4core 07.07.2012 14:04

что из себя прдеставляет числовой диапазон? Наверное массив или вектор, а занчит
Код AS3:

for(var i:int = 0; i < a1.length; i++)  
{
    var a:unt = a1[i]
    for(var j:int = 0 ; j < a2.length; j++)  if(a2[j] == a) return true;
}


Den_root 07.07.2012 14:20

in4core
Все гораздо примитивней:) Диапозон представлен двумя числами началом и концом. Первое число всегда меньше другого. Это, если угодно, отрезки на числовой оси и нужно проверить пересекаются ли они. Т.е. нужно условие для if().

wvxvw 07.07.2012 14:33

На самом деле задача решается за O(1), а не за O(n^2), как было предложено выше :)

На сравнение диапазонов можно посмотреть так: если нижняя граница одного из диапазонов больше верхней границы другого диапазона - тогда они не пересекаются. Во всех остальных случаях - пересекаются.

Т.е. пусть диапазоны будут AB и A'B', тогда: A < B' ⋏ A' < B → диапазоны пересекаются.

Для ваших примеров:
5 < 10 и 6 < 8 → истина
-1 < -3 → ложь.

KBAC 07.07.2012 14:36

Код AS3:

if ((a1 < b2 && a1 > b1) || (a2< b2) && (a2>b1))

или как предложил wvxvw
Код AS3:

if ((a1 < b2) && (b1 < a2))

что, конечно, правильней

Krusty 07.07.2012 20:20

Еще надо проверить на то, что интервалы заданы верно, то есть (нижняя граница, верхняя граница)
Иначе не сработает.
Второй вариант, который предложил KBAC, неверный.

Zebestov 07.07.2012 22:00

Или вот:
Код AS3:

(max2 - min1) > (max1 - min1) + (max2 - min2); // true — не пересепкаются


wvxvw 08.07.2012 15:26

Чтобы опровергнуть формально валидное утверждение нужно продемонстрировать хтоя бы один случай, когда это утверждение не верно. Для этого рассмотрим все возможные случаи для интервалов AB и A'B'. В условии задачи уже было сказано, что A < B и A' < B', поэтому учитывать варианты, где это не происходит нам не нужно. Остается:

(1) Интервал AB целиком расположен перед A'B', другими словами: B < A'.
(2) Интервал AB частично совпадает с A'B' таким образом, что A' принадлежит интервалу AB, другими словами: A' ≥ A && A' ≤ B.
(3) Интервал AB полностью принадлежит интервалу A'B', другими словами: A ≥ A' && B ≤ B'.
(4) Интервал AB полностью включает в себя интервал A'B', другими словами: A ≤ A' && B ≥ B'.
(5) Интервал AB частично совпадает с интервалом A'B' таким образом, что B' принадлежит интервалу AB, а A' - нет. Другими словами, B' ≥ A && B' ≤ B.
(6) Интервал AB полностью расположен за интервалом A'B', другими словами A > B'.

Теперь мы можем объединить все случаи (не обращая внимание на то, что они симметричны, и нам нужна только половина - для простоты). У нас есть всего два случая, когда интервалы не имеют общих точек (1) и (6):

(B < A') || (A > B')

Воспользовавшись преобразованием де Моргана:

!((B < A') || (A > B')) = (B ≥ A') && (A ≤ B')

Что и требовалось доказать.

KBAC 09.07.2012 13:37

Цитата:

Сообщение от Krusty (Сообщение 1087714)
Еще надо проверить на то, что интервалы заданы верно, то есть (нижняя граница, верхняя граница)
Иначе не сработает.
Второй вариант, который предложил KBAC, неверный.

Ну давайте тогда так:
Код AS3:

if ((Math.min(a1, a2) < Math.max(b1, b2)) && ((Math.min(b1, b2) < Math.max(a1, a2))))

ну и имелись в виду диапазоны (a1, a2) и (b1, b2)


Часовой пояс GMT +4, время: 22:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.