Залитый треугольник
  В этой статье будет рассмотрен алгоритм рисования одноцветного треугольника. Для начала необходимо создать структуру 
данных, которая будет содержать 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 можно используя алгоритм Брезенхама рисования линии.
Статью написал faceH0r 12.07.2005
Используются технологии uCoz