![]() |
|
Модераторы: Poseidon |
![]()
|
|
| InviZible |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 13.9.2006 Репутация: нет Всего: нет |
Даны 2 множества точек(берутся из 2-х текстовиков) на плоскости. Выбрать 4-те точки первого множества так, чтобы квадрат с вершинами в этих точках накрывал все точки второго множества и
имел минимальную площадь. я понял так: 1 считываем в массивы координаты точек 2 проверяем получился ли квадрат из 1-го множ-ва 3 проверяем, накрывает ли крвадрат точки 2-го множ-ва 4 если да, то смотрим минимальна ли его площадь 5 потом всё рисуем на экране. правильно алгоритм составил? как осуществить пункт 2 и 3? |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 9 Всего: 23 |
Да, алгоритм правильный.
По пункту 2. Пусть есть точки А, В, С и Д 1. Надо проверить на параллельность две противоположные стороны: АВ и СД, после ВС и ДА. 2. Надо проверить две противоположные стороны на их равенство: АВ и СД; ВС и ДА. 3. Надо проверить перепендикулярность двух соседних отрезков, допустим АВ и ВС. По пункту 3. На пересечении диагоналей квадрата находишь точку центра квадрата. От нее рисуешь (находишь уравнения) прямые через точку второго множества. Находишь точки пересечения этой прямой со сторонами квадрата. Если искомая точка второго множества находится внутри точек пересечения этой прямой и сторон квадрата, значит она не принадлежит квадрату. |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
anwe,
ИМХО, проще и красивее можно сделать. Используем понятие колебания. Любая прямая на плоскости разбивает плоскость на две полуплоскости: положительную и отрицательную. Т.е. если подставить координаты любой из точек в положительной полуплоскости в уравнение прямой, то это число будет положительное, аналогично и для отрицательной полуплоскости. ВОт из этого и исходим. Уравнения сторон квадрата будут уже найдены в предыдущих пунктах (при проверке на квадрат). Если взять произвольную точку внутри квадрата (например, как ты предложил, пересечение диагоналей), то и для ВСЕХ точек внутри квадрата колебаний относительно всех четырех сторон будет одинаковое. Эти значения нужно сохранить. А потом перебирать все точки из второго множества и проверять, что колебания относительно соответствующих прямых совпадают. ЭТо НАМНОГО проще, особенно если 2 множество достаточно большое. InviZible, я что-то не совсем понял, а количество точек, по которым строить квадрат, какое? Если их много, то тебе придется еще и эффективный алгоритм генерации сочетаний из N элементов по 4 искать. -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| InviZible |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 13.9.2006 Репутация: нет Всего: нет |
Kuvaldis, да, точек в файле много, нужно выбрать такие что б квадрат покрывал 2е множество и имел миним-ю площадь. Если у тебя есть хороший алгоритм, то пожалуйста выложи здесь.
|
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 9 Всего: 23 |
Kuvaldis, ты написал:
Как подставить? Точки же плоскости не принадлежат прямой. И прямая разбивает плоскость, значит точки на ней не принадлежат ни одной полуплоскости. И вообще, как я понял, значит надо проверять точки для всех четырех сторон. Во-первых, это тоже не мало, а еще надо решать задачу принадлежности точки плоскости. Во-вторых, принадлежность положительной или отрицательной полуплоскости зависит от того, как решающий условится их (полуплоскости) определять. А если точек много, можно их быстро отсеять так: если точки лежат внутри вписанной в квадрат окружности (расстояние от центра квадрата до точки меньше половины длины стороны квадрата) - то принадлежит квадрату однозначно; если вне описанной окружности (расстояние больше, чем половина корня из двух, умноженного на длину стороны квадрата) - точка однозначно не принадлежит; и если больше вписанного и меньше описанного - надо проверять. |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
anwe,
Рассмотрим прямую y = x, в каноническом виде y - x = 0 если подставим координаты любой точки, то для ВСЕХ точек над прямой y - x > 0 для ВСЕХ точек под прямой y - x < 0 Для ВСЕХ точек на прямой y - x = 0 Это вообще аналитическая геометрия 1 курс. Нарисуй произвольные 4 прямые и возьми точку внутри и для всех точек плоскости разбей полуплоскости на + и -. т.е. сверху +, снизу - для каждой прямой итого для каждой области будут свои + и -. Если взять произвольную точку внутри фигуры, то для нее будет однозначная комбинация + и - для каждой прямой. Соответственно, подставляя произвольную точку внутри фигуры, мы можем определить ее смещения.... ну вроде понятно...
Определяем знак по точке, которая ТОЧНО лежит внутри, т.е. пересечение диагоналей Это сообщение отредактировал(а) Kuvaldis - 11.11.2006, 22:36 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| Aloha |
|
|||
|
. ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 351 Регистрация: 14.5.2006 Репутация: 97 Всего: 165 |
||||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 9 Всего: 23 |
А, может, незачем делать такие укоры: я филолог по образованию. |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
anwe,
Извини, плиз, если я тебя обидел или задел. Я просто хотел сказать, откуда это все взялось и в каком направлении смотреть... Aloha, я снимаю перед тобой шляпу, ты монстр. Уже не в первый раз твой пост - это маленький шедевр!!! + без вариантов!!! Это сообщение отредактировал(а) Kuvaldis - 12.11.2006, 00:42 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| InviZible |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 13.9.2006 Репутация: нет Всего: нет |
Kuvaldis, спасибо за советы и файл, буду разбираться.
|
|||
|
||||
| InviZible |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 13.9.2006 Репутация: нет Всего: нет |
Что-то не получается с квадратом.
Я перебираю все координаты, ищу стороны a,b,c,d . Затем скалярное произведение, чтобы узнать перпендикулярны ли стороны, елси да, и a=b=c=d, то точки составляют квадрат. Но что-то он мне ничего не выдаёт путного. Вот код:
Это сообщение отредактировал(а) InviZible - 17.11.2006, 20:27 |
|||
|
||||
| anwe |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 9 Всего: 23 |
InviZible, по-моему ты смешал два понятия. В строках
К тому же, для векторов получается x1[j];y1[j] - компоненты первого вектора, x1[k];y1[k] - второго. Получается всего в этой строке проверяешь на перпендикулярность 8 векторов. |
||||||
|
|||||||
| InviZible |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 13.9.2006 Репутация: нет Всего: нет |
А что нужно исправить? что-то не понятно =(
|
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 9 Всего: 23 |
Проще воспользоваться следующим условием. Пусть есть 4 точки (х1,у1), (х2,у2), (х3,у3), (х4,у4). Тогда берешь отрезки попарно и проверяешь их на параллельность. Они параллельны, если условие (y2-y1)/(x2-x1)=(y4-y3)/(x4-x3) истина. Далее другая пара: (y3-y2)/(x3-x2)=(y4-y1)/(x4-x1). Далее по теореме какой-то, да и просто по логике, на перпендикулярность надо проверить лишь два соседних отрезка. Если они перпендикулярны, то другие два соседних также перпендикулярны. Условие перепендикулярности: (y2-y1)/(x2-x1)=-(x3-x2)/(y3-y2).
|
|||
|
||||
| InviZible |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 13.9.2006 Репутация: нет Всего: нет |
С квадратом вчера разобрался: проверяю равенство сторон и равенство диагоналей. Теперь осталось проверка на вхождение точек второго мно-ва в квадрат, почти сделал: беру расстояний от точки до 2х противоподожных вершин если меньше стороны, то - входит. Осталось с площадями разобраться...и нарисовать
|
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |