Вывести на экран изображение поверхности z=f(x,y) с удалением невидимых линий.
Удаление невидимых линий осуществляется используя метод художника, расматривается параллельная проекция.
Функция: z=корень(x^2+y^2)
Код на C++ #include<graphics.h> #include<math.h> #include<conio.h> #include<stdlib.h> #include<dos.h> const int nx = 40; const int ny = 40; const float p = 3.7; float xmax = p, xmin = -p, ymax = p, ymin = -p, zmax = 2 * p, zmin = 0; float exmax, exmin, eymax, eymin; int mx, my, line_color, pol_color; float f(float x, float y) { return pow((x * x + y * y), 0.5); } float ex(float x, float y, float z) { return -0.2 * x + 0.4 * y; } float ey(float x, float y, float z) { return -0.1 * x + 0.2 * z; } void vectfi( float x0, float y0, float z0, float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3) { float ex0, ey0, ex1, ey1, ex2, ey2, ex3, ey3; int far* mas; mas = (int far*)malloc(sizeof(int) * 8); ex0 = ex(x0, y0, z0); *mas = (ex0 - exmin) * mx / (exmax - exmin); ey0 = ey(x0, y0, z0); *(mas + 1) = my - (ey0 - eymin) * my / (eymax - eymin); ex1 = ex(x1, y1, z1); *(mas + 2) = (ex1 - exmin) * mx / (exmax - exmin); ey1 = ey(x1, y1, z1); *(mas + 3) = my - (ey1 - eymin) * my / (eymax - eymin); ex2 = ex(x2, y2, z2); *(mas + 4) = (ex2 - exmin) * mx / (exmax - exmin); ey2 = ey(x2, y2, z2); *(mas + 5) = my - (ey2 - eymin) * my / (eymax - eymin); ex3 = ex(x3, y3, z3); *(mas + 6) = (ex3 - exmin) * mx / (exmax - exmin); ey3 = ey(x3, y3, z3); *(mas + 7) = my - (ey3 - eymin) * my / (eymax - eymin); setcolor(line_color); setfillstyle(SOLID_FILL, pol_color); fillpoly(4, mas); } void main(void) { int gd = DETECT, gm, i, j; float x1, y1, x2, y2, x3, y3, x4, y4, hx, hy; initgraph(&gd, &gm, "C:\\BC31\\BGI"); mx = getmaxx() - 10; my = getmaxy() - 80; setcolor(RED); setfillstyle(SOLID_FILL, WHITE); hy = (ymax - ymin) / ny; hx = (xmax - xmin) / nx; exmax = ex(xmin, ymax, zmax); exmin = ex(xmax, ymin, zmin); eymax = ey(xmin, ymin, zmax); eymin = ey(xmax, ymax, zmin); line_color = WHITE; pol_color = BLACK; vectfi(xmin, ymax, zmax, xmin, ymax, zmin, xmin, ymin, zmin, xmin, ymin, zmax); vectfi(xmin, ymin, zmin, xmin, ymin, zmax, xmax, ymin, zmax, xmax, ymin, zmin); vectfi(xmin, ymax, zmin, xmin, ymin, zmin, xmax, ymin, zmin, xmax, ymax, zmin); line_color = WHITE; pol_color = RED; for(j = 0; j <= ny - 1; j++) { y1 = j * hy + ymin; y2 = j * hy + ymin; y3 = (j + 1) * hy + ymin; y4 = (j + 1) * hy + ymin; for(i = 0; i <= nx - 1; i++) { x1 = i * hx + xmin; x2 = (i + 1) * hx + xmin; x3 = (i + 1) * hx + xmin; x4 = i * hx + xmin; delay(1); vectfi(x1, y1, f(x1, y1), x2, y2, f(x2, y2), x3, y3, f(x3, y3), x4, y4, f(x4, y4)); } } while(kbhit()) getch(); getch(); closegraph(); }
|