Общий алгоритм вопроса - PullRequest
7 голосов
/ 07 июля 2010

Предположим, у нас есть сетка (см. Иллюстративную картинку из CorelDraw, которая использует ту же технику в "Заполнение сетки" инструмент) .

alt text http://www.sonic.net/mnitepub/pccafe/reviews/coreldraw9/meshfill.jpg

Очевидно, что этот тип сетки представлен набором точек, и линии между ними фактически определяются с использованием этого набора точек (возможно, как-то интерполированного). Этот инструмент также имеет кнопки для увеличения разрешения сетки.

Мой вопрос заключается в следующем - как вычисляются такие вещи? Предположим, у меня есть некоторый набор точек, которые фактически представляют сетку (для простого случая давайте даже предположим, что точки на «границе» статичны и не могут двигаться). И я хочу увеличить разрешение сетки, например, в 4 раза (чтобы количество точек сеткина самом деле становится 4 * initial_points_count).

Как рассчитать местоположение новых точек, если у меня есть только данные, которые у меня есть, это матрица исходных точек?

Самый быстрый(даже приблизительный) метод подойдет мне, но я не знаю, где искать или как разработать такой алгоритм.

Спасибо.

Ответы [ 5 ]

4 голосов
/ 07 июля 2010

Комментарии к существующим ответам:

Мне кажется, что ответ Мау и Мартиента описывает решение проблемы приближения известной формы с полигональной сеткой (а у вас нет известной формы).

Алгоритм, который упоминает Дейв, сгладит любую форму, но не обязательно по назначению.

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

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

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

EDIT: После более внимательного изучения того, как это делает corel, и предположения, что вы действительно знаете кривые, а не только точки (!):

  • Вы начинаете с набора кривых, и мне кажется, что у вас есть горизонтальные и вертикальные кривые, чтобы начать с
  • Если вы хотите увеличить разрешение (например, разрешение по горизонтали), вы можете взять две последовательные вертикальные кривые и разделить каждый сегмент горизонтальных кривых, через которые они проходят, в точке в середине , создавая таким образом набор точек которые определяют новую кривую; Вы также можете интерполировать угол, под которым кривая проходит через точку

альтернативный текст http://img706.imageshack.us/img706/5693/path5818.png

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

Примечание : В зависимости от алгоритма, для которого вы готовите сетку, вы можете иметь или не иметь никаких преимуществ, рассматривая линии сетки как кривые (различие между красным и синим растворами может быть незначительным для некоторых алгоритм и важно для других). Если алгоритм просто ожидает точки, то вам также следует посмотреть, как аппроксимировать кривые Безье с точками (чтение может помочь ; хотя вам не нужна точность пикселей).

Для достижения максимальной точности / наилучших результатов вы должны сначала увеличить плотность кривых и приблизить их с помощью линий.

2 голосов
/ 07 июля 2010

Я бы начал с добавления точек на полпути по всем линиям путем интерполяции (кривые на рисунке, скорее всего, Кривые Безье какого-либо рода, поэтому я бы интерполировал их как таковые или использовал бы билинейную интерполяцию в качестве Mau предложил) и расположить новые точки на полпути между старыми, давая мне в 3 раза больше разрешения. Затем я интерполировал бы между этими новыми точками (в обоих направлениях, если точность является ключевой) и помещал новую точку на пересечении (или на полпути). См. «Иллюстрацию» ниже.

Initial state  =>  Interpolate  =>  Place points  =>  Interpolate => Final state
  x       x         x-------x        x   x   x         x   x   x      x   x   x
                    |       |                              |    
                    |       |        x       x         x---+---x      x   x   x
                    |       |                              |
  x       x         x-------x        x   x   x         x   x   x      x   x   x
2 голосов
/ 07 июля 2010

Вы смотрели на подраздел ?Должно работать для уточнения таких сеток.

2 голосов
/ 07 июля 2010

То, что вы ищете - это алгоритм сглаживания сетки. К сожалению, у меня нет никаких ресурсов под рукой, поэтому я могу только предложить Google для "сглаживания сетки". Это огромное поле.

РЕДАКТИРОВАТЬ

Вот краткий обзор нескольких методов / алгоритмов для сглаживания сетки: http://www.mpi -inf.mpg.de / ~ ag4-gm / handouts / 06gm_surf3.pdf

1 голос
/ 07 июля 2010

Похоже на работу для Билинейная интерполяция (где система координат находится на поверхности сферы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...