}
if (torus [i].coeff > 0 ) tmp [count++] = torus [i];
}
// sort them
qsort (tmp, count, sizeof ( Facet), facetComp );
Point edges [3];
// draw them
for (i = 0; i < count; i++ )
{
for (int k = 0; k < 3; k++ ) {
edges [k].x = 320 + 30*vertex [tmp [i].index [k]].x; edges [kj.y = 240 + 30*vertex [tmp [ij.index [kjj.y;
}
int color = 64 + (int)( 20 + 43 * tmp [i].coeff);
setfilistyle ( SOLID_FILL, color);
setcolor (color);
fillpoly ( 3, (int far *) edges );
}
}
main () {
int driver; int mode = 2; int res;
if (( driver = installuserdriver ("VESA", NULL )) ==- grError) {
printf ("\nCannot load extended driver"); exit (1 );
}
initgraph ( &driver, &mode,); if ((res = graphresult ()) != grOk )
{
printf("\nGraphics error: %s\n", grapherrormsg(res)); exit (1 );
}
for (int i = 0; i < 64; i++ )
setrgbpalette (64 + i, i, i, i);
torus = new Facet [N1*N2*2]; tmp = new Facet [N1*N2*2];
initTorus (); drawTorus ();
Компьютерная графика. Полигональные модели
getch (); closegraph ();
delete tmp; delete torus;
}
Хотя подобный подход и работает в подавляющем большинстве случаев, однако возможны ситуации, когда просто сортировка по расстоянию до картинной плоскости не обеспечивает правильного упорядочения граней (рис. 10.29), - так, грань В будет ошибочно выведена раньше, чем грань А; поэтому после сортировки желательно проверить порядок, в котором грани будут выводиться.
Предлагается следующий алгоритм этой проверки. Для простоты будем считать, что рассматривается параллельное проектирование вдоль оси Oz.
Перед выводом очередной грани Р следует убедиться, что никакая другая грань Q, которая стоит в списке позже, чем Р, и проекция которой на ось Oz пересекается с проекцией грани Р (если пересечения нет, то порядок вывода Р и Q определен однозначно), не может закрываться гранью Р. В этом случае грань Р действительно должна быть выведена раньше, чем грань Q.
Ниже приведены 4 теста в порядке возрастания сложности проверки:
1. Пересекаются ли проекции этих граней на ось 0x1