В этой статье будет рассмотрен алгоритм рисования одноцветного треугольника. Для начала необходимо создать структуру
данных, которая будет содержать x,y экранные координаты вершин треугольника.
typedef struct _s_vertex_i{
int x,y; // Целые переменные, координаты вершины
}s_vertex_i;
|
Далее понадобится процедура рисования горизонтальной линии.
void DrawHorLine(int x1,int x2,int y){
if(x1>x2) // Если x1>x2 то необходимо поменять их местами иначе цикл не выполнится
x1^=x2^=x1^=x2;
y*=WIDTH;
for(int i=x1;i<=x2;i++)
p_Buffer[y+i]=Current_Color; // Выводит точку на экран
}
|
WIDTH это ширина экрана/окна. p_Buffer это указатель на какой-либо буфер, выводимый на экран. Current_Color это
текущий цвет.
Теперь, собственно, сама процедура, рисующая треугольник.
void Triangle3D(s_vertex_i v[]){ // В качестве параметров указатель на массив вершин
int ymin=0,ymid=0,ymax=0; // Индексы вершин по y
int i;
for(i=1;i<3;i++) // Тут вычисляются индексы самой верхней и самой нижней вершины
if(v[i].y<v[ymin].y)
ymin=i;
else if(v[i].y>v[ymax].y)
ymax=i;
ymid=3-ymax-ymin; // Индекс средней вершины
// Коэффициенты прироста x для каждой стороны треугольника
float k20=((float)(v[ymax].x-v[ymin].x))/(v[ymax].y-v[ymin].y);
float k10=((float)(v[ymid].x-v[ymin].x))/(v[ymid].y-v[ymin].y);
float k21=((float)(v[ymax].x-v[ymid].x))/(v[ymax].y-v[ymid].y);
// Оба x1 и x2 сначала равны
float x1=v[ymin].x;
float x2=x1;
// Отрисовка верхней половины треугольника
for(i=v[ymin].y;i<v[ymid].y;i++){
DrawHorLine(int(x1),int(x2),i);
x1+=k20;
x2+=k10;
}
// Отрисовка нижней половины треугольника
for(i=v[ymid].y;i<v[ymax].y;i++){
DrawHorLine(int(x1),int(x2),i);
x1+=k20;
x2+=k21;
}
}
|
Этот алгоритм довольно простой, но в нем присутствует один минус, а именно то, что используются числа с плавающей
точкой. Отрисовать залитый треугольник без FPU можно используя алгоритм Брезенхама рисования линии.
|