Рисование треугольника методом простого ЦДА и его закраска методом XOR_PUT


Добавил:DMT
Дата создания:4 декабря 2007, 2:02
Дата обновления:18 июня 2008, 22:51
Просмотров:5728 последний вчера, 9:13
Комментариев: 0
Код на C++
  1.  
  2. #include <graphics.h>
  3. #include <math.h>
  4. #include <conio.h>
  5. #include <stdio.h>
  6. #include <dos.h>
  7.  
  8.  
  9. /*метод простого ЦДА
  10. void point(int x,int y){
  11. Form1->canvas->pixel[x][y];
  12. }
  13. */
  14. int color=0;
  15. sign(int r)
  16. {
  17. if(r>0) return 1;
  18. else if(r<0) return -1;
  19. else return 0;
  20. }
  21. void point(int x,int y){
  22. putpixel(x,y,color);
  23. }
  24. //Рисование линии методом простого ЦДА
  25. void line_cda(int x0,int y0,int x1,int y1)
  26. {
  27. int i,l,x,y;
  28. if(abs(x1-x0)>abs(y1-y0)) l=abs(x1-x0);
  29. else l=abs(y1-y0);
  30. if(l==0) {point(x0,y0); return;}
  31. float hhx=1, hhy=1; //простой ЦДА
  32. float dx=(float)((x1-x0)/float(l));
  33. float dy=(float)((y1-y0)/float(l));
  34. int ex=sign(x1-x0), ey=sign(y1-y0);
  35. float rez=0.5; //аккумулятор
  36. x=x0; y=y0;
  37. int flagx=0, flagy=0; //флаги для проверки на конечную точку
  38. do
  39. {
  40. if(abs(dx)<abs(dy))
  41. {
  42. //приращение всегда по у, а по х при условии rez<=0 rez>=1
  43. point(x,y);
  44. rez+=dx;
  45. if(rez>=1||rez<=0)
  46. {
  47. x+=ex*hhx;
  48. rez-=ex;
  49. }
  50. if(!flagx) flagx=x==x1?1:0;
  51. y+=ey*hhy;
  52. if(!flagy) flagy=y==y1?1:0;
  53. }
  54. else
  55. {
  56. //всегда по х, а по у при условии rez<=0 rez>=1
  57. point(x,y);
  58. x+=ex*hhx;
  59. if(!flagx)flagx=x==x1?1:0;
  60. rez+=dy;
  61. if(rez>=1||rez<=0) {y+=ey*hhy; rez-=ey;}
  62. if(!flagy)flagy=y==y1?1:0;
  63. }
  64. }
  65. while(!(flagx==1 && flagy==1));
  66. point(x1,y1); //последняя точка
  67. }
  68.  
  69.  
  70. int oldx,oldy,ox=299;//xпред, yпред
  71.  
  72. //Функция сравнивает текущую точку обхода периметра
  73. //с предыдущей и выполняет соответствующие действия
  74. //в качестве параметров передаются координаты текущей точки
  75. //закраска методом XOR_PUT
  76. void XorLine(int x, int y)
  77. {
  78. if (y>oldy) line(x,y,300,y);
  79. if (y<oldy) {
  80. line(oldx,oldy,ox--,oldy);
  81. }
  82. oldx=x; oldy=y; //текущая точка становится предыдущей
  83. }
  84.  
  85.  
  86.  
  87. void main()
  88. {
  89. int graphdriver=DETECT, graphmode;
  90. initgraph(&graphdriver,&graphmode,"");
  91. color=12;
  92. setcolor(12);
  93. line_cda(99,99,300,300);
  94. line_cda(99,99,99,300);
  95. line_cda(99,300,300,300);
  96. getch();
  97.  
  98. setcolor(WHITE); //установка белого цвета
  99. setwritemode(XOR_PUT); //установка режима вывода XOR_PUT
  100. oldx=100; oldy=100; //инициализируем предыдущие координаты
  101. //проход по левой стороне квадрата с задержкой
  102. int i;
  103. for(i=100;i<=299;i++) {XorLine(100,i); delay(10);}
  104. //проход по нижней стороне квадрата
  105. for(i=100;i<=299;i++) XorLine(i,299);
  106. //проход по правой стороне квадрата с задержкой
  107. for(i=299;i>=100;i--) {XorLine(300,i); delay(10);}
  108. //проход по верхней стороне квадрата с задержкой
  109. for(i=299;i>=100;i--) XorLine(i,100);
  110. getch();
  111. closegraph();
  112. }
При использовании обязательна ссылка на http://DMTSoft.ru
up