Guest User

Untitled

a guest
Apr 24th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. #define incx() x++, dxt += d2xt, t += dxt
  2. #define incy() y--, dyt += d2yt, t += dyt
  3.  
  4. void ellipse(int xc, int yc, int rx, int ry, int color)
  5. {
  6. int x = 0, y = ry;
  7. long rx2 = (long)rx*rx, ry2 = (long)ry*ry;
  8. long crit1 = -(rx2/4 + rx%2 + ry2);
  9. long crit2 = -(ry2/4 + ry%2 + rx2);
  10. long crit3 = -(ry2/4 + ry%2);
  11. long t = -rx2*y; // e(x+1/2,y-1/2) - (a^2+b^2)/4
  12. long dxt = 2*ry2*x, dyt = -2*rx2*y;
  13. long d2xt = 2*ry2, d2yt = 2*rx2;
  14.  
  15. while (y>=0 && x<=rx)
  16. {
  17. pixel(xc+x, yc+y, color);
  18. if (x!=0 || y!=0)
  19. pixel(xc-x, yc-y, color);
  20. if (x!=0 && y!=0)
  21. {
  22. pixel(xc+x, yc-y, color);
  23. pixel(xc-x, yc+y, color);
  24. }
  25. if (t + ry2*x <= crit1 || //e(x+1,y-1/2) <= 0
  26. t + rx2*y <= crit3) //e(x+1/2,y) <= 0
  27. incx();
  28. else if (t - rx2*y > crit2) //e(x+1/2,y-1) > 0
  29. incy();
  30. else
  31. {
  32. incx();
  33. incy();
  34. }
  35. }
  36. }
  37.  
  38. #define incx() do { x++; dxt += d2xt; t += dxt; } while (0)
  39. #define incy() do { y--; dyt += d2yt; t += dyt; } while (0)
  40.  
  41. cpp cpp.c > cppout.c
  42.  
  43. # 1 "cpp.c"
  44. # 1 "<built-in>"
  45. # 1 "<command-line>"
  46. # 1 "cpp.c"
  47.  
  48.  
  49.  
  50. void ellipse(int xc, int yc, int rx, int ry, int color)
  51. {
  52. int x = 0, y = ry;
  53. long rx2 = (long)rx*rx, ry2 = (long)ry*ry;
  54. long crit1 = -(rx2/4 + rx%2 + ry2);
  55. long crit2 = -(ry2/4 + ry%2 + rx2);
  56. long crit3 = -(ry2/4 + ry%2);
  57. long t = -rx2*y;
  58. long dxt = 2*ry2*x, dyt = -2*rx2*y;
  59. long d2xt = 2*ry2, d2yt = 2*rx2;
  60.  
  61. while (y>=0 && x<=rx)
  62. {
  63. pixel(xc+x, yc+y, color);
  64. if (x!=0 || y!=0)
  65. pixel(xc-x, yc-y, color);
  66. if (x!=0 && y!=0)
  67. {
  68. pixel(xc+x, yc-y, color);
  69. pixel(xc-x, yc+y, color);
  70. }
  71. if (t + ry2*x <= crit1 ||
  72. t + rx2*y <= crit3)
  73. x++, dxt += d2xt, t += dxt;
  74. else if (t - rx2*y > crit2)
  75. y--, dyt += d2yt, t += dyt;
  76. else
  77. {
  78. x++, dxt += d2xt, t += dxt;
  79. y--, dyt += d2yt, t += dyt;
  80. }
  81. }
  82. }
  83.  
  84. if (t + ry2*x <= crit1 ||
  85. t + rx2*y <= crit3) {
  86.  
  87. x++;
  88. dxt += d2xt;
  89. t += dxt;
  90.  
  91. } else if (t - rx2*y > crit2) {
  92. y--;
  93. dyt += d2yt;
  94. t += dyt;
  95.  
  96. } else {
  97. x++;
  98. dxt += d2xt;
  99. t += dxt;
  100.  
  101. y--;
  102. dyt += d2yt;
  103. t += dyt;
  104. }
  105.  
  106. #define incx() x++, dxt += d2xt, t += dxt
  107.  
  108. if (t + ry2*x <= crit1 || t + rx2*y <= crit3)
  109. incx();
  110.  
  111. if (t + ry2*x <= crit1 || t + rx2*y <= crit3)
  112. x++, dxt += d2xt, t += dxt;
  113.  
  114. void ellipse(int xc, int yc, int rx, int ry, int color)
  115. {
  116. int x = 0, y = ry;
  117. long rx2 = (long)rx*rx, ry2 = (long)ry*ry;
  118. long crit1 = -(rx2/4 + rx%2 + ry2);
  119. long crit2 = -(ry2/4 + ry%2 + rx2);
  120. long crit3 = -(ry2/4 + ry%2);
  121. long t = -rx2*y; // e(x+1/2,y-1/2) - (a^2+b^2)/4
  122. long dxt = 2*ry2*x, dyt = -2*rx2*y;
  123. long d2xt = 2*ry2, d2yt = 2*rx2;
  124.  
  125. while (y>=0 && x<=rx)
  126. {
  127. pixel(xc+x, yc+y, color);
  128. if (x!=0 || y!=0)
  129. pixel(xc-x, yc-y, color);
  130. if (x!=0 && y!=0)
  131. {
  132. pixel(xc+x, yc-y, color);
  133. pixel(xc-x, yc+y, color);
  134. }
  135. if (t + ry2*x <= crit1 || //e(x+1,y-1/2) <= 0
  136. t + rx2*y <= crit3) //e(x+1/2,y) <= 0
  137. x++, dxt += d2xt, t += dxt;
  138. else if (t - rx2*y > crit2) //e(x+1/2,y-1) > 0
  139. y--, dyt += d2yt, t += dyt;
  140. else
  141. {
  142. x++, dxt += d2xt, t += dxt;
  143. y--, dyt += d2yt, t += dyt;
  144. }
  145. }
  146. }
Add Comment
Please, Sign In to add comment