for (i = 0; i < sizeof ( YMax ) / sizeof (int); i++ ) YMin [i] = YMax [i] = NO_VALUE;
for (i = n2 - 1; i > -1; i- ) {
for (j = 0; j <n1; j++ ) {
x = x1 + j * hx; у = y1 + i * hy;
curLine Q].x = (int)(ax+bx*(x*e1 [0]+y*e1 [1]));
curLine fl].y = (int)(ay+by*(x*e2 [0]+y*e2 [1]+f ( x, у ) * e2 [2]));
}
for (j = 0; j < n1 -1; j>+ ) drawLine ( curLine [j], curLine 0 + 1]);
}
delete curLine;
}
float f ( float x, float у ) {
float r = x*x + y*y; return 0.5*sin(2*x)*sin(2*y);
}
main () {
int driver = DETECT; int mode; int res;
initgraph ( &driver, &mode,""); if ((res = graphresult ()) != grOk )
{
printf("\nGraphics error: %s\n", grapherrormsg(res)); exit (1 );
}
plotSurface (-2, -2, 2, 2, f2, -0.5, 1, 40, 40 );
getch (); closegraph ();
}
Функция drawLine осуществляет построение отрезка, соединяющею две ные точки р\ и р2, проводя отсечение с учетом линий горизонта YMin и YMax необходимости корректируя их. При этом часть отрезка, лежащая выше верхи
10. Удаление невидимых линий и поверхностей нии горизонта, рисуется цветом upColor, а часть, лежащая ниже нижней линии горизонта, рисуется цветом downColor.
Для вывода графика, состоящего из линий z = f(x, yt) и z = f(xjt у), необходимо изменить процедуру plotSurface так, чтобы отрезки ломаных выводились в порядке удаления от картинной плоскости (с сохранением порядка загораживания), ибо возможна ситуация, когда отрезок л-линии закрывает часть отрезка у-линии и наоборот. Возмо кно несколько типов подобного упорядочения (включая и обыкновенную сортировку), простейшим из которых является следующий: сначала выводится линия z =f(x, Vi), затем отрезки, соединяющие эту линию со следующей линией, и т. д. Ниже приводится текст функции plotSurface2, осуществляющей такое построение.
01 // File example2.cpp
void plotSurface2 ( double x1, double y1, double x2, double y2, double (*f)( double, double ), double fMin, double fMax, int n1, int n2 )
{
Point2 * curLine = new Point [n1];
Point2 * nextLine = new Point [n1];
float phi = 30*M_PI/180;