Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Простенькая задачка на выходные   Найти похожие ветки 

 
Igorek ©   (2004-04-16 17:27) [0]

На координатной плоскости дан произвольный, несамопересекающийся многоугольник, каждая сторона которого паралельна одной из осей координат.
Требуется найти радиус наибольшего круга (с точностью t), который можно поместить в многоугольник.
---
Алгоритм решения желательно изложить просто словами.


 
Igorek ©   (2004-04-16 17:27) [0]

На координатной плоскости дан произвольный, несамопересекающийся многоугольник, каждая сторона которого паралельна одной из осей координат.
Требуется найти радиус наибольшего круга (с точностью t), который можно поместить в многоугольник.
---
Алгоритм решения желательно изложить просто словами.


 
Serrrrg   (2004-04-16 17:39) [1]

Система координат надо полагать декартова? Т.е. все углы прямые?


 
Serrrrg   (2004-04-16 17:39) [1]

Система координат надо полагать декартова? Т.е. все углы прямые?


 
Igorek ©   (2004-04-16 17:41) [2]


> Serrrrg   (16.04.04 17:39) [1]
> Система координат надо полагать декартова? Т.е. все углы
> прямые?

Да.


 
Igorek ©   (2004-04-16 17:41) [2]


> Serrrrg   (16.04.04 17:39) [1]
> Система координат надо полагать декартова? Т.е. все углы
> прямые?

Да.


 
Romkin ©   (2004-04-16 17:47) [3]

Тогда этот многоугольник - квадрат :))


 
Romkin ©   (2004-04-16 17:47) [3]

Тогда этот многоугольник - квадрат :))


 
Serrrrg   (2004-04-16 17:47) [4]

Нет :)


 
Serrrrg   (2004-04-16 17:47) [4]

Нет :)


 
Romkin ©   (2004-04-16 17:48) [5]

Тьфу. Пятница. Прямоугольник.
Наибольший радиус окружности равен наименьшему расстоянию между сторонами (выбираем из двух пар - вертикальной и горизонтальной)


 
Romkin ©   (2004-04-16 17:48) [5]

Тьфу. Пятница. Прямоугольник.
Наибольший радиус окружности равен наименьшему расстоянию между сторонами (выбираем из двух пар - вертикальной и горизонтальной)


 
Serrrrg   (2004-04-16 17:49) [6]

Опять нет :)


 
Serrrrg   (2004-04-16 17:49) [6]

Опять нет :)


 
Serrrrg   (2004-04-16 17:50) [7]

Спираль например прямоугольная.


 
Serrrrg   (2004-04-16 17:50) [7]

Спираль например прямоугольная.


 
Nikolay M. ©   (2004-04-16 17:50) [8]


> Romkin ©   (16.04.04 17:48) [5]

Не-а :)
В условии не сказано, что углов нельзя касаться :(


 
Nikolay M. ©   (2004-04-16 17:50) [8]


> Romkin ©   (16.04.04 17:48) [5]

Не-а :)
В условии не сказано, что углов нельзя касаться :(


 
Igorek ©   (2004-04-16 17:51) [9]


> Romkin ©   (16.04.04 17:48) [5]


---
|  |
|   --
|    |
------


 
Igorek ©   (2004-04-16 17:51) [9]


> Romkin ©   (16.04.04 17:48) [5]


---
|  |
|   --
|    |
------


 
Romkin ©   (2004-04-16 17:51) [10]

ТАк он что, не замкнутый?


 
Romkin ©   (2004-04-16 17:51) [10]

ТАк он что, не замкнутый?


 
Igorek ©   (2004-04-16 17:52) [11]


> Romkin ©   (16.04.04 17:51) [10]
> ТАк он что, не замкнутый?

А что такой бывает?


 
Igorek ©   (2004-04-16 17:52) [11]


> Romkin ©   (16.04.04 17:51) [10]
> ТАк он что, не замкнутый?

А что такой бывает?


 
Romkin ©   (2004-04-16 17:52) [12]

Igorek ©  (16.04.04 17:51) [9] "Бегущая линия" по точкам. Сначала вертикаль, потом горизонталь. С выбором наибольшей прямоугольной внутренней области


 
Romkin ©   (2004-04-16 17:52) [12]

Igorek ©  (16.04.04 17:51) [9] "Бегущая линия" по точкам. Сначала вертикаль, потом горизонталь. С выбором наибольшей прямоугольной внутренней области


 
Serrrrg   (2004-04-16 17:53) [13]

> А что такой бывает?

Бывает.


 
Serrrrg   (2004-04-16 17:53) [13]

> А что такой бывает?

Бывает.


 
Nikolay M. ©   (2004-04-16 17:54) [14]


> Romkin ©   (16.04.04 17:52) [12]

Задача не сводится к нахождению макс. вписанного прям-ка.


 
Nikolay M. ©   (2004-04-16 17:54) [14]


> Romkin ©   (16.04.04 17:52) [12]

Задача не сводится к нахождению макс. вписанного прям-ка.


 
Romkin ©   (2004-04-16 17:56) [15]

ЗАдача сводится к нахождению максимального вписанного выпуклого многоугольника.
Тогда отсекаем точки, пока он не останется :))


 
Romkin ©   (2004-04-16 17:56) [15]

ЗАдача сводится к нахождению максимального вписанного выпуклого многоугольника.
Тогда отсекаем точки, пока он не останется :))


 
Nikolay M. ©   (2004-04-16 17:58) [16]

Окружность тоже можно считать правильным многоугольником с бесконечным числом сторон :)


 
Nikolay M. ©   (2004-04-16 17:58) [16]

Окружность тоже можно считать правильным многоугольником с бесконечным числом сторон :)


 
Igorek ©   (2004-04-16 18:04) [17]


> Serrrrg   (16.04.04 17:53) [13]
> > А что такой бывает?
>
> Бывает.

Бывает "незамкнутый многоугольник"??? А незамкнутый прямоугольник, квадрат? Это уже ломаная линия.


 
Igorek ©   (2004-04-16 18:04) [17]


> Serrrrg   (16.04.04 17:53) [13]
> > А что такой бывает?
>
> Бывает.

Бывает "незамкнутый многоугольник"??? А незамкнутый прямоугольник, квадрат? Это уже ломаная линия.


 
Serrrrg   (2004-04-16 18:08) [18]

>Бывает "незамкнутый многоугольник"??? А незамкнутый >прямоугольник, квадрат? Это уже ломаная линия.

Незамкнутое множество это множество не содержащее свою границу.

Вот например незамкнутый квадрат:

0<x<1, 0<y<1

А вот замкнутый:

0<=x<=1, 0<=y<=1


 
Serrrrg   (2004-04-16 18:08) [18]

>Бывает "незамкнутый многоугольник"??? А незамкнутый >прямоугольник, квадрат? Это уже ломаная линия.

Незамкнутое множество это множество не содержащее свою границу.

Вот например незамкнутый квадрат:

0<x<1, 0<y<1

А вот замкнутый:

0<=x<=1, 0<=y<=1


 
Igorek ©   (2004-04-16 18:10) [19]


> Romkin ©   (16.04.04 17:56) [15]
> ЗАдача сводится к нахождению максимального вписанного выпуклого
> многоугольника.
> Тогда отсекаем точки, пока он не останется :))

К слову.
Какой из двух многоугольников в Вашем контексте больший?
----
|  |
|  |
----

--------------------------------------------
|                                          |
--------------------------------------------

А теперь рассмотрим такой:
--------
|      |
|      ----
|         |
|      ----
|      |
--------


 
Igorek ©   (2004-04-16 18:10) [19]


> Romkin ©   (16.04.04 17:56) [15]
> ЗАдача сводится к нахождению максимального вписанного выпуклого
> многоугольника.
> Тогда отсекаем точки, пока он не останется :))

К слову.
Какой из двух многоугольников в Вашем контексте больший?
----
|  |
|  |
----

--------------------------------------------
|                                          |
--------------------------------------------

А теперь рассмотрим такой:
--------
|      |
|      ----
|         |
|      ----
|      |
--------


 
Igorek ©   (2004-04-16 18:13) [20]


> Serrrrg   (16.04.04 18:08) [18]
> >Бывает "незамкнутый многоугольник"??? А незамкнутый >прямоугольник,
> квадрат? Это уже ломаная линия.
>
> Незамкнутое множество это множество не содержащее свою границу.
>
> Вот например незамкнутый квадрат:
>
> 0<x<1, 0<y<1
>
> А вот замкнутый:
>
> 0<=x<=1, 0<=y<=1

Понял что вы имеете ввиду. Вот только у множества нету границ, как таковых. Вобщем скажем проще - круг может (да и наверное будет) касаться многоугольника.


 
Igorek ©   (2004-04-16 18:13) [20]


> Serrrrg   (16.04.04 18:08) [18]
> >Бывает "незамкнутый многоугольник"??? А незамкнутый >прямоугольник,
> квадрат? Это уже ломаная линия.
>
> Незамкнутое множество это множество не содержащее свою границу.
>
> Вот например незамкнутый квадрат:
>
> 0<x<1, 0<y<1
>
> А вот замкнутый:
>
> 0<=x<=1, 0<=y<=1

Понял что вы имеете ввиду. Вот только у множества нету границ, как таковых. Вобщем скажем проще - круг может (да и наверное будет) касаться многоугольника.


 
Serrrrg   (2004-04-16 18:28) [21]

> Вот только у множества нету границ, как таковых.

Как это нет границ?
Границей множества называется множество точек, в любой эпсилон-окрестности которых есть точки как принадлежащие к заданному множеству так и не принадлежащие. (За точность определения не ручаюсь).
Хотя к задаче это никакого отношения не имеет. :)


 
Serrrrg   (2004-04-16 18:28) [21]

> Вот только у множества нету границ, как таковых.

Как это нет границ?
Границей множества называется множество точек, в любой эпсилон-окрестности которых есть точки как принадлежащие к заданному множеству так и не принадлежащие. (За точность определения не ручаюсь).
Хотя к задаче это никакого отношения не имеет. :)


 
Igorek ©   (2004-04-16 18:36) [22]


> Serrrrg   (16.04.04 18:28) [21]
> > Вот только у множества нету границ, как таковых.
>
> Как это нет границ?
> Границей множества называется множество точек, в любой эпсилон-окрестности
> которых есть точки как принадлежащие к заданному множеству
> так и не принадлежащие.

Я имелл ввиду множество вообще. Какая граница у множества (яблоко, груша, слива)?


 
Igorek ©   (2004-04-16 18:36) [22]


> Serrrrg   (16.04.04 18:28) [21]
> > Вот только у множества нету границ, как таковых.
>
> Как это нет границ?
> Границей множества называется множество точек, в любой эпсилон-окрестности
> которых есть точки как принадлежащие к заданному множеству
> так и не принадлежащие.

Я имелл ввиду множество вообще. Какая граница у множества (яблоко, груша, слива)?


 
Igorek ©   (2004-04-18 10:27) [23]

So what?


 
Igorek ©   (2004-04-18 10:27) [23]

So what?


 
SergP ©   (2004-04-18 10:48) [24]

Имхо попробовать применить такой принцип:

var
ln:double
...
ln:=0;
while (внутри многоугольника остаются незакрашеные области) do
begin
Закрашиваем в многоугольнике все что находится на расстоянии <=ln от его контура;
ln:=ln+t;
end;
Result:=ln;


 
SergP ©   (2004-04-18 10:48) [24]

Имхо попробовать применить такой принцип:

var
ln:double
...
ln:=0;
while (внутри многоугольника остаются незакрашеные области) do
begin
Закрашиваем в многоугольнике все что находится на расстоянии <=ln от его контура;
ln:=ln+t;
end;
Result:=ln;


 
SergP ©   (2004-04-18 11:00) [25]

Это только принцип (первое что мне пришло в голову). На самом деле нужно немного его переработать, но имхо это можно сделать.


 
SergP ©   (2004-04-18 11:00) [25]

Это только принцип (первое что мне пришло в голову). На самом деле нужно немного его переработать, но имхо это можно сделать.


 
Igorek ©   (2004-04-19 09:36) [26]

Что-бы не было так грусно, скажу что эта "простенькая" задача была в составе заданий на коммандном чемпионате мира по программированию среди ВУЗов.


 
Igorek ©   (2004-04-19 09:36) [26]

Что-бы не было так грусно, скажу что эта "простенькая" задача была в составе заданий на коммандном чемпионате мира по программированию среди ВУЗов.


 
Romkin ©   (2004-04-19 10:55) [27]

Igorek ©  (16.04.04 18:10) [19] Млин. Наибольший выпуклый. Это и будет прямоугольник, после отсечения сторон :)) А как найти радиус для прямоугольника, я уже писал.
Впрочем, тут сложность есть: если эта штука имеет вид гантели, то не очень удобно, она распадется на две части...


 
Romkin ©   (2004-04-19 10:55) [27]

Igorek ©  (16.04.04 18:10) [19] Млин. Наибольший выпуклый. Это и будет прямоугольник, после отсечения сторон :)) А как найти радиус для прямоугольника, я уже писал.
Впрочем, тут сложность есть: если эта штука имеет вид гантели, то не очень удобно, она распадется на две части...


 
Igorek ©   (2004-04-19 11:54) [28]


> Romkin ©   (19.04.04 10:55) [27]
> Впрочем, тут сложность есть: если эта штука имеет вид гантели,
> то не очень удобно, она распадется на две части...

Это не сложность - это сущность задачи.


 
Igorek ©   (2004-04-19 11:54) [28]


> Romkin ©   (19.04.04 10:55) [27]
> Впрочем, тут сложность есть: если эта штука имеет вид гантели,
> то не очень удобно, она распадется на две части...

Это не сложность - это сущность задачи.


 
SergP ©   (2004-04-19 14:45) [29]

>Romkin ©   (19.04.04 10:55)

Неа... Ты не прав...
Учти что могут быть варианты, где вписаный круг может касаться не только сторон, но также и одного или нескольких из "вогнутых" углов многоугольника.
Например нарисуй многоугольник в форме креста. И посмотри теперь как там будет врисываться круг


 
SergP ©   (2004-04-19 14:45) [29]

>Romkin ©   (19.04.04 10:55)

Неа... Ты не прав...
Учти что могут быть варианты, где вписаный круг может касаться не только сторон, но также и одного или нескольких из "вогнутых" углов многоугольника.
Например нарисуй многоугольник в форме креста. И посмотри теперь как там будет врисываться круг


 
Igorek ©   (2004-04-20 11:21) [30]

Жаль, что народ не заинтересовала эта задача. Если еще пару дней не будет ответа - я выложу свои соображения насчет решения.


 
Igorek ©   (2004-04-20 11:21) [30]

Жаль, что народ не заинтересовала эта задача. Если еще пару дней не будет ответа - я выложу свои соображения насчет решения.


 
SergP ©   (2004-04-20 12:14) [31]

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


 
SergP ©   (2004-04-20 12:14) [31]

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


 
pasha_golub ©   (2004-04-20 12:21) [32]

А если применить инверсию с центром, лежащим за пределами многоугольника и радиусом меньшим, чем мин. расстояние до любой точки многоугольника. Тогда, по определению отрезки перейдут в окружности. Потом находим пересечение окружностей, а... вот тут мысль останавливается, потому как не помню, чего нужно нарисовать, чтобы это чего-то перешло в окружность. Надеюсь, идея понятна.

Решение конечно построительное, но помня аналитические формулы инверсии, я думаю можно как-то изгольнуться.


 
pasha_golub ©   (2004-04-20 12:21) [32]

А если применить инверсию с центром, лежащим за пределами многоугольника и радиусом меньшим, чем мин. расстояние до любой точки многоугольника. Тогда, по определению отрезки перейдут в окружности. Потом находим пересечение окружностей, а... вот тут мысль останавливается, потому как не помню, чего нужно нарисовать, чтобы это чего-то перешло в окружность. Надеюсь, идея понятна.

Решение конечно построительное, но помня аналитические формулы инверсии, я думаю можно как-то изгольнуться.


 
Кабан   (2004-04-20 14:29) [33]

Мне кажется, что окружность будет вписана в максимальный квадрат, стороны которого расположены либо параллельно осям координат, либо под углом в 45%. Для первого случая найти такой квадрат не сложно. Во втором случае как минимум одна из сторон квадрата (а может даже и 2) будет проходить через вершину многоугольника (иначе такой квадрат вписан в другой квадрат большего размера, у которого стороны параллельны осям). В конце- концов можно просто перебрать все вершины многоугольника и отталкиваясь от них попытаться построить такой квадрат.


 
Кабан   (2004-04-20 14:29) [33]

Мне кажется, что окружность будет вписана в максимальный квадрат, стороны которого расположены либо параллельно осям координат, либо под углом в 45%. Для первого случая найти такой квадрат не сложно. Во втором случае как минимум одна из сторон квадрата (а может даже и 2) будет проходить через вершину многоугольника (иначе такой квадрат вписан в другой квадрат большего размера, у которого стороны параллельны осям). В конце- концов можно просто перебрать все вершины многоугольника и отталкиваясь от них попытаться построить такой квадрат.


 
Igorek ©   (2004-04-21 19:02) [34]

Привожу свои мысли насчет решения задачи.
Для начала определяем минимальный прямоугольник P, который полностью покроет наш многоугольник М. Назовем его "покрывающим". В нем будем выбирать некоторые точки, анализ которых даст нам возможность исключить области, в которых может находиться центр искомого круга. Такие области будем хранить в глобальном списке.
Определим функцию f(x, y), которая в точках внутри Р дает расстояние до ближайшей границы М. Пусть для точек не внутри М это значение будет со знаком минус.
Также определим простую функцию g(x, y), которая даст расстояние от точки до ближайшей границы Р.
Напишем процедуру FindCenter(x, y), которая:
- находит значение функций f и g
- значение f сохраняет в глобальную переменную maxradius
- на основании этих значений f и g добавляет в список исключенные области (предлагаю подумать как)
- если среди доступных областей нету "покрывающего" прямоугольника, диагональ которого ...(додумать :-) ) относительно точности, то выставить глобальный флажок found и вернуться
- вызывает сама себя для прибл. центральной точки из каждой доступной области
- после каждого вызова если установлен found, то возвращается.

Вызываем FindCenter для центра Р.

---
подозреваю, что решение не досконально и можно рекурсию заменить итерацией


 
Igorek ©   (2004-04-21 19:02) [34]

Привожу свои мысли насчет решения задачи.
Для начала определяем минимальный прямоугольник P, который полностью покроет наш многоугольник М. Назовем его "покрывающим". В нем будем выбирать некоторые точки, анализ которых даст нам возможность исключить области, в которых может находиться центр искомого круга. Такие области будем хранить в глобальном списке.
Определим функцию f(x, y), которая в точках внутри Р дает расстояние до ближайшей границы М. Пусть для точек не внутри М это значение будет со знаком минус.
Также определим простую функцию g(x, y), которая даст расстояние от точки до ближайшей границы Р.
Напишем процедуру FindCenter(x, y), которая:
- находит значение функций f и g
- значение f сохраняет в глобальную переменную maxradius
- на основании этих значений f и g добавляет в список исключенные области (предлагаю подумать как)
- если среди доступных областей нету "покрывающего" прямоугольника, диагональ которого ...(додумать :-) ) относительно точности, то выставить глобальный флажок found и вернуться
- вызывает сама себя для прибл. центральной точки из каждой доступной области
- после каждого вызова если установлен found, то возвращается.

Вызываем FindCenter для центра Р.

---
подозреваю, что решение не досконально и можно рекурсию заменить итерацией



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.036 c
1-1082495435
oleg_SYS
2004-04-21 01:10
2004.05.09
Кнопка на панеле задач


7-1080470187
VitGun
2004-03-28 14:36
2004.05.09
Перехват обращения к FDD, LPT,USB


1-1082556913
russko
2004-04-21 18:15
2004.05.09
Ошибка: Invalid floating point operation


3-1081755225
/Maximus/
2004-04-12 11:33
2004.05.09
Сетевые базы данных


1-1082302900
TechnDreamer
2004-04-18 19:41
2004.05.09
Обработка текста в TRichedit с учетом форматирования





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский