Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125

минимальная площадь прямоугольника

02.03.2014, 14:44. Показов 4876. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
день добрый уважаемые ...задача вот какая...
дано N точек на плоскости, нужно найти прямоугольник с наименьшей площадью, включающий в себя все точки, и угол наклона относительно оси ох...подскажите пожалуйста как это сделать
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.03.2014, 14:44
Ответы с готовыми решениями:

Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и периметр прямоугольника.
как решить эту задачу с помощью delphi? Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и...

Известны вершины прямоугольника. Найти площадь и периметр прямоугольника
Известны координаты вершин прямоугольника ABCD , A(x1,y1), B(x2,y2), C(x3,y3). Найти площадь и периметр прямоугольника.

Написать функцию, которая вычисляет площадь прямоугольника. Параметрами функции должны быть длина и ширина прямоугольника
24) Написать функцию, которая вычисляет площадь прямоугольника. Параметрами функции должны быть длина и ширина прямоугольника.

20
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
02.03.2014, 15:42
не совсем понятно: угол наклона прямоугольника относительно оси абсцисс изначально задан или его определить надо?
0
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
02.03.2014, 16:04  [ТС]
определить....
изначально у нас есть только n-е количество точек на плоскости....и нужно найти прямоугольник включающий в себя все эти точки, с наименьшей площадью....и вот пример угла который нужно найти
Миниатюры
минимальная площадь прямоугольника  
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
02.03.2014, 17:53
быстрый поиск по сети дал следующие результаты:
1) задача эта называется поиском "минимального ограничивающего прямоугольника" (МОП)
2) существует некоторое число уже разработанных алгоритмов для этого поиска
3) простейшим, на мой взгляд, является следующий алгоритм:
-- существующее множество (облако) точек ограничиваем по крайним точкам по горизонтали и вертикали, вычисляем получившуюся площадь и запоминаем её
-- далее выбираем любую крайнюю точку облака (лежащую на выпуклом многоугольнике, описывающем облако) и начинаем относительно неё вращать облако точек на, например, пол-градуса по часовой стрелке и на каждом шаге вращения вновь ограничиваем облако по вертикали и горизонтали и снова вычисляем и запоминаем площадь (и угол поворота)
-- в итоге, повернув на 90 градусов, находим минимальную среди площадей и соответствующий ей угол
(больше 90 градусов поворачивать не надо, ибо прямоугольник - штука симметричная по осям, проходящим через середины сторон)
---------

могу попробовать реализовать, но для этого надо получить от вас формат ввода данных (точек) и формат вывода данных
на мой взгляд, наиболее привлекательным будет следующее:
-- ввод точек кликами по ограниченному полю: где кликнули - там и точка
-- после окончания ввода точек нажимается кнопка "Найти МОП"
-- на экране в реале это облако точек ограничивается прямоугольником, ориентированным по вертикали/горизонтали и на "табло" высвечивается угол "0 градусов" и соответствующая ей площадь в квадратных пикселях + надпись "Текущая минимальная площадь = найденной для 0 градусов"
-- затем по таймеру облако поворачивается и снова высвечивается величина угла и площадь + меняется запись для "Текущей минимальной"
-- по завершению поворота на 90 градусов облако восстанавливается в исходное состояние и рисуется найденный минимальный прямоугольник с соответствующим ему углом наклона

как-то так
1
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
02.03.2014, 18:15  [ТС]
kalabuni, предложенный вами способ реализации, был выбран мною изначально, но столкнулся с такой проблемой, когда с помощью canvas в цикле поворачивал изображение, и проверял пиксели, ответом всегда было исходное изображение, и вся проблема в том, что метод drawImage() в canvas является асинхронным, и на момент проверки он просто оказывался пуст...и я предположил что возможно есть какая нибудь формула что бы сделать это без поворота....так же искал методы на подобии .ready() но ничего не нашел, возможно вы знаете как дождаться рисунка, а потом проверять, но без интервалов и таймаутов, так как с ними это займет очень много времени.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
02.03.2014, 18:33
это я как-то не подумал
90 градусов по пол-градуса - это 180 шагов, даже если по паре секунд на шаг - это 5 минут... долго...

если без визуальных эффектов (на этапе вычислений), то после ввода точек кликами (на этом варианте настаиваю, ибо вводить точки координатами - это вообще бред, который займёт десятки минут) можно положение каждой точки при очередном повороте просто вычислить, тем более нас интересуют не все точки, а только габаритные и, соответственно, безо всякой канвы получить минимальную площадь и соответствующий угол
и только в конце вычислений, зная угол и номера точек (по которым проводились стороны прямоугольника) можно с помощью канвы сразу нарисовать искомый прямоугольник
0
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
02.03.2014, 20:00  [ТС]
исходное изображение и есть canvas....а насчет вычислить положение точек при повороте, это не совсем понял как можно сделать...

Добавлено через 1 час 18 минут
на всякий случай еще сделал рисовалку точек на фидлере
рисовалка
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
02.03.2014, 21:12
Лучший ответ Сообщение было отмечено Galphimbl как решение

Решение

начну сначала
-- имеем контейнер <div style="position: relative; width: 888px; height: 777px; border: 1px solid #000"></div> - это поле для размещения точек с заданными шириной и высотой

-- клиент кликает внутри этого контейнера и на месте каждого клика появляется новая точка,
которую мы создаём скриптом программно, добавляя всякий раз внутрь контейнера новый
<div id="p0" style="position: absolute; overflow: hidden; width: 1px; height: 1px; background: red; left: 123px; top: 234px"></div>,
где 0 в id - порядковый номер точки (считать начинаем с нуля, как обычно),
а 123 и 234 - координаты первого клика пользователя

-- кликает клиент второй раз, мы создаём вторую точку на месте клика
<div id="p1" style="position: absolute; overflow: hidden; width: 1px; height: 1px; background: red; left: 98px; top: 543px"></div>,

-- после того, как клиент закончил ввод точек и нажал кнопку "Найти МОП", сохраняем в двух массивах все left'ы и top'ы всех точек облака, вот так:
var LEFTs = [123, 98, ...];
var TOPs = [234, 543, ...];


-- затем находим в обоих массивах минимальные и максимальные значения и их разницу
это и будут величины сторон описывающего прямоугольника в пикселях
произведение их и даст нам площадь ОП'а при угле в 0 градусов -- (maxLEFTs - minLEFTs) * (maxTOPs - minTOPs)
также запоминаем номера точек с минимальными и максимальными координатами

-- выбираем одну из точек облака центром вращения
пусть это будет точка номер 25 -- <div id="p25"></div> для которой в массивах LEFTs и TOPs также сохранены её координаты (как и для всех точек)

-- зная координаты центра вращения, можно легко определить радиусы вращения для всех остальных точек
формула вычисления отрезка по координатам его конца известна - из теоремы Пифагора - корень квадратный из суммы квадратов разниц координат
т.е. для точки p13 радиус вращения относительно выбранной центром точки p25 будет равен
var R13 = Math.sqrt ((TOPs [13] - TOPs [25]) * (TOPs [13] - TOPs [25]) + (LEFTs [13] - LEFTs [25]) * (LEFTs [13] - LEFTs [25]));

-- зная угол поворота alfa (который мы сами будем задавать в радианах на каждом шаге), легко вычислить новые координаты для точки номер 13 через параметрическое уравнение
newLEFTs [13] = LEFTs [25] + R13 * Math.cos (alfa);
newTOPs [13] = TOPs [25] + R13 * Math.sin (alfa);


-- таким образом получаем два массива с координатами всех точек при повороте на угол alfa -- newLEFTs и newTOPs

-- также, как и в исходном случае, находим в обоих массивах минимум и максимум и вычисляем величину площади; если величина площади меньше предыдущей вычисленной, запоминаем номера точек, у которых были минимальные и максимальные координаты и текущий угол поворота

-- и далее увеличиваем угол alfa, вплоть до того, покуда он не достигнет PI / 2,
не забывая при этом, что угол отсчитывается от полуоси 0х против часовой стрелки

-- в итоге имеем два исходных массива с координатами точек, значение угла, при котором получилась минимальная площадь и номера точек, через которые надо провести 4 стороны прямоугольника

-------------
аналогичные вычисления по вышеуказанным формулам я делал недавно в теме Строка, бегущая по окружности
1
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
03.03.2014, 12:17  [ТС]
kalabuni, ты ГЕНИЙ....спасибо тебе огромное !!!! истолковал все просто отлично !!! сегодня - завтра попробую это однозначно лучший ответ потом отпишу здесь получилось ли

Добавлено через 14 часов 55 минут
kalabuni, вот сегодня с утра сел делать и появился такой еще вопросик а если при повороте в одну из сторон, полученная нами площадь больше чем предыдущая. Можем ли мы считать что при дальнейшем повороте в эту же сторону мы никогда не получим меньшую площадь, при условии что поворачиваем мы от -45 до 45 градусов. ?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.03.2014, 12:32
Цитата Сообщение от Galphimbl Посмотреть сообщение
а если при повороте в одну из сторон, полученная нами площадь больше чем предыдущая. Можем ли мы считать что при дальнейшем повороте в эту же сторону мы никогда не получим меньшую площадь, при условии что поворачиваем мы от -45 до 45 градусов. ?
полагаю, что в общем случае мы так считать не можем

и потом... я не вижу смысла "поворачивать" от -45 до +45 градусов
чисто программно легче "поворачивать" на 90 градусов от исходного положения в какую-то одну любую сторону
параметрическое уравнение окружности, как я указывал выше, исходит из отсчёта угла от полуоси 0х против часовой стрелки, так что для простоты программной записи надо менять угол от 0 радиан до Math.PI / 2 с каким-то выбранным вами шагом, например .01

сделать вам рабочий код или сами справитесь?
0
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
03.03.2014, 13:39  [ТС]
Цитата Сообщение от kalabuni Посмотреть сообщение
полагаю, что в общем случае мы так считать не можем
пожалуй я с вами не соглашусь, сейчас попробую обьяснить свою логику.
прямоугольник, с минимальной площадью, описывающий все наши точки существует всегда.
допустим что наш прямоугольник, с наименьшей площадью, уже лежит паралельно оси ох.
что тогда будет происходить при повороте его например вправо, площадь прямоугольника, описанного вокруг нашего прямоугольника, будет пропорционально увеличиваться, до тех пор, пока пока его высота, не станет равна его ширине (квадрат), что произойдет при повороте на 45 градусов, далее же, площадь описываемого прямоугольника, вокруг нашего прямоугольника, будет пропорционально уменьшаться, пока они не сольются, что произойдет при повороте на 90 градусов.
отсюда следует, что если поворачивая фигуру от 0 до 45, площадь описываемого прямоугольника, больше чем площадь предыдущего прямоугольника, значит верный угол будет предыдущий, при условии что это не первый этап поворота, если же он первый, значит следует вращать точки в противоположную сторону, до тех пор, пока площадь не начнет увеличиваться..
зачем это мне спросите вы?? а затем что бы уменьшить количество операций.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.03.2014, 14:41
будем надеяться, что вы правы, пробуйте
1
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
03.03.2014, 17:25  [ТС]
прошу конечно прощения....у меня что то не сросталось...и я начал баловаться с отладчиком, отслеживать....и вот что заметил....странность какую

newLEFTs [13] = LEFTs [25] + R13 * Math.cos (alfa);
newTOPs [13] = TOPs [25] + R13 * Math.sin (alfa);

при повороте точек на 0 градусов у нас получается вот такая интересная штука

newLEFTs [13] = LEFTs [25] + R13 * 1 ; так как косинус 0 равняется 1
newTOPs [13] = TOPs [25] + R13 * 0 ; а тут все норм...

и получается при повороте на 0 у нас левые координаты точек сдвигаются...
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.03.2014, 18:48
либо плохо учились в школе
либо перезанимались
отдохните
Цитата Сообщение от Galphimbl Посмотреть сообщение
получается при повороте на 0 у нас левые координаты точек сдвигаются
не получается
никто никуда не сдвигается

точка 13 всегда находится на расстоянии R13 от точки 25, при любом угле

в случае 0 градусов/радиан точка 13 смещена по горизонтали на R13, а по вертикали на 0, в итоге расстояние между точками равно R13
newLEFTs [13] = LEFTs [25] + R13 * Math.cos (0) = LEFTs [25] + R13
newTOPs [13] = TOPs [25] + R13 * Math.sin (0) = TOPs [25] + 0


сделайте угол 90 градусов и получите смещение по вертикали равное R13, а по горизонту будет 0, и опять расстояние между точками равно R13
newLEFTs [13] = LEFTs [25] + R13 * Math.cos (Math.PI / 2) = LEFTs [25] + 0
newTOPs [13] = TOPs [25] + R13 * Math.sin (Math.PI / 2) = TOPs [25] + R13
Миниатюры
минимальная площадь прямоугольника  
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.03.2014, 19:18
добавлю:
угол 0 - это не исходная позиция точки 13, а положение, когда точка 13 находится на горизонтальной прямой вместе с точкой 25 (центром вращения)
я же дважды вам писал: в параметрическом уравнении окружности угол отсчитывается от полуоси 0х против часовой стрелки
1
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
03.03.2014, 20:16  [ТС]
kalabuni, блин....чет ничего не получается при повороте на любой градус точки меняет свое положение до неузнаваемости сидел с листочком , ручкой и калькулятором, ваша формула работает у меня...не работает ищу проблему у себя

Добавлено через 2 минуты
kalabuni, спасибо вам еще раз огромное за то что не покидаете тему, а всячески пытаетесь помочь
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.03.2014, 22:07
Galphimbl, в описании алгоритма здесь я упустил один момент
правда, я вам дал ссылку на "попа с собакой",
и если бы вы попытались разобраться с тем кодом, вы бы увидели раздел скрипта под названием // **** расчёт угловых смещений букв текста

всякая точка N облака находится:
а) на каком-то постоянном расстоянии от центра вращения, это - радиус RN, который мы вычисляли
б) и под каким-то постоянным углом относительно горизонтальной линии, проходящей через точку вращения

вот про эти самые углы я вам забыл написать, а вы мою ссылку про "попа с собакой" не изучили

чтобы повернуть все точки на .01 радиана против часовой, надо прибавить эти .01 радиана к собственному углу каждой точки

угол определяется из того же параметрического уравнения - получайте арксинусы и арккосинусы из параметрического уравнения
где, например, для точки номер 13
R - это наш с вами R13
x0 - LEFTs [25]
у0 - TOPs [25]
x - LEFTs [13]
y - TOPs [13]
Миниатюры
минимальная площадь прямоугольника  
1
22 / 22 / 13
Регистрация: 13.01.2013
Сообщений: 125
04.03.2014, 14:42  [ТС]
kalabuni, не обратил внимания что это была ссылка завтра с утра все прочитаю, и попробую разобраться.

Добавлено через 15 часов 24 минуты
kalabuni, огромное спасибо все заработало
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
04.03.2014, 15:03
поздравляю!
покажете?
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
05.03.2014, 20:12
ну раз не показываете, покажу свой вариант - не пропадать же ему, раз сделал

безо всякой оптимизации "кручу-верчу" на все 360 градусов

"заточено" под Мозиллу и Хром, в других работать не будет... мей би в Опере, не проверял

http://codecenter.awardspace.com/mop.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2014, 20:12
Помогаю со студенческими работами здесь

Написать процедуру, которая вычисляет площадь прямоугольника. Параметрами процедуры должны быть длина, ширина прямоугольника и переменная для результа
23 Написать процедуру, которая вычисляет площадь прямоугольника. Параметрами процедуры должны быть длина, ширина прямоугольника и...

Минимальная площадь треугольника
Из заданного на плоскости множества точек выберите такие три точки, не лежащие на одной прямой, которые составляют треугольник наименьшей...

минимальная площадь треугольников
Прошу подсказать с решением задачи на Visual Prolog. задается набор из 3хN точек на плоскости(координаты точек Х и У - целые числа),...

Вычислить площадь и периметр квадрата со стороной а,площадь и периметр прямоугольника со сторонами b и с
вычислить площадь и периметр квадрата со стороной а, площадь и периметр прямоугольника со сторонами b и с, площадь круга и длину окружности...

Площадь прямоугольника
Возникла проблема с С++. Недавно начал изучать. Такая задача. Найти площадь прямоугольника, задав с клавиатуры значение длинны и ширины. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru