Алгоритм Брезенхема для вывода эллипса

Алгоритм Брезенхема для вывода эллипса

Алгоритм Брезенхема для вывода эллипса

Одно время у меня была мания на, всякого рода, графические библиотечки :) Они еще не раз появятся на этом сайте.

Казалось бы — убитое время: Ан нет, опыт написания подобных очень пригодился при разработке своего клона GD, который выводит курс валют и информер погоды на www.novgorod.ru, счетчик и кое-какие графики на top.novgorod.ru.

Здесь приведена неотъемлемая часть такое библиотек — Алгоритм Брезенхема для вывода эллипса, самый быстрый из подобных.

  1. #include <conio.h>
  2. #include <stdlib.h>
  3.  
  4. //############################ Вывод точки ##################################
  5. void putpixel(unsigned int X,unsigned int Y,unsigned char Color)
  6. {
  7. asm {
  8. mov ax, [Y]
  9. mov dx, 320
  10. imul dx
  11. add ax, [X]
  12. mov di, ax
  13. push es
  14. mov ax, 0xA000
  15. mov es, ax
  16. mov al,[Color]
  17. stosb
  18. pop es
  19. }
  20. }
  21.  
  22. //################ Алгорит Брезенхема для рисования эллипса #################
  23. void ellipse(int x, int y, int a, int b, int color)
  24. {
  25. int col,i,row,bnew;
  26. long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d;
  27.  
  28. b_square=b*b;
  29. a_square=a*a;
  30. row=b;
  31. col=0;
  32. two_a_square=a_square<<1;
  33. four_a_square=a_square<<2;
  34. four_b_square=b_square<<2;
  35. two_b_square=b_square<<1;
  36. d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square);
  37. while(a_square*(row)>b_square*(col))
  38. {
  39. putpixel(col+x,row+y,color);
  40. putpixel(col+x,y-row,color);
  41. putpixel(x-col,row+y,color);
  42. putpixel(x-col,y-row,color);
  43. if (d>=0)
  44. {
  45. row--;
  46. d-=four_a_square*(row);
  47. }
  48. d+=two_b_square*(3+(col<<1));
  49. col++;
  50. }
  51. d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square;
  52. while ((row) + 1)
  53. {
  54. putpixel(col+x,row+y,color);
  55. putpixel(col+x,y-row,color);
  56. putpixel(x-col,row+y,color);
  57. putpixel(x-col,y-row,color);
  58. if (d<=0)
  59. {
  60. col++;
  61. d+=four_b_square*col;
  62. }
  63. row--;
  64. d+=two_a_square*(3-(row <<1));
  65. }
  66. }
  67.  
  68. void main(void)
  69. {
  70. int X,Y;
  71.  
  72. asm mov ax,0x0013
  73. asm int 0x10
  74. while (!kbhit()) putpixel(random(320),random(200),random(255));
  75. getch();
  76. while (!kbhit())
  77. {
  78. X=50+random(220);
  79. Y=50+random(100);
  80. ellipse(X,Y,1+random(48),1+random(48),random(255));
  81. }
  82. getch();
  83. }

Download this code: demo_320.cpp

Комментарии