Страница 1 из 1

Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 10:02
trololo
Здравствуйте. Стоит следующая задача, не знаю как подступиться.
Есть карта Москвы, необходимо изменить карту: центр города увеличить, а за ТТК сжать.
Примерно как на картинке
http://s019.radikal.ru/i640/1205/79/e4ce993a7f59.png

Натянуть на шар - не получается достаточного увеличения центра.
А трансформировать чтобы растянуть - теряется точность.

Какие есть варианты ?

Re: Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 10:17
ericsson
Карта - растр или вектор?
"Теряется точность" - что это значит?
Спроецировать на тело вращения параболы - не пойдет (раз на шар уже пробовали)?

Re: Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 10:34
trololo
Вектор.

То что после трансформации по точкам исходной и конечной окружности, между конечными точками искажение. Тоесть требуется бесконечное их множество.

Как это делается ?

Re: Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 12:53
Пётр Дубоделов
Присоединяюсь к вопросу и немного расширю его:
Интересно найти простой способ построения анаморфоз. Видел примеры, преимущественно в зарубежных изданиях, когда география(границы полигона) визуально искажаются в зависимости от значения показателя.
Пример

Re: Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 13:56
ericsson
Хорошо, что вектор.
Про ошибку все равно не очень понял, ну да ладно.
Про проекцию на параболическую поверхность спросил просто из-за того, что было упомянуто натягивание на сферу :)
А мой способ был бы следующим:
- будем работать в полярных координатах
- наша задача - сдвинуть каждую точку карты в пределах радиуса R от центра на некое расстояние, которое будет большим в центре и убывать (по закону, который определим далее) до нуля к краю (R)
- сдвигать будем не прибавлением, а умножением координаты r каждой точки на некое значение d
- придумаем (тут уж хозяин - барин, можно экспериментировать как угодно) некую функцию d=f(r), где r будет меняться от 0 до R, а d будет меняться от d1 (сдивга точки, карты, находящейся ближе всего к центру) до 0. Функцию можно придумать даже какую-нибудь параметрическую, чтобы по вертикали и горизонтали растяжение было разным, в духе d=f(rx,ry)
- ну а дальше - дело техники: переводим x1,y1 каждой точки в r,φ , превращем в r*d(r),φ и обратно в x2,y2

Re: Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 15:42
rhot
Пётр Дубоделов писал(а):Интересно найти простой способ построения анаморфоз.
http://scapetoad.choros.ch/

Re: Увеличить центр города, уменьшив окраины

Добавлено: 15 май 2012, 16:41
ericsson
А, забыл добавить (вспомнил, глянув по на материал по ссылке про анаморфоз) - вместо функции d=f(r) можно использовать и сгенерированную как угодно последовательность значений d достаточного "разрешения" (длины), это будет своеобразная LUT. Дабы не случилось ступенчатости, значения между числами из LUT просто интерполируются.
Аналогично, вместо одномерной LUT можно использовать двумерную, тогда это будет уже displacement map (интерполяция в таком случае тоже должна быть двумерной (между тремя или четырьмя ближайшими точками карты смещения). Ее можно сгенерировать хоть в растровом графическом редакторе, повозюкав белой кисточкой с размытыми краями по черному фону.

Re: Увеличить центр города, уменьшив окраины

Добавлено: 16 май 2012, 04:57
gamm
анаморфоза произвольного вида строится довольно просто, так дифурщики делают сетки конечных элементов с переменным размером.
1) область покрывается достаточно густой сеткой, обычно регулярной треугольной
2) на сетке задается функция "увеличения" (как должна измениться метрика)
3) края (узлы на границе) фиксируются, и запускается итерационный алгоритм, который пытается подвинуть соседние свободные вершины сетки так, чтобы расстояние между ними увеличилось/уменьшилось в соответствии с заданной функцией. Шаг делают достаточно маленьким, чтобы не порушить топологию.
4) полученная треугольная сетка используется для преобразования координат. Получится упоминавшаяся двумерная LUT. Если сетка достаточно густая, то артефактов практически не видно.