Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <iostream>
- #include <math.h>
- #include <graphics.h>
- using namespace std;
- const int optX = 800;
- const int optY = 800;
- const int halfX = (int)optX / 2;
- const int dp = 1;
- const double eps = 9e-16;
- void ParabBrez(double aa, double bb, double cc, double dd);
- int main(){
- initwindow(optX, optY);
- //ParabBrez(-0.0025, -3, 1, 1);
- //ParabBrez(0.0025, -3, 1, 1);
- ParabBrez(0.25, -3, 1, 1);
- //ParabBrez(0.025, -3, 1, 1);
- //ParabBrez(0.1, 0, 1,0);
- //ParabBrez(0.025, 434, 1, 1);
- //ParabBrez(6.25, 19, 4, -1);
- //ParabBrez(5, 43, 1, 1);
- getch();
- closegraph();
- return 0;
- }
- void draw_pixel(double x, double y, int where)
- {
- double x_coord = halfX - (int)x * dp;
- double y_coord = where - (int)(y * dp);
- putpixel(x_coord, y_coord, WHITE);
- }
- void ParabBrez(double aa, double bb, double cc, double dd)
- {
- //double a = aa / (cc * cc), b = -(2 * aa * dd) / (cc * cc) , c = (aa * dd * dd) / (cc * cc) + bb, d = dd;
- //cout<<aa / (cc * cc)<<" "<<-(2 * aa * dd) / (cc * cc)<<" "<<(aa * dd * dd) / (cc * cc) + bb<<endl;
- double a = aa / (cc * cc), b = bb, c = (aa * dd * dd) / (cc * cc) + bb, d = dd;
- double x = dd, y = bb; // x0, y0
- double delta = (b + 1 - a * (d + 1) * (d + 1) - b * (d + 1) - c); // first error
- double plus_one = 1;
- int where = optY - 10;
- if (a < 0)
- {
- where = 10;
- delta = b - 1 - a * (d + 1) * (d + 1) - b * (d + 1) - c; // first error
- plus_one = -1;
- }
- cout<<"first delta = "<<delta<<endl;
- // cout<<y<<" "<<x<<endl;
- 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)));
- double to_direc = (y + plus_one - (b + (-plus_one) * 1/(4*a))) * (y + plus_one - (b + (-plus_one) * 1/(4*a)));
- delta = -to_direc + to_focus;
- while ((where - (int)(y * dp) > 0) && (halfX - x * dp > 0))
- {
- //cout<< where - y * dp<<" "<< halfX - x * dp << endl;
- draw_pixel(x, y, where);
- draw_pixel(dd - x, y, where);
- if (delta < 0) // horizontal or diagonal point
- {
- double horiz_to_focus = (x + 1 - d) * (x + 1 - d) + (y - (b +(plus_one) * 1/(4*a))) * (y - (b +(plus_one) * 1/(4*a)));
- double horiz_to_direc = (y - (b +(-plus_one) * 1/(4*a))) * (y - (b +(-plus_one) * 1/(4*a)));
- double epsH = fabs(horiz_to_direc - horiz_to_focus);
- 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)));
- double diagon_to_direc = (y + plus_one - (b +(-plus_one) * 1/(4*a))) * (y + plus_one - (b +(-plus_one) * 1/(4*a)));
- double epsD = fabs(diagon_to_direc - diagon_to_focus);
- double epsilon = epsH - epsD;
- if (epsilon < 0) // до h ближе -> его и берем
- {
- x++;
- }
- else // до d ближе
- {
- x++;
- y += plus_one;
- }
- }
- else if (delta > 0) // v or d
- {
- 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)));
- double verical_to_direc = (y + plus_one - (b +(-plus_one) * 1/(4*a))) * (y + plus_one - (b +(-plus_one) * 1/(4*a)));
- double epsV = fabs(verical_to_direc - vertical_to_focus);
- 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)));
- double diagon_to_direc = (y + plus_one - (b +(-plus_one) * 1/(4*a))) * (y + plus_one - (b +(-plus_one) * 1/(4*a)));
- double epsD = fabs(diagon_to_direc - diagon_to_focus);
- double epsilon = epsD - epsV;
- if (epsilon <= 0) // take d
- {
- x++;
- y += plus_one;
- }
- else // take V
- {
- y += plus_one;
- }
- }
- else if (delta == 0)
- {
- x++;
- y += plus_one;
- }
- 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)));
- double to_direc = (y + plus_one - (b + (-plus_one) * 1/(4*a))) * (y + plus_one - (b + (-plus_one) * 1/(4*a)));
- delta = -to_direc + to_focus;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement