Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.07.2012, 13:58
Den_root вне форума Посмотреть профиль Отправить личное сообщение для Den_root Найти все сообщения от Den_root
  № 1  
Ответить с цитированием
Den_root

Регистрация: Feb 2012
Сообщений: 36
По умолчанию Вхождение числового диапазона в другой числовой диапазон.

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

Старый 07.07.2012, 14:04
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
что из себя прдеставляет числовой диапазон? Наверное массив или вектор, а занчит
Код 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;
}
__________________
Марк Tween

Старый 07.07.2012, 14:20
Den_root вне форума Посмотреть профиль Отправить личное сообщение для Den_root Найти все сообщения от Den_root
  № 3  
Ответить с цитированием
Den_root

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

Старый 07.07.2012, 14:33
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
На самом деле задача решается за O(1), а не за O(n^2), как было предложено выше

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

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

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


Последний раз редактировалось wvxvw; 07.07.2012 в 14:47.
Старый 07.07.2012, 14:36
KBAC вне форума Посмотреть профиль Отправить личное сообщение для KBAC Найти все сообщения от KBAC
  № 5  
Ответить с цитированием
KBAC
 
Аватар для KBAC

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
Код AS3:
if ((a1 < b2 && a1 > b1) || (a2< b2) && (a2>b1))
или как предложил wvxvw
Код AS3:
if ((a1 < b2) && (b1 < a2))
что, конечно, правильней
__________________
Будь проще.


Последний раз редактировалось KBAC; 07.07.2012 в 14:43.
Старый 07.07.2012, 20:20
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 6  
Ответить с цитированием
Krusty

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


Последний раз редактировалось Krusty; 07.07.2012 в 20:22.
Старый 07.07.2012, 22:00
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Или вот:
Код AS3:
(max2 - min1) > (max1 - min1) + (max2 - min2); // true — не пересепкаются
__________________
Поймай яблоко 2!

Старый 08.07.2012, 15:26
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Чтобы опровергнуть формально валидное утверждение нужно продемонстрировать хтоя бы один случай, когда это утверждение не верно. Для этого рассмотрим все возможные случаи для интервалов 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')

Что и требовалось доказать.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 08.07.2012 в 15:33.
Старый 09.07.2012, 13:37
KBAC вне форума Посмотреть профиль Отправить личное сообщение для KBAC Найти все сообщения от KBAC
  № 9  
Ответить с цитированием
KBAC
 
Аватар для KBAC

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
Цитата:
Сообщение от Krusty Посмотреть сообщение
Еще надо проверить на то, что интервалы заданы верно, то есть (нижняя граница, верхняя граница)
Иначе не сработает.
Второй вариант, который предложил 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, время: 20:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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