Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Простая фигура,


Автор: Joni 21.11.2004, 00:39
Всем здрасте!
Подскажите алгоритм.
Нужно найти простую фигуру минимальной площади, охватывающей две другие

Автор: maxim1000 21.11.2004, 12:32
Цитата
простую фигуру

поконкретнее надо описать класс подходящих фигур
тогда уже можно что-то думать...

Автор: Joni 21.11.2004, 18:28
Прстой фигурой можно считать произвольный треугольник, четырехугольник, круг и элипс.

Автор: maxim1000 21.11.2004, 20:56
тогда это уже пять задач:
1. минимальный треугольник
2. минимальный четырехугольник
3. минимальный эллипс
4. минимальный круг
5. выбрать из них фигуру с минимальной площадью (ну это, в общем-то, и не задача smile)

4 задачу можно и не решать, т.к. любой круг является эллипсом
задачу 1 можно тоже не решать: треугольник можно считать предельным случаем четырехугольника

есть два возможных варианта решения этих задач:
1. аналитический
2. численный

1й требует описания тех двух фигур, и уже по их свойствам находит решение для четырехугольника и эллипса
плюсы: достаточно просто подставить параметры в формулу, соответствующую ситуации, и получить точные значения параметров
минусы: поиск решения может оказаться довольно сложным, а в некотором случае аналитическое решение невозможно, кроме того, скорее всего, придется решать отдельно задачи для разных фигур

2й способ: строится функция - значение площади в зависимости от параметров фигур, потом ее минимизируют обычными численными методами
плюсы: вся разница в типе покрывающей фигуры вкладывается в функцию, алгоритм минимизации остается тем же (еще нужно будет отдельно написать функцию проверки того, что фигура действительно покрывает две другие)
минусы: часто численные методы имеют ограниченную область применения (накладываются ограничения на минимизируемую функцию)

Автор: val 22.11.2004, 10:46
Есть такая вещь, как рекурсивный алгоритм заливки области. В самом общем виде выглядит таким образом:

Код

DrawPixel(int x, int y)
{
 while (/* покрыли ли мы всё ) */)
 {
   DrawPixel (x + 1, y);
   DrawPixel (x + 1, y + 1);
   DrawPixel (x, y);
   DrawPixel (x, y + 1);
 }
}


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

Автор: maxim1000 22.11.2004, 11:50
Цитата
Так вот, выбираем центр тяжести наших фигур и начинаем от туда выполнять рекурсивный алгоритм заливки.

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

Автор: val 22.11.2004, 14:10
Цитата
на самом деле выбор центра покрывающей фигуры и есть основная задача (зная его все остальное можно посчитать)


Согласан. Тогда, скажем так, что центр тяжести будем искать с какой-то дельтой относительно вычисленного. Все случаи, конечно, не покрыть, но для стандартного набора расположений подойдёт...

Автор: Joni 24.11.2004, 18:08
Всем огромное спасибо за предложенные идеи!
А можно ведь те две произвольны фигуры задать так:
Создать файл с набором некоторых точек, считать их произвольно а затем соеденить прямыми линиями (по некоторому правилу). Ведь можно разбить любую фигуру на отрезки?
И еще эти две фигуры не пересекаются.

Автор: val 24.11.2004, 18:12
Joni, но так нет гарантии, что полученная фигура будет правильной...

Автор: Joni 24.11.2004, 20:51
Что-то я совсем запутался уже.
А что же является ПРАВИЛЬНОЙ фигурой.
По моему любую фигуру можно охватить простой (НЕ описать)
Или я что-то недопонимаю?!

Автор: val 25.11.2004, 10:20
Цитата
Создать файл с набором некоторых точек, считать их произвольно а затем соеденить прямыми линиями


Просто не совсем понятно, по какому закону соединять прямыми линиями?

Автор: EKoshelev 25.11.2004, 14:15
А я вообще нефига не понял из ваших базаров. Кстати, вопросик у меня. У четырёхугольника один из углов может быть больше 180 градусов? Или нет.

Автор: val 25.11.2004, 17:34
Цитата
А я вообще нефига не понял из ваших базаров. Кстати, вопросик у меня. У четырёхугольника один из углов может быть больше 180 градусов? Или нет.


Да, например 30 градусов может соответвовать 360 + 30 = 390 градусам...

Автор: Joni 25.11.2004, 20:39
А чтобы решить данную задачу, может для начала нужен алгоритм задания исходных фигур.

Автор: cardinal 25.11.2004, 22:05
Цитата(val @ 25.11.2004, 16:34)
Да, например 30 градусов может соответвовать 360 + 30 = 390 градусам...

А может 330 градусам? smile

Описываем эллипс и треугольник
Цитата(maxim1000 @ 21.11.2004, 19:56)
2. минимальный четырехугольник

Берем минимальные значения x и y (y отчет сверху) у этих двух фигур за левую верхнюю точку прямоугольника и
максимальные значения x и y (y отчет сверху) у этих двух фигур за правую нижнюю точку прямоугольника. Этот прямоугольник и есть самый маленький по площади.
Цитата(maxim1000 @ 21.11.2004, 19:56)
1. минимальный треугольник

Находим треугольники которые зажимают (как розовый треугольник на картинке) обе фигуры, так, чтобы нельзя было ее повернуть. Их будет четыре, как я понял. Один из них я сконструировал подвинув диагональ до окружности круга, а потом повернув ее вокруг окружности пока линия не коснулась второй фигуры. Также можно сконструировать и другие три треугольника. Самый маленький по площади и будет думаю ответом... но не уверен.
Вот мои соображения по этому поводу smile

Автор: EKoshelev 26.11.2004, 08:17
val, четырёхугольник может быть не выпуклым? (не знаю как правильно сказать)

Автор: val 26.11.2004, 10:26
Цитата
val, четырёхугольник может быть не выпуклым? (не знаю как правильно сказать)


Да. Вот пример невыпуклого четырёхугольника...

Код



                                       /\
                                      /  \
                                     /    \
                                    /      \
                                   /   /\   \
                                  /  /    \  \
                                 / /        \ \
                                //            \\
                               /                \


Добавлено @ 10:29
Пришлось воспользоваться тегом для кода, чтобы картинка не испортилась... smile

Автор: EKoshelev 26.11.2004, 12:40
val Может ты не понял. Это перефразировка моего вопроса об угле больше 180 градусов.

Автор: Guest 26.11.2004, 23:35
А полученный прямоугольник не бедет ведь наименьшим четырехугольником?
Тогда нужно искать четырк точки: верх-низ и лево-право.

Кстати, Cardinal, на чем вы реализовали данный алгоритм?

Автор: cardinal 27.11.2004, 01:28
Цитата(Guest @ 26.11.2004, 22:35)
полученный прямоугольник не бедет ведь наименьшим четырехугольником?

Кстати о птичках... Ты прав... Что делать... Наверно нумерически решать придется, то есть касательные к крайним точкам вертеть и смотреть на результат.
Цитата(Guest @ 26.11.2004, 22:35)
Кстати, Cardinal, на чем вы реализовали данный алгоритм?

Начем? Не знаю... smile Сидел, сидел и придумал smile Но эту фишку с треугольниками еще доказать надо...

Автор: Joni 27.11.2004, 19:15
Вот засада!
Мысль насчет четырех крайних точках не в счет. Ведь можно получить случаи
отсечения заданных фигур.

Cardinal, рисунок вы в графичем редакторе нарисовали?

Автор: cardinal 27.11.2004, 19:28
Цитата(Joni @ 27.11.2004, 18:15)
Ведь можно получить случаи
отсечения заданных фигур.

Это помоему нет, но вот минимальную площадь таким образом не получить. То есть этот прямоугольник не будет иметь наименьшую площадь...
Цитата(Joni @ 27.11.2004, 18:15)
Cardinal, рисунок вы в графичем редакторе нарисовали?

Можно на ты smile Да, зашел в paint и нарисовал smile Так попонятней просто должно быть, что я имел в виду...

Автор: Joni 27.11.2004, 19:47
А может провести четыре линии так, чтобы каждая содержала максимальное число точек.
Получим какое-то множество четырехугольников (т.к. линий может окакзаться больше чем 4)
Посчитать площади. И выбрать минимальный. smile

Автор: cardinal 27.11.2004, 22:31
Цитата(Joni @ 27.11.2004, 18:47)
четырехугольников

А вообще четырехугольник с прямыми углами или нет?

Автор: Joni 27.11.2004, 22:38
Необязательно.
Можно рассматривать любой четырехугольник.

Автор: Joni 28.11.2004, 22:18
Val вы говорили:
Есть такая вещь, как рекурсивный алгоритм заливки области
Итак зальем данные фигуры, но ведь они не будут простыми smile

Автор: cardinal 29.11.2004, 00:19
Joni, то что предложил val не прокатит... Зальется офигенная площадь, а не минимальная smile Таким образом нельзя задать нормально условия, чтобы рекурсия правильно закончилась... Тем более что у val ошибки в том, что он написал.
Надо было по крайней мере так написать:
Код

DrawPixel(int x, int y)
{
while (/* покрыли ли мы всё ) */)
{
  DrawPixel (x + 1, y);
  DrawPixel (x, y + 1);
  DrawPixel (x - 1, y);
  DrawPixel (x, y - 1);
}
}

Автор: Joni 1.12.2004, 18:50
Ой-ой что же делать!
Вот не ммогу найти как по координатам фигуры найти её центр (н-р, тяжести)
Думаю, что эта найденная точка поможет в нахождении минимыльной окружности.

Автор: cardinal 1.12.2004, 21:44
Ладно... Смотрим на картинку и не пугаемся smile

У нас два объекта, в этом примере это будет треугольник и "почтикруг" smile
Залиты они или нет разницы не имеет (если я ошибаюсь, то поправьте меня smile) Поэтому мы их заливаем. Как? Без разницы, тут пока не в эффективности дело. Берем и заливаем рекурсивно, как до этого было описано начиная с любой внутренней точки объекта (например центр круга).
Теперь есть две формулы, по которым мы получим x и y координату точки равновесия (центр тяжести). На картинке попытался объяснить кто такие xi и yi. Это координаты каждой точки Pi, которая пренадлежит той или иной фигуре (какой без разницы). Gi эта сила, которая давит на каждую точку. Здесь все силу равны поэтому все Gi = 1, то есть сумма Gi просто равна кол-ву точек. Ну короче я сейчас подумал, что все вообще просто становится smile Сверху в стоит просто сумма xi (или yi), т.к. все Gi = 1. Ну и остается поделить сумму всех координат точек по оси x на кол-во точек и получить xs. Точно также: сумма всех координат точек по оси y поделенная на кол-во точек обоих фигур (уже посчитали раньше) даст ys. Точка S(xs|ys) и будет центром тяжести...

О... Идея smile
Половина того, что написано выше делать не надо smile То есть делаем все также, но фигуры не заливаем. Меньше точек - быстрее посчитается, а результат будет тем же.

Действуй. smile

Автор: ~FoX~ 2.12.2004, 15:05
А не овал ли будет с наименьшей площадью?

Автор: cardinal 2.12.2004, 15:30
Пока думаю что нет smile
А потом Joni это все реализует и нам расскажет smile

Автор: ~FoX~ 2.12.2004, 16:23
А если сопряжение по двум противоположным сторонам элипса не одинвакове?

Автор: cardinal 3.12.2004, 02:14
~FoX~, пока не понял о чем ты... Нарисуй картинку как я и попробуй объяснить smile

Пока все еще думаю, что круг будет smile

Автор: ovr2000 3.12.2004, 13:13
По поводу простых фигур (треугольник, четырех угольник, эллипс)
Если мы описали минимальный треугольник, вокруг двух фигур может быть случай, когда углы треугольника полностью совпадают с одной из фигур. Правда это очень крайний случай. На столько невероятный, как и крайний случай четырех угольника, у которого одна из строн имеет длину 0.
В остальных случаях, мы можем провести касательную, к одной из вписанных фигур, которая отделит свободный угол треугольника. В результате мы получим четырехугольник меньшей площади, чем треугольник, который описывает те же фигуры.
ВЫВОД: Площадь минимального четырехугольника не меньше, чем площадь минимального треугольника, описывающих две другие фигуры.

PS В общем виде задача настолько сложна, что её еще не решили академики. Поэтому нужно все таки начать с нормальной постановки задачи

Автор: Joni 3.12.2004, 20:28
Всем огромное спасибо за предложенные идеи.
Я уже пытаюсь только вникать. :-)
Вот и пытаюсь на Pascal построить окружность.


Да задачу вроде еще не решили. Но ведь пытаться надо.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)