Найти четырёхугольник похожий на прямоугольник15.06.2019, 12:44. Показов 3441. Ответов 12
Метки нет (Все метки)
Задача
Задано 50 случайных точек. Требуется найти такие четыре точки, которые образуют четырёхугольник похожий по форме на прямоугольник. Условие похожести задать самим. Если такой четырёхугольник существует, то нарисовать его и в заголовок формы вынести слово YES, в противном случае слово NO. Дополнительно рассмотреть (сравнить) иные алгоритмы решения данной задачи. Решение Похожесть четырёхугольника на прямоугольник можно задать условием того, что все четыре угла четырёхугольника близки к 90°. Вместо углов можно использовать косинусы этих углов. Так как косинус прямого угла равен нулю, то я использовал величину Quad = |cos(A)| + |cos(B)| + |cos(C)| + |cos(D)|. И просто положил, что если Quad <= 0.1, то четырёхугольник похож на прямоугольник. Итак точки заданы в два массива x() и y(). Четырёхугольник обозначен как ABCD. AB, BC, CD, DA - это стороны четырёхугольника, а AC и BD - его диагонали. Программа вычисляет все эти величины. А потом используя теорему косинусов вычисляет косинусы всех четырёх углов (A, B, C, D). Они обозначены как cosA, cosB, cosC, cosD. Для ускорения работы программы она сразу проверяет модули косинусов. Если модуль косинуса угла больше 0.1, то программа переходит к рассмотрению следующего четырёхугольника. В общем эта программа работает. Но это не самое главное. САМОЕ ГЛАВНОЕ - Это оптимизация программы, вплоть до замены алгоритма 1. Мне кажется, что с условиями я перестарался. То есть в программе проверяются ВСЕ углы, точнее их косинусы. А ведь достаточно проверить только три угла (их косинусы). Ведь если три угла равны (приблизительно конечно) 90°, то четвёртый угол тоже будет равен 90°. То есть следовало бы величину Quad задать как Quad = |cos(A)| + |cos(B)| + |cos(C)| (четвёртый косинус опущен, поскольку лишний) 2. Мне кажется, что я выбрал неверный алгоритм. Надо было видимо сделать иначе. Например. Вычислить все стороны четырёхугольника и похожесть этого четырёхугольника задать как величину Quad = |AB - CD| + |BC - DA|. Иными словами, равенство противоположных сторон есть признак прямоугольника. К нему следует добавить проверку одного (любого) угла на равенство 90° (точнее не самого угла, косинуса угла на равенство 0, приближённое конечно) 3. Тут есть ещё вариант алгоритма. Например вычислить диагонали четырёхугольника и сравнить их на приближенное равенство. Не забыть и проверку угла. Ведь равнобедренная трапеция тоже имеет равные диагонали... 4. Ещё вариант. Найти середины двух диагоналей. Для прямоугольника они совпадают. И проверить, приближенно конечно, вписан ли четырёхугольник в окружность 5. В общем можно ещё задать стороны как вектора и использовать векторную алгебру... Я высказал общие мысли. Буду рад, если кто-то подскажет лучшее решение, чем моё. Программа прилагается.
0
|
||||||
| 15.06.2019, 12:44 | |
|
Ответы с готовыми решениями:
12
Определите что представляет из себя четырехугольник: ромб, прямоугольник, квадрат, трапеция Объявить систему классов: Точка, Прямоугольник, Квадрат, Ромб, Трапеция, Треугольник, Четырехугольник Четырехугольник задан координатами своих вершин составить программу которая определяет какой это четырехугольник |
| 16.06.2019, 09:15 [ТС] | ||||||
|
Я немного разобрался со своей задачей, хотя хотелось бы испробовать и другие алгоритмы.
В моей программе использовалось следующее определение прямоугольника Определение 1 Прямоугольник - это четырёхугольник у которого все углы прямые. ту программу можно упростить, если использовать другое определение Определение 2 Прямоугольник - это четырёхугольник у которого три угла прямые (то, что и четвёртый угол прямой вытекает из того, что сумма углов четырёхугольника равна 360°) Теперь я предлагаю вам программу, которая основана на новом определении прямоугольника Определение 3 Прямоугольник - это четырёхугольник у которого равные диагонали и точка пересечения этих диагоналей является серединой для каждой диагонали (поистине удивительное определение) Согласно этому определению достаточно вычислить лишь длину диагоналей, координаты середин диагоналей и расстояние между этими серединами. Для сравнения новой программы со старой, скажу следующее. Здесь не надо вычислять стороны четырёхугольника, а также косинусы углов. То есть вычислений гораздо меньше. Программа прилагается. Вопрос остаётся прежним. Оценить саму программу. Возможно её можно усовершенствовать. Или предложить иной алгоритм решения этой задачи. Чем больше алгоритмов, тем лучше. Тем выше интеллект программиста и его способность в решении подобных задач. Есть мысль. А нельзя ли использовать такую вещь как площадь прямоугольника? Ведь площадь равна произведению двух сторон прямоугольника. Для обычного четырёхугольника это неверно!!! Или я ошибаюсь? Кто может что-нибудь сказать по этому поводу? Буду рад вашим ответам, комментариям, замечаниям и критике.
0
|
||||||
| 17.06.2019, 06:57 [ТС] | ||||||
|
я усовершенствовал программу, которая находится в посте #1.
1. Из внутреннего цикла вынесено всё, что только можно вынести. (Сравните эту программу с исходной) 2. Функция R() изменена. Она теперь вычисляет не длину отрезка, а Квадрат длины. То есть из неё удалена операция SQR. В самом деле, зачем извлекать квадратный корень, если потом в целом ряде случаев придётся вновь возводить в квадрат. А сам корень извлекается только там, где это необходимо. (Переменные AB2, BC2, CD2, DA2, AC2, BD2 - означают теперь квадрат длины отрезка) 3. Вероятно, для данного алгоритма, ничего лучшего не сделать. Будем исследовать другие алгоритмы.
0
|
||||||
| 17.06.2019, 07:31 | |
|
Не по теме:
0
|
|
| 17.06.2019, 08:40 [ТС] | |
|
Я думал, что хорошо знаю геометрию. А вот сегодня моя программа доказала мне, что это не так. А вы хорошо знаете геометрию? Итак...
Определение Прямоугольник - это четырёхугольник у которого противоположные стороны равны. А также равны диагонали. Представить иную фигуру, отличную от прямоугольника, я не мог. А вот программа выдала своё видение этого определения (смотрите рисунок). На рисунке самопересекающийся четырёхугольник. У него противоположные стороны равны и диагонали тоже равны. Что делать? Тут есть несколько решений 1. дополнить наше определение, что стороны не пересекаются 2. ещё лучше, если стороны будут параллельны. То есть применить признаки параллельности сторон. 3. задать условие, что хотя бы один из углов прямой. ВОПРОС А что вы можете предложить в этой ситуации? примечание я рад, что программа указала мне место под солнцем. А то бы не знал...
0
|
|
|
Заблокирован
|
|
| 17.06.2019, 09:35 | |
Сообщение было отмечено нтч как решение
Решение
нтч, не знаю, рассматривал ли ты такой вариант:
1. перебираем тройки точек А, В, С 2. если угол АВС близок к прямому 3. вычисляем координаты хД=хА+хС-хВ,уД=уА+уС-уВ 4. перебираем остальные (а можно и все, чтобы не заморачиваться) 5. если какая то точка достаточно близка к Д - это и есть наш "прямоугольник"
1
|
|
|
|
|||
| 17.06.2019, 10:18 | |||
Сообщение было отмечено нтч как решение
РешениеТак что определение верное, а вы просто неправильно программу составили, раз такая коллизия стала возможной.
1
|
|||
| 17.06.2019, 17:33 [ТС] | |
|
Pro_grammer,
спасибо вам. Возможно вы правы. Хотя я использовал в качестве основы предыдущую программу. Там четырёхкратный цикл. Но вот программа выдала однако такую "восьмёрку", где стороны пересекаются. Сам я был невероятно удивлён. Хотя по здравом размышлении пришёл к выводу, что программа сделала то, что ей было приказано. То есть если бы четырёхугольник был бы ВЫПУКЛЫМ, то этого бы не произошло. А в программе такое понятие как выпуклость не рассматривалось вовсе. То есть программа просто соединяла четыре вершины в том порядке в каком ей было предписано. Так или иначе, но надо рассмотреть задачу. Как определить, что четырёхугольник выпуклый, если заданы его вершины в определённом порядке? Тут надо ещё подумать... не всё так просто как я предполагал изначально... Спасибо вам ещё раз! Буду уточнять этот казус на форуме "Геометрия". Возможно там ещё что-нибудь подскажут. Добавлено через 30 минут Pro_grammer, нашёл в интернете ответ: Пусть a, b, c, d - стороны четырёхугольника и e, f - его диагонали. Тогда для Выпуклого четырёхугольника верно неравенство А для прямоугольника верно равенство e * f = a * c + b * d ... теперь сюрпризов не будет Добавлено через 3 минуты А полученная программой "восьмёрка" называется антипараллелограммом. Добавлено через 4 часа 35 минут Я нашёл поистине удивительное решение проблемы. Вопрос стоял так... Как отличить выпуклый четырёхугольник от невыпуклого? ОТВЕТ У выпуклого четырёхугольника диагонали больше чем стороны ... советую это запомнить; может кому-нибудь пригодится.
0
|
|
|
103 / 63 / 10
Регистрация: 13.02.2017
Сообщений: 178
|
|
| 17.06.2019, 22:24 | |
|
0
|
|
|
Заблокирован
|
||||||
| 18.06.2019, 02:36 | ||||||
Сообщение было отмечено нтч как решение
Решение
нтч, всё ж сравни по скорости алгоритмы. Вот мой-
1
|
||||||
| 18.06.2019, 08:06 [ТС] | |
|
Уважаемый Sur_L,
четырёх углов ПРЯМЫХ углов вполне достаточно. Поскольку эти углы уже определяют выпуклый четырёхугольник. А вот другие признаки прямоугольника требуют явно задать условие выпуклости как например то, что диагонали больше сторон. Уважаемый Остап Бонд, скорость работы я сейчас проверю. Но я не сомневаюсь, что ваша программа быстрее моих, поскольку все стороны (квадраты сторон) вычисляет отдельно. В то время как у меня всё повторяется (в циклах) многократно. Иными словами, вы вынесли из циклов все многократные повторные вычисления в отдельный массив. Надо это запомнить и применить на практике! Этот подарок дорогого стоит!!!
0
|
|
|
Заблокирован
|
|||
| 18.06.2019, 08:47 | |||
|
нтч, ещё советую взять на вооружение привычку уходить от квадратов (и даже кубов), заменяя произведениями - степенные ф-ии существенно тормозят процесс
1
|
|||
| 18.06.2019, 08:47 | |
|
Помогаю со студенческими работами здесь
13
Найти похожий модуль Найти похожий файл
Найти похожий элемент из массива Где найти элемент управления, похожий на Toolbox в VS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|