Растеризация треугольников на основе барицентрических координат C#

В этой статье мы рассмотрим алгоритм и пример программы, растеризующей треугольники с интерполяцией атрибутов вершин на основе барицентрических координат. Звучит громоздко? Не пугайтесь, все не настолько сложно.

В результате разработки, мы получим программу, которая будет рисовать на экране вот такое изображение:

Растеризация треугольников на C#

Итак, обо всем по порядку.

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

Примечание. Интерполяция – это получение промежуточных значений величины, на основе набора известных значений.

Допустим, у нас имеется pictureBox размером 800 x 600 пикселей. За начало координат примем левый верхний угол.

Растеризация треугольника - координаты

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

Барицентрические координаты

Барицентрические координаты

Барицентрические координаты

где x1, y1, x2, y2, x3, y3 – координаты вершин треугольника, а x, y – координаты текущей точки. Текущая точка принадлежит треугольнику, если выполняется условие:

Барицентрические координаты

(то есть все три барицентрические координаты должны принадлежать отрезку [0, 1])

Подробнее прочитать про барицентрические координаты можно здесь и здесь.

В итоге имеем такой алгоритм растеризации треугольника:

1) Значению цвета текущей точки присваивается цвет фона.

2) Вычисляются барицентрические координаты текущей точки относительно вершин текущего треугольника.

3) Выполняется проверка условия принадлежности точки треугольнику.

4) Если условие верно, то точка принадлежит треугольнику, и значению ее цвета присваивается цвет, полученный при интерполяции атрибутов вершин этого треугольника. Иначе: переходим к следующему треугольнику (если такой [еще] имеется) и пункту 2.

5) Вывод текущей точки, переход к следующей и пункту 1.

Итак, создадим в Visual Studio проект Windows Forms (С#). Поместим в форму элемент управления pictureBox и зададим в свойствах его размеры 800 x 600:

pictureBox

Теперь создадим в этом проекте файл (назовем его, например, data.cs). Там у нас будет находится такой код:

В строке номер 7 указано количество треугольников (в нашем случае шесть треугольников). В строках 9-16 задаем координаты вершин треугольников (в первом столбике координаты первого треугольника, во втором – второго, и т.д.). В строках 18-20 указаны атрибуты вершин треугольников – их цвета (также по столбикам).

Далее. Переходим к коду класса Form1.cs. Используя директиву using, подключаем пространство имен из файла data.cs:

Объявляем экземпляр класса Bitmap (необходим для хранения изображения):

В конструкторе класса Form1.cs после InitializeComponent() добавляем такой код:

Здесь мы инициализируем image размерами pictureBox1, вызываем функцию Rasterization() (о ней далее) и переносим изображение из Bitmap image в pictureBox1.

Теперь добавим функцию Rasterization(), которая пройдется по всем пикселям на плоскости и занесет вычисленный цвет текущей точки в Bitmap image:

ShadeBackgroundPixel(x, y) – вычисляет цвет пикселя с координатами (x, y).

Color.FromArgb() – переводит цвет из ARGB в класс Color, необходимый для работы функции image.SetPixel().

Переходим к функции ShadeBackgroundPixel(x, y), написанной на основе алгоритма, рассмотренного выше:

Здесь мы работаем с типом данных UInt32 – это беззнаковое 32-х разрядное целое число.

Интерполяцию (строка 17), то есть вычисление цвета точки в треугольнике на основе цветов его вершин, проводим так: последовательно каждую из компонент цвета R, G и B вершины A умножаем на барицентрическую координату l1, компоненты вершины B на l2, C – на l3.

На этом все. Исходник программы можно скачать, нажав на кнопку внизу страницы. А наша программа работает вот так:

Растеризация треугольников на C#

Скачать исходник

 

Растеризация треугольников на основе барицентрических координат C#
5 (100%) 2 votes

Поделиться в соц. сетях:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">