Я работаю над проектом визуализации для двухмерных непрерывных данных. Это то, что вы можете использовать для изучения данных о высоте или температурных моделей на двумерной карте. По своей сути, это действительно способ сглаживания 3-мерных размеров в двухмерный плюс цвет. В моей конкретной области изучения я фактически не работаю с данными географической высоты, но это хорошая метафора, поэтому я буду придерживаться ее на этом посту.Рисование топографической карты
В любом случае, на данный момент, у меня есть «непрерывный» цвет средства визуализации, что я очень доволен:
Градиент стандартный цвет колеса, где красные пиксели указывают координаты с высокие значения и фиолетовые пиксели указывают низкие значения.
Основная структура данных использует некоторые очень умные алгоритмы интерполяции (если я так говорю сам), чтобы позволить сколь угодно глубокое масштабирование деталей карты.
На данный момент я хочу нарисовать некоторые топографические контурные линии (используя квадратичные кривые безье), но я не смог найти хорошую литературу, описывающую эффективные алгоритмы поиска этих кривых.
Чтобы дать вам представление о том, для чего я думаю о том, вот реализации бедного-человек (где рендер просто использует черное значение RGB, когда он сталкивается пиксель, который пересекает контурную линию):
Есть несколько проблем с этим подходом, хотя:
Область графа с крутым склоном в результате более тонких (и часто ломается) линий тих. В идеале все линии топо должны быть непрерывными.
Области графика с более плоским наклоном приводят к более широким линиям топо (и часто целым областям черноты, особенно по внешнему периметру области рендеринга).
Таким образом, я рассматриваю подход векторного рисования для получения этих хороших, идеальных кривых толщиной в 1 пиксель. Базовая структура алгоритма будет включать следующие шаги:
на каждом дискретном возвышении, где я хочу провести топографическую линию, найти набор координат, где высота, на которые координируют очень близко (Дано произвольное значение эпсилона) до желаемой высоты.
Устранение избыточных точек. Например, если три точки находятся в абсолютно прямой линии, то центральная точка избыточна, так как ее можно устранить без изменения формы кривой. Аналогично, с кривыми Безье, часто можно исключить точки привязки цетаина, отрегулировав положение соседних контрольных точек.
Соберите оставшиеся точки в последовательность, чтобы каждый сегмент между двумя точками приближался к нейтральной по высоте траектории и таким образом, чтобы ни один из двух сегментов никогда не пересекал пути. Каждая точка-последовательность должна либо создавать замкнутый многоугольник, либо пересекать ограничивающий прямоугольник области рендеринга.
Для каждой вершины найдите пару контрольных точек, для которых результирующая кривая имеет минимальную ошибку в отношении избыточных точек, исключенных на шаге 2.
Убедитесь, что все функции топографии, видимые в текущей шкале рендеринга, представлены соответствующими линиями топо. Например, если данные содержат всплеск с большой высотой, но с очень маленьким диаметром, топо-линии все равно должны быть нарисованы. Вертикальные функции следует игнорировать только в том случае, если их диаметр функции меньше, чем общая градиентность изображения.
Но даже при этих ограничениях, я все еще могу думать о нескольких различных эвристик для нахождения строки:
Найти высокую точку внутри рендеринга ограничительной рамки. С этой высокой точки, двигайтесь вниз по нескольким различным траекториям. Всякий раз, когда линия обхода пересекает порог возвышения, добавьте эту точку в ведро, зависящее от высоты. Когда путь обхода достигает локального минимума, измените курс и двигайтесь в гору.
Выполнение обхода высокого разрешения вдоль прямоугольной ограничивающей области области рендеринга. На каждом пороге возвышенности (и в точках перегиба, где бы ни направление наклона не менялось), добавьте эти точки в ведро, зависящее от высоты. По завершении обхода границы начните трассировку внутрь от граничных точек в этих ведрах.
Сканировать всю область визуализации, принимая измерение высоты в разреженном регулярном интервале. Для каждого измерения используйте его близость к пороговому значению высоты в качестве механизма для принятия решения о необходимости или нет интерполированного измерения его соседей. Использование этого метода обеспечит лучшие гарантии покрытия во всей области рендеринга, но было бы сложно собрать результирующие точки в разумный порядок построения путей.
Итак, вот некоторые из моих мыслей ...
Перед погружением глубоко в реализации, я хотел бы видеть, есть ли кто-либо другой на StackOverflow опыт работы с такого рода проблемы и может дать указатели для точная и эффективная реализация.
Edit:
Я особенно заинтересован в предложении "Градиент", сделанного ellisbben. И моя основная структура данных (игнорируя некоторые из оптимизирующих ярлыков интерполяции) можно представить в виде суммирования набора двумерных гауссовских функций, который является полностью дифференцируемым.
Предполагаю, что мне понадобится структура данных для представления трехмерного наклона и функция для вычисления этого вектора наклона для произвольной точки. С головы до ног я не знаю, как это сделать (хотя кажется, что это должно быть легко), но если у вас есть ссылка, объясняющая математику, я был бы очень обязан!
UPDATE:
Благодаря отличному взносов ellisbben и Азим, теперь я могу вычислить угол контура для любой произвольной точки в поле. Рисование реальных линий topo будет следовать в ближайшее время!
Ниже приведены обновленные визуализации, с использованием и топологией рендеринга на основе растрового гетто, которые я использовал. Каждое изображение включает в себя тысячу случайных точек выборки, представленных красными точками. Угол контура в этой точке представлен белой линией. В некоторых случаях ни один наклон не может быть измерен в данной точке (в зависимости от степени детализации интерполяции), поэтому красная точка возникает без соответствующей линии угла-контура.
Наслаждайтесь!
(ПРИМЕЧАНИЕ. Эти визуализации используют другую топографию поверхности, чем предыдущие визуализации, поскольку я произвольно генерирую структуры данных на каждой итерации, в то время как я прототипирую, но метод рендеринга ядра тот же, поэтому я уверен, что вы получите идею)
Вот забавный факт:. над на правой руке стороне от этих визуализаций, вы увидите кучу странных контура линии в идеальном горизонтальном и вертикальном льные углы. Это артефакты процесса интерполяции, который использует сетку интерполяторов для уменьшения количества вычислений (примерно на 500%), необходимых для выполнения операций рендеринга ядра. Все эти странные контурные линии происходят на границе между двумя ячейками сетки интерполятора.
К счастью, эти артефакты на самом деле не имеют значения. Хотя артефакты обнаруживаются во время вычисления наклона, конечный рендерер их не заметит, поскольку он работает с другой битовой глубиной.
UPDATE РАЗ:
Aaaaaaaand, как один из окончательного снисходительности, прежде чем пойти спать, вот еще пару визуализаций, один в старой школе «непрерывный цвет» стиль, и один с 20000 градиентных образцов , В этом наборе рендеринга я удалил красную точку для точечных образцов, так как она излишне загромождает изображение.
Здесь вы можете действительно увидеть те интерполяционные артефакты, о которых я упоминал ранее, благодаря grid-структуре коллекции интерполяторов. Я должен подчеркнуть, что эти артефакты будут полностью невидимы при окончательном рендеринге контура (так как разница в величине между любыми двумя соседними ячейками интерполятора меньше, чем битовая глубина визуализированного изображения).
Bon appetit !!
Почему бы вам не использовать существующую библиотеку, инструмент (например, gnuplot, tecplot)? – jfs 2008-11-04 20:56:16
Вы говорите, что данные непрерывны - это означает, что вы можете алгоритмически вычислять значения для межпиксельных координат? – Alnitak 2008-11-04 21:33:38
Да, я могу вычислить значение в любой координате (с 64-битной точностью с плавающей запятой). Структура данных на самом деле представляет собой совокупность двумерных гауссовских функций, каждая со своей собственной амплитудой и стандартным отклонением, а в интерполяции используется показатель плотности ядра, чтобы найти эти промежуточные значения. – benjismith 2008-11-04 21:38:18