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


Автор: neutrino 18.7.2005, 11:39
Приветствую!

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

Вот так выглядят объекты:

http://neutrino.pochta.ru/Mapalg/first.jpg

А вот такую карту надо сделать. Тут более светлый цвет соответствует низкой высоте и наоборот.

http://neutrino.pochta.ru/Mapalg/second.jpg

Как за более-менее небольшое время создать такую карту?

Автор: ~FoX~ 18.7.2005, 13:27
neutrino
Оптимизировать преобразование Хафа.

Автор: ~FoX~ 18.7.2005, 14:26
Наверное, это я широко шагнул........... smile
Посмотри http://www.arbuz.uz/y_kv_k.html, правда там про неленейные поверхности, но смысл тот же.

Автор: neutrino 18.7.2005, 14:35
Цитата
Посмотри тут,



Автор: ~FoX~ 18.7.2005, 14:44
neutrino
Странно.......... smile
http://www.yandex.ru/yandsearch?stype=www&nl=0&text=%EF%E5%ED%E0+%EF%F3%E7%FB%F0%E8+VB -
Цитата
на Арбузе Компьютерные вести онлайн

Автор: Alex101 19.7.2005, 10:51
Мне кажется, все намного проще.
Каждая клетка (с координатами x,y) имеет свою высоту...
Соответственно, нужно заполнить двумерный массив.
Высоты объектов, как я понимаю, одинаковые (да и необязательно это).
Дальше просто - определили точку с необходимой высотой, начинаем от нее "рисовать"...

Или я неправильно понял условия?

Автор: neutrino 19.7.2005, 17:43
~FoX~ Спасибо, но тот алгоритм не очень подходит для моей задачи. До первого поста я его обмозговал и понял, что это самое наивное решение. Дело в том, что я немного переврал с иллюстрацией. Там поля, которые белые тоже имеют разные высоты (в соответствии от расстояния до объектов, естественно). Другими словами, у пузырьков в той статье есть "конец" - это когда цвет полностью переходит в черный и расчет для настоящего пузырька прекращается. У меня же такого конца нет, и поэтому сложность будет как там помножить на кол-во объектов, а это слишком много.
Добавлено @ 17:45
"Конец" = конечный радиус пузырька (приим. авт. ред.)
Добавлено @ 17:46
Alex101, мне почему-то кажется, что твоя идея идентична той, что в статье (см. ответ Фокса). Если это так, то см. ответ для Фокса, если нет - поясни свое решение.

Автор: maxim1000 19.7.2005, 18:37
можно применить линейный фильтр
например берем гауссовское распределение (просто оно хорошо выглядит, а вообще можно другое какое-нибудь)
дискретизуем его с нужной дискретностью (т.е. вычисляем значения в точке)
и применяем этот фильтр...
Добавлено @ 18:42
в коде это может выглядеть, например, так:
Код

const int XSize=100;
const int YSize=100;
double Gauss(double x,double y)
{
  return exp(-(x*x+y*y)/2);//вообще-то надо еще множитель, чтобы это плотность была, но в нашем случае важна только форма, да и в центре значение не изменится...
}
void Smooth(double **source,double **destination)
//предполагается, что вся память выделена как надо и в destination все нули
{
  for(int sx=0;sx<XSize;sx++)
    for(int sy=0;sy<YSize;sy++)
      for(int dx=0;dx<XSize;dx++)
        for(int dy=0;dy<YSize;dy++)
          destination[dx][dy]+=source[sx][sy]*Gauss(sx-dx,sy-dy);
}

Автор: Alex101 20.7.2005, 09:42
neutrino, а у тебя карта дискретная? (одна клетка - это одна высота?)
В каком виде представлены исходные данные?

Автор: neutrino 20.7.2005, 09:49
Alex101, да.

Автор: Alex101 20.7.2005, 09:53
Цитата(neutrino @ 20.7.2005, 09:49)
да.

smile
А исходные данные как представлены?

Автор: Alex101 20.7.2005, 10:12
Можно попробовать вот что...
"Зацепляешь" первый объект и начинаешь "обрисовывать" его (при этом другие объекты не трогаешь).
"Зацепляешь" следующий объект и делаешь вот что:
если поле белое, то, в зависимости от расстояния, закрашиваешь клетку
иначе сравниваешь цвет, которым надо закрасить для текущего объекта с уже закрашенным цветом.
Если новый цвет "выше", то закрашиваешь, иначе оставляешь.

Алгоритм и его реализация зависят от максимальных значений N и M.

Автор: ~FoX~ 20.7.2005, 10:27
Alex101
Ну вот и прооптимизировали Хафа smile

Интересно, а объекты именно прямоугольной (правильной) формы?


Автор: Alex101 20.7.2005, 10:34
Цитата(Alex101 @ 20.7.2005, 10:12)
если поле белое, то, в зависимости от расстояния, закрашиваешь клетку
иначе сравниваешь цвет, которым надо закрасить для текущего объекта с уже закрашенным цветом.

Да!
При выборе уже второго объекта, как я понимаю, все поле уже будет закрашено.
Так что надо сравнивать...
Цитата
Ну вот и прооптимизировали Хафа

Ну, в этой задаче распознавать ничего не надо, объекты, как я понимаю, заданы однозначно (цветом, допустим).

Автор: neutrino 20.7.2005, 13:03
Привет!

Alex101
Боюсь показаться назойливым, но все же: я именно о таком алгоритме и подумал. У него сложность: м*н*(кол-во объектов). Видимо быстрее нельзя... Ладно, вопрос, наверное стоит снять...


~FoX~
Цитата
Интересно, а объекты именно прямоугольной (правильной) формы?

Да.

maxim1000, извини, но не понял твою идею...

Автор: maxim1000 20.7.2005, 13:24
Цитата(neutrino @ 20.7.2005, 11:03)
maxim1000, извини, но не понял твою идею...

ну представим, что вместо каждой точки у нас холмик
можно посмотреть на этот процесс и так:
1. представляем рисунок в виде суммы "единичных" рисунков - т.е. имеющих только одну закрашенную точку
2. заменяем в каждом рисунке эту закрашенную точку на тот самых холмик
3. в качестве результата берем сумму таких измененных рисунков
а вообще - это обычная цифровая фильтрация, только в 2d
попробуй поискать - в Интернете наверняка найдется
у Alex101'а, насколько я понял то же самое, только вместо + max...
Цитата
Боюсь показаться назойливым, но все же: я именно о таком алгоритме и подумал. У него сложность: м*н*(кол-во объектов). Видимо быстрее нельзя...

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

Автор: ~FoX~ 20.7.2005, 14:01
Цитата(neutrino @ 20.7.2005, 14:03)
maxim1000, извини, но не понял твою идею...

Все просто - "чем выше категория, тем меньше вероятность"......
Но ИМХО выйгрышь получиться только при достаточно больших объемах изначальных данных.

Добавлено @ 14:02
Ой.....не посмотрел, что вторая страница есть smile

Автор: Alex101 20.7.2005, 14:40
Цитата(neutrino @ 20.7.2005, 13:03)
У него сложность: м*н*(кол-во объектов). Видимо быстрее нельзя...

Не, скорее всего, N*M*V (V - количество градаций высот).
Какая идея...

Текущий цвет - (черный-1).
Цвет точки - черный.
Делаем цикл по высоте (от большей к меньшей).
Видим точку и, если можно, то закрашиваем соседние с ней текущим цветом.
Меняем цвет точки (текущий).

Автор: neutrino 20.7.2005, 21:44
Спасибо всем участникам дисскуссии. Я немного подумаю, потом скажу, что сделаю.

Автор: Romikgy 22.7.2005, 09:04
А не проще будет , отдельно посчитать высоты для каждого холмика, а потом сложит все холмики на одном поле???

Автор: Alex101 22.7.2005, 10:19
Цитата(Romikgy @ 22.7.2005, 09:04)
отдельно посчитать высоты для каждого холмика, а потом сложит все холмики на одном поле???

Нет, по сравнению с моей идеей сложнее.

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