Advertisement
Guest User

Untitled

a guest
Mar 30th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <math.h>
  4. #include <graphics.h>
  5. using namespace std;
  6.  
  7. const int optX = 800;
  8. const int optY = 800;
  9. const int halfX = (int)optX / 2;
  10. const int dp = 1;
  11. const double eps = 9e-16;
  12.  
  13. void ParabBrez(double aa, double bb, double cc, double dd);
  14.  
  15. int main(){
  16. initwindow(optX, optY);
  17. //ParabBrez(-0.0025, -3, 1, 1);
  18. //ParabBrez(0.0025, -3, 1, 1);
  19. ParabBrez(0.25, -3, 1, 1);
  20. //ParabBrez(0.025, -3, 1, 1);
  21. //ParabBrez(0.1, 0, 1,0);
  22. //ParabBrez(0.025, 434, 1, 1);
  23. //ParabBrez(6.25, 19, 4, -1);
  24. //ParabBrez(5, 43, 1, 1);
  25. getch();
  26. closegraph();
  27. return 0;
  28. }
  29.  
  30. void draw_pixel(double x, double y, int where)
  31. {
  32. double x_coord = halfX - (int)x * dp;
  33. double y_coord = where - (int)(y * dp);
  34. putpixel(x_coord, y_coord, WHITE);
  35. }
  36.  
  37. void ParabBrez(double aa, double bb, double cc, double dd)
  38. {
  39.  
  40. //double a = aa / (cc * cc), b = -(2 * aa * dd) / (cc * cc) , c = (aa * dd * dd) / (cc * cc) + bb, d = dd;
  41. //cout<<aa / (cc * cc)<<" "<<-(2 * aa * dd) / (cc * cc)<<" "<<(aa * dd * dd) / (cc * cc) + bb<<endl;
  42.  
  43. double a = aa / (cc * cc), b = bb, c = (aa * dd * dd) / (cc * cc) + bb, d = dd;
  44. double x = dd, y = bb; // x0, y0
  45.  
  46. double delta = (b + 1 - a * (d + 1) * (d + 1) - b * (d + 1) - c); // first error
  47. double plus_one = 1;
  48. int where = optY - 10;
  49.  
  50. if (a < 0)
  51. {
  52. where = 10;
  53. delta = b - 1 - a * (d + 1) * (d + 1) - b * (d + 1) - c; // first error
  54. plus_one = -1;
  55. }
  56.  
  57. cout<<"first delta = "<<delta<<endl;
  58. // cout<<y<<" "<<x<<endl;
  59.  
  60. double to_focus = (x + 1 - d) * (x + 1 - d) + (y + plus_one - (b + (plus_one) * 1/(4*a))) * (y + plus_one - (b + (plus_one) * 1/(4*a)));
  61. double to_direc = (y + plus_one - (b + (-plus_one) * 1/(4*a))) * (y + plus_one - (b + (-plus_one) * 1/(4*a)));
  62. delta = -to_direc + to_focus;
  63.  
  64. while ((where - (int)(y * dp) > 0) && (halfX - x * dp > 0))
  65. {
  66. //cout<< where - y * dp<<" "<< halfX - x * dp << endl;
  67.  
  68. draw_pixel(x, y, where);
  69. draw_pixel(dd - x, y, where);
  70.  
  71. if (delta < 0) // horizontal or diagonal point
  72. {
  73. double horiz_to_focus = (x + 1 - d) * (x + 1 - d) + (y - (b +(plus_one) * 1/(4*a))) * (y - (b +(plus_one) * 1/(4*a)));
  74. double horiz_to_direc = (y - (b +(-plus_one) * 1/(4*a))) * (y - (b +(-plus_one) * 1/(4*a)));
  75. double epsH = fabs(horiz_to_direc - horiz_to_focus);
  76.  
  77. double diagon_to_focus = (x + 1 - d) * (x + 1 - d) + (y + plus_one - (b +(plus_one) * 1/(4*a))) * (y + plus_one - (b +(plus_one) * 1/(4*a)));
  78. double diagon_to_direc = (y + plus_one - (b +(-plus_one) * 1/(4*a))) * (y + plus_one - (b +(-plus_one) * 1/(4*a)));
  79. double epsD = fabs(diagon_to_direc - diagon_to_focus);
  80.  
  81. double epsilon = epsH - epsD;
  82. if (epsilon < 0) // до h ближе -> его и берем
  83. {
  84. x++;
  85. }
  86. else // до d ближе
  87. {
  88. x++;
  89. y += plus_one;
  90. }
  91. }
  92. else if (delta > 0) // v or d
  93. {
  94. double vertical_to_focus = (x - d) * (x - d) + (y + plus_one - (b +(plus_one) * 1/(4*a))) * (y + plus_one - (b +(plus_one) * 1/(4*a)));
  95. double verical_to_direc = (y + plus_one - (b +(-plus_one) * 1/(4*a))) * (y + plus_one - (b +(-plus_one) * 1/(4*a)));
  96. double epsV = fabs(verical_to_direc - vertical_to_focus);
  97.  
  98. double diagon_to_focus = (x + 1 - d) * (x + 1 - d) + (y + plus_one - (b +(plus_one) * 1/(4*a))) * (y + plus_one - (b +(plus_one) * 1/(4*a)));
  99. double diagon_to_direc = (y + plus_one - (b +(-plus_one) * 1/(4*a))) * (y + plus_one - (b +(-plus_one) * 1/(4*a)));
  100. double epsD = fabs(diagon_to_direc - diagon_to_focus);
  101.  
  102. double epsilon = epsD - epsV;
  103. if (epsilon <= 0) // take d
  104. {
  105. x++;
  106. y += plus_one;
  107. }
  108. else // take V
  109. {
  110. y += plus_one;
  111. }
  112. }
  113. else if (delta == 0)
  114. {
  115. x++;
  116. y += plus_one;
  117. }
  118. double to_focus = (x + 1 - d) * (x + 1 - d) + (y + plus_one - (b + (plus_one) * 1/(4*a))) * (y + plus_one - (b + (plus_one) * 1/(4*a)));
  119. double to_direc = (y + plus_one - (b + (-plus_one) * 1/(4*a))) * (y + plus_one - (b + (-plus_one) * 1/(4*a)));
  120. delta = -to_direc + to_focus;
  121. }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement