![]() |
|
![]() ![]() ![]() |
|
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Есть два прямоугольника с координатами. Надо найти входит ли второй в координаты первого.
Первый прямоугольник M имеет координаты сторон MT MR MB ML Второй прямоугольник C имеет координаты сторон CT CR CB CL T,R,B,L - top, right, bottom, left Что у меня выходит: ((ML<CL<MR) И ((MT<CT<MB) ИЛИ (MT<CB<MB))) ИЛИ ((ML<CR<MR) И ((MT<CT<MB) ИЛИ (MT<CB<MB))) Вроде как два раза проходила логику в Школе и в Институте, но не могу вспомнить правила упрощения. Здесь есть повторяющийся блок. Как его правильно вынести? -------------------- Скажи миру - НЯ! |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
А почему равенство не используешь?
Ты не допускаешь, что у них может быть общая грань? Или одна из вершин внутреннего прямоугольника может лежать на грани внешнего? Замени отдельные условия на буквы, которые явно визуально повторяются, т.е. формально MT<CB<MB = А, которое принимает два значения True или False и я думаю сразу сможешь увидеть что и как упростить. Просто работать с операциями меньше/больше не удобно, их проще обозначать через буквы и там уже глядишь и решение приходит более простое ;) -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Проверять-ли равенство зависит от условий задачи, а именно от того, что определяется словом "входит". Если общая грань считается вхождением, то вместо < или > надо использовать <= или =>. Вот и все. В остальном же сложность проверки зависит исключительно от того параллельны ли прямоугольники.
Если параллельны, то все предельно просто. Сначала, если надо, поворачиваем систему координат параллельно прямоугольникам. Потом проверяем. ML<CL И MT<CT И CB<MB И CR<MR Если же прямоугольники непараллельны, то можно, например, развернуть систему координат по отношению к первому прямоугольнику, описать вокруг второго прямоугольника дополнительный прямоугольник параллельный первому и дальше считать по первому варианту. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20580 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
(MT-CT)*(MB-CB)<=0
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Akina, выглядит, конечно, красивее, но если уж доводить до абсолюта, то булево выражение должно работать быстрее:
(ML<CL) && (CB<MB) (ML<CL) && (CR<MR) жутко извиняюсь за ошибку в символах ![]() Это сообщение отредактировал(а) _Y_ - 24.9.2012, 12:24 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20580 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
А всё равно для решения исходной задачи ни то, ни другое в чистом виде непригодно. Представь крест...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
rodnover |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: нет Всего: 10 |
Попробовать решить обратную задачу. Она проще.
(CM < ML) or (CR > MR) or (CT > MT) or (CB < MB) - если это условие верно, то второй прямоугольник не входит в первый.
|
|||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
DarkProg, Допускаю, упустила из виду.
Раставила буквы, вышло: (A И (C ИЛИ D)) ИЛИ (B И (C ИЛИ D)) Упростила, но не совсем уверена в правоте, так правильно: (A ИЛИ B) И (C ИЛИ D) ? Добавлено через 1 минуту и 49 секунд _Y_, В каком плане параллельны? Параллельны ли стороны вроде ML / CL? Да параллельны. Ну то есть по оси никак не повёрнуты. Добавлено через 7 минут и 6 секунд Не совсем понимаю данную формулу. Она не полна или мне кажется? Так или иначе, я просто подставила туда цифры, и результат не верен. Возможно моя вина, я не совсем верно выразилась, но имеет ввиду, не то, что фигура Б должна быть полностью внутри фигуры А, хватить любое соприкосновение. Добавлено через 8 минут и 52 секунды Согласна, но наврятли её так просто запихнуть потом в запрос SQL ![]() -------------------- Скажи миру - НЯ! |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20580 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Это полное покрытие по одной координате. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Я так и предполагала.
Оно верно. Сделала по старинке, как в школе, расчертила сетку с строками от 0000 до 1111 для обоих вариантов, результат 100% совпадение. Потом глянула, а что же это будет в начальных вариаблах, и тут вырисовывается легкое читаемое "Если сторона левая либо сторона правая входят в прямоугольник, а так же либо сторона верхняя либо сторона нижняя тоже туда входят" поняв простоту, хлопнула себя по лбу. Простота ведь была рядом, прям на ладони -------------------- Скажи миру - НЯ! |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
ИМХО если любые две стороны принадлежащие двум прямоугольникам параллельны друг другу, то прямоугольники параллельны. У Вас, в придачу, прямоугольники еще и параллельны системе координат - даже поворачивать ничего не нужно. Давайте я Вам картинку нарисую, чтобы понятнее было. Зеленые линии - система координат с нулем в верхнем левом углу. ![]() Вхождение одного прямоугольника в другой описывается четырьмя условиями. Несоблюдение любого из них указывает на то, что внутренний прямоугольник не входит во внешний. Поэтому условия обединяются операторами AND. Сколь помню SQL, такое объединение будет работать довольно быстро, поскольку несоблюдение первого же условия отменит необходимость проверки последующих. Понятно, что если стороны внутреннего и внешнего прямоугольника имеют право совпадать, знаки больше-меньше должны быть заменены на >= и <=. В моем посте выше именно все это и было описано, но для проверки только по одной оси т.к. проверка по осям производится одинаково. Но я, к сожалению, перепутал символы, за что и жутко извиняюсь. Надо (ML<CL) && (CR<MR) Это сообщение отредактировал(а) _Y_ - 24.9.2012, 12:23 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
rodnover |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: нет Всего: 10 |
||||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Долго коробило, не могла понять, теперь поняла. Так ведь вы этой формулой находите всё что угодно. Как бы объяснить. Ну как минимум сравнение двух координат надо ведь, иначе как-то странно. Опять сама запуталась. Не могу объяснить, но в голове не укладывается, всё почему-то говорит за то, что результат будет неверный. Человеческими словами это как будет? -------------------- Скажи миру - НЯ! |
|||
|
||||
rodnover |
|
||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: нет Всего: 10 |
Как я понял из вашего первого сообщения
Пусть есть 2 прямоугольника ABCD
и EFGH
Условие, по которому левая грань треугольника EFGH выходит за границу ABCD
Аналогично для верхней, правой, нижней, соответственно:
Если, хотя бы, одна грань прямоугольника EFGH выходит за границу прямоугольника ABCD,то EFGH не входит в ABCD. Следовательно, все остальные прямоугольники, не попавшие под это условие выполняют требуемое условие. В итоге получаем код приведенный мною выше
где C.L аналогично CL, в рассуждениях выше, C.B - CB и так далее. Код получает все прямоугольники, кроме тех, в которых EFGH хотя бы одной гранью выходит за ABCD. |
||||||||||||
|
|||||||||||||
_Y_ |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Объясните мне, пожалуйста, чем этот код лучше вот такого?
По мне, так здесь на одну операцию отрицания меньше. animegirl, обратите внимание, что здесь мы пишем в традиционных координатах, а не в компьютерных с нулем вверху (как на моем рисунке). -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
||||
|
||||
rodnover |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: нет Всего: 10 |
_Y_, В общем случае ничем. Один из законов логического преобразования. Главное, чтобы, что в том, что в другом случае, соблюдались условия:
|
|||
|
||||
animegirl |
|
||||||||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Про координаты, я поняла, а вот про алгоритм не совсем, у вас там три раза И а у меня ( ИЛИ ) И ( ИЛИ ) Не могу понять, толи одна из формул не верна, толи вы ищите ПОЛНОЕ вхождение одной фигуры в другую, что не есть верно. -------------------- Скажи миру - НЯ! |
||||||||
|
|||||||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20580 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
WTF? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Три раза И - вхождение, три раза ИЛИ - невхождение. Может вам не вхождение надо описывать, а наличие частичного пересечения фигур? Тогда все будет иначе, конечно, но это уже совсем другая задача. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
Да, именно так, я не верно выразилась, вроде бы несколько раз поправлялась, но видимо всё равно не верно ![]() -------------------- Скажи миру - НЯ! |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20580 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Так это в принципе другая задача.... Наличие пересечения по одной координате легко определяется значением (вернее, знаком) выражения (ML-CR)*(MR-CL), то же и по другой координате. Чтобы прямоугольники пересекались, должны пересекаться проекции по обеим осям одновременно. Правда, если при вычислении выражения получен ноль, нельзя определить, это внешнее касание или внутреннее наложение. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
animegirl, эту новую задачу тоже можно записать в Булевых выражениях. Но, в этом случае, Булевы условия будут гораздо длиннее того, что предложил Akina. Расписывать?
Можно еще сдалать что-нибудь неожиданно-глупо-оригинальное. Скорее всего, работающее гораздо медленнее, но, зато, прикольнее ![]() -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
animegirl |
|
|||
![]() Незнайка на Марсе ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 24.7.2011 Репутация: нет Всего: нет |
_Y_, Да, очень хочу посмотреть какие ещё есть варианты.
Не поняла, что это и как это ![]() -------------------- Скажи миру - НЯ! |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20580 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Что непонятно? где какая координата? или в каком порядке вычитать и умножать? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Если обе разности отрицательны или обе разности положительны, то результат положителен. Если одна отрицательна, другая положительна, то отрицателен. Давайте рассмотрим всемварианты по одной из осей. Во всех вариантах, естественно, ML < MR и CL < CR.
Это выражение по одной из осей. Вам нужно рассматривать две (прямоугольник - двухмерная фигура), но принцип тот же. Про булев вариант позже распишу. Спать хоца -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |