Вывести на экран изображение поверхности z=f(x,y) с удалением невидимых линий используя метод художника, параллельная проекция. Программирование на Си/С


Добавил:DMT
Дата создания:28 июня 2008, 22:05
Дата обновления:28 июня 2008, 22:50
Просмотров:11055 последний вчера, 0:36
Комментариев: 0
Вывести на экран изображение поверхности z=f(x,y) с удалением невидимых линий. Удаление невидимых линий осуществляется используя метод художника, расматривается параллельная проекция.
Функция: z=корень(x^2+y^2)
Код на C++
  1. #include<graphics.h>
  2. #include<math.h>
  3. #include<conio.h>
  4. #include<stdlib.h>
  5. #include<dos.h>
  6.  
  7. const int nx = 40;
  8. const int ny = 40;
  9. const float p = 3.7;
  10.  
  11. float xmax = p, xmin = -p, ymax = p, ymin = -p, zmax = 2 * p, zmin = 0;
  12. float exmax, exmin, eymax, eymin;
  13. int mx, my, line_color, pol_color;
  14.  
  15. float f(float x, float y)
  16. {
  17. return pow((x * x + y * y), 0.5);
  18. }
  19.  
  20. float ex(float x, float y, float z)
  21. {
  22. return -0.2 * x + 0.4 * y;
  23. }
  24.  
  25. float ey(float x, float y, float z)
  26. {
  27. return -0.1 * x + 0.2 * z;
  28. }
  29.  
  30. void vectfi( float x0, float y0, float z0, float x1, float y1, float z1,
  31. float x2, float y2, float z2, float x3, float y3, float z3)
  32. {
  33. float ex0, ey0, ex1, ey1, ex2, ey2, ex3, ey3;
  34. int far* mas;
  35. mas = (int far*)malloc(sizeof(int) * 8);
  36. ex0 = ex(x0, y0, z0);
  37. *mas = (ex0 - exmin) * mx / (exmax - exmin);
  38. ey0 = ey(x0, y0, z0);
  39. *(mas + 1) = my - (ey0 - eymin) * my / (eymax - eymin);
  40. ex1 = ex(x1, y1, z1);
  41. *(mas + 2) = (ex1 - exmin) * mx / (exmax - exmin);
  42. ey1 = ey(x1, y1, z1);
  43. *(mas + 3) = my - (ey1 - eymin) * my / (eymax - eymin);
  44. ex2 = ex(x2, y2, z2);
  45. *(mas + 4) = (ex2 - exmin) * mx / (exmax - exmin);
  46. ey2 = ey(x2, y2, z2);
  47. *(mas + 5) = my - (ey2 - eymin) * my / (eymax - eymin);
  48. ex3 = ex(x3, y3, z3);
  49. *(mas + 6) = (ex3 - exmin) * mx / (exmax - exmin);
  50. ey3 = ey(x3, y3, z3);
  51. *(mas + 7) = my - (ey3 - eymin) * my / (eymax - eymin);
  52. setcolor(line_color);
  53. setfillstyle(SOLID_FILL, pol_color);
  54. fillpoly(4, mas);
  55. }
  56.  
  57. void main(void)
  58. {
  59. int gd = DETECT, gm, i, j;
  60. float x1, y1, x2, y2, x3, y3, x4, y4, hx, hy;
  61. initgraph(&gd, &gm, "C:\\BC31\\BGI");
  62. mx = getmaxx() - 10;
  63. my = getmaxy() - 80;
  64. setcolor(RED);
  65. setfillstyle(SOLID_FILL, WHITE);
  66. hy = (ymax - ymin) / ny;
  67. hx = (xmax - xmin) / nx;
  68. exmax = ex(xmin, ymax, zmax);
  69. exmin = ex(xmax, ymin, zmin);
  70. eymax = ey(xmin, ymin, zmax);
  71. eymin = ey(xmax, ymax, zmin);
  72. line_color = WHITE;
  73. pol_color = BLACK;
  74. vectfi(xmin, ymax, zmax, xmin, ymax, zmin, xmin, ymin, zmin, xmin, ymin, zmax);
  75. vectfi(xmin, ymin, zmin, xmin, ymin, zmax, xmax, ymin, zmax, xmax, ymin, zmin);
  76. vectfi(xmin, ymax, zmin, xmin, ymin, zmin, xmax, ymin, zmin, xmax, ymax, zmin);
  77. line_color = WHITE;
  78. pol_color = RED;
  79.  
  80. for(j = 0; j <= ny - 1; j++)
  81. {
  82. y1 = j * hy + ymin;
  83. y2 = j * hy + ymin;
  84. y3 = (j + 1) * hy + ymin;
  85. y4 = (j + 1) * hy + ymin;
  86. for(i = 0; i <= nx - 1; i++)
  87. {
  88. x1 = i * hx + xmin;
  89. x2 = (i + 1) * hx + xmin;
  90. x3 = (i + 1) * hx + xmin;
  91. x4 = i * hx + xmin;
  92. delay(1);
  93. vectfi(x1, y1, f(x1, y1), x2, y2, f(x2, y2), x3, y3, f(x3, y3), x4, y4, f(x4, y4));
  94. }
  95. }
  96. while(kbhit()) getch();
  97. getch();
  98. closegraph();
  99. }
  100.  
  101.  
При использовании обязательна ссылка на http://DMTSoft.ru
up