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

В результате применения описанной процедуры мы получаем правильное изображение поверхности.

Для определения порядка, в котором должны выводиться грани, воспользуемся тем, что треугольники, лежащие в полосе

|(x,y),yi <у<у1+1}, не могут закрывать треугольники из полосы {(х,у),ум <у<У;}.

10. Удаление невидимых линий и поверхностей Таким образом, грани можно выводить по полосам, по мере их приближения к картинной плоскости.

Приводимая программа реализует этот алгоритм с использованием 256-цветного режима. Трань окрашивается в цвет, интенсивность которого пропорциональна косинусу угла между нормалью к грани и направлением проектирования (подробнее о закрашивании - в гл. 2 и 11).

21 // File example3.cpp
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <process.h>
rrinclude <stdio.h>
#include <stdlib.h>
#include "Vector3D.h"
struct Point // screen point
{
int x, y;
};
void plotShadedSurface ( double x1, double y1, double x2, double y2, double (*f)( double, double ), double fmin, double fmax, int n1, int n2 )
{
Point * curLine = new Point [n1]; Point * nextLine = new Point [n1]; Vector3D * curPoint = new Vector3D [n1]; Vector3D * nextPoint= new Vector3D [n1]; float phi = 30*M_PI/180; float psi = 20*M_PI/180; * float sphi = sin ( phi); float cphi = cos ( phi); float spsi = sin ( psi); float cpsi = cos ( psi); Vector3D e1 ( cphi, sphi, 0 ); Vector3D e2 ( spsi*sphi, -spsi*cphi, cpsi); Vector3D e3 ( sphi*cpsi, -cphi*cpsi, -spsi); float xMin = ( e1 [0] >= 0 ? x1 : x2 ) * e1 [0]

⇐ Предыдущая| |Следующая ⇒