Advertisement
NAbdulla

scaling

Oct 23rd, 2019
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <graphics.h>
  3.  
  4. using namespace std;
  5.  
  6. #define what_is(x) cerr << fixed << setprecision(2) << boolalpha << #x << " = " << x << endl
  7.  
  8. const double PI = acos(-1.0);
  9.  
  10. double xmid, ymid;
  11. class Point{
  12.     double x, y;
  13. public:
  14.     Point(double _x, double _y){
  15.         x = _x;
  16.         y = _y;
  17.         y *= -1;/*reflect about x axis*/
  18.         x += xmid;
  19.         y += ymid;
  20.     }
  21.     Point():Point(0, 0) {}
  22.     void setx(double _x){
  23.         x = _x;
  24.         x += xmid;
  25.     }
  26.     void sety(double _y){
  27.         y = _y;
  28.         y *= -1;/*reflect about x axis*/
  29.         y += ymid;
  30.     }
  31.     double getx(){return x;}
  32.     double gety(){return y;}
  33.     string to_string(){
  34.         char str[1000];
  35.         sprintf(str, "x: %.2lf y: %.2lf", 1.0*x-xmid, 1.0*y-ymid);
  36.         return str;
  37.     }
  38. };
  39.  
  40. void drawAxes(Point origin){
  41.     int col = getcolor();
  42.     setcolor(LIGHTCYAN);
  43.     line(origin.getx()-origin.getx(), origin.gety(), origin.getx()+origin.getx(), origin.gety());
  44.     line(origin.getx(), origin.gety()-origin.gety(), origin.getx(), origin.gety()+origin.gety());
  45.  
  46.     outtextxy(origin.getx()+1, origin.gety()+1, "O");
  47.     outtextxy(origin.getx() + origin.getx() - textwidth("X")-1, origin.gety()+1, "X");
  48.     outtextxy(origin.getx() - origin.getx(), origin.gety()+1, "X'");
  49.     outtextxy(origin.getx()+1, origin.gety() - origin.gety(), "Y");
  50.     outtextxy(origin.getx()+1, origin.gety() + origin.gety()-textheight("Y'"), "Y'");
  51.     setcolor(col);
  52. }
  53.  
  54. void drawGridLines(Point origin, int intv){
  55.     int col = getcolor();
  56.     setcolor(DARKGRAY);
  57.     int stx = origin.getx();
  58.     while(stx-intv > 0)
  59.         stx -= intv;
  60.     int sty = origin.gety();
  61.     while(sty-intv > 0)
  62.         sty -= intv;
  63.     for(int i = stx; i < getmaxx(); i+=intv)
  64.         if(i != origin.getx())
  65.             line(i, 0, i, getmaxy());
  66.     for(int i = sty; i < getmaxy(); i+=intv)
  67.         if(i != origin.gety())
  68.             line(0, i, getmaxx(), i);
  69.  
  70.     char msg[100];
  71.     sprintf(msg, "Side of Square = %d pixel", intv);
  72.     outtext(msg);
  73.     setcolor(col);
  74. }
  75.  
  76. void checkError(){
  77.     int ecode = graphresult();
  78.     if(ecode != grOk) {
  79.         printf("Graphics error: %s\n", grapherrormsg(ecode));
  80.         printf("Press any key to exit...");
  81.         getch();
  82.         exit(1);
  83.     }
  84. }
  85.  
  86. struct Matrix
  87. {
  88.     int row, col;
  89.     vector<vector<double>>ele;
  90.     Matrix(int _row, int _col){
  91.         row = _row;
  92.         col = _col;
  93.         ele.resize(row);
  94.         for(int i = 0; i < row; i++)ele[i].resize(col);
  95.     }
  96.     Matrix operator*(const Matrix& m)const
  97.     {
  98.         if(col != m.row){
  99.             cout << "Matrices are incompatible. Can't multiply\n";
  100.             return Matrix(0,0);
  101.         }
  102.         Matrix ret(row, m.col);
  103.         for(int r = 0; r < row; r++){
  104.             for(int c = 0; c < m.col; c++){
  105.                 ret.ele[r][c] = 0;
  106.                 for(int k = 0; k < col; k++){
  107.                     ret.ele[r][c] += ele[r][k]*m.ele[k][c];
  108.                 }
  109.             }
  110.         }
  111.         return ret;
  112.     }
  113. };
  114.  
  115. double toRadian(double deg)
  116. {
  117.     return PI*deg/180;
  118. }
  119.  
  120. int main()
  121. {
  122.     int gdriver = DETECT;
  123.     int gmode;
  124.     initgraph(&gdriver, &gmode, NULL);
  125.     xmid = getmaxx()/2;
  126.     ymid = getmaxy()/2;
  127.     checkError();
  128.     Point origin;
  129.     drawAxes(origin);
  130.     drawGridLines(origin, 20);/* to show graph grid(if needed)*/
  131.  
  132.     /*do code*/
  133.     double pix, piy;
  134.     cout << "Enter Pivot point: ";
  135.     cin >> pix >> piy;
  136.     double px, py;
  137.     cout << "Enter Point1 of a line: ";
  138.     cin >> px >> py;
  139.     double px2, py2;
  140.     cout << "Enter Point2 of the line: ";
  141.     cin >> px2 >> py2;
  142.    
  143.     Matrix pivot(3, 1);
  144.     pivot.ele[0][0] = pix;
  145.     pivot.ele[1][0] = piy;
  146.     pivot.ele[2][0] = 1;
  147.    
  148.     Matrix point1(3, 1);
  149.     point1.ele[0][0] = px;
  150.     point1.ele[1][0] = py;
  151.     point1.ele[2][0] = 1;
  152.    
  153.     Matrix point2(3, 1);
  154.     point2.ele[0][0] = px2;
  155.     point2.ele[1][0] = py2;
  156.     point2.ele[2][0] = 1;
  157.    
  158.     //draw before translation
  159.     Point pi(pivot.ele[0][0], pivot.ele[1][0]);
  160.     //show pivot
  161.     circle(pi.getx(), pi.gety(), 2);
  162.     setcolor(LIGHTBLUE);
  163.     Point p1(point1.ele[0][0], point1.ele[1][0]);
  164.     Point p2(point2.ele[0][0], point2.ele[1][0]);
  165.     line(p1.getx(), p1.gety(), p2.getx(), p2.gety());
  166.    
  167.     cout << "Enter scaling factor: ";
  168.     double factor;
  169.     cin >> factor;
  170.    
  171.     Matrix scaleMat(3, 3);
  172.     scaleMat.ele[0][0] = factor;//universal scaling
  173.     scaleMat.ele[1][1] = factor;
  174.     scaleMat.ele[2][2] = 1;
  175.    
  176.     Matrix translate(3, 3);
  177.     translate.ele[0][0] = 1;
  178.     translate.ele[1][1] = 1;
  179.     translate.ele[2][2] = 1;
  180.     translate.ele[0][2] = -pix;
  181.     translate.ele[1][2] = -piy;
  182.    
  183.     Matrix invTranslate(3, 3);
  184.     invTranslate.ele[0][0] = 1;
  185.     invTranslate.ele[1][1] = 1;
  186.     invTranslate.ele[2][2] = 1;
  187.     invTranslate.ele[0][2] = pix;
  188.     invTranslate.ele[1][2] = piy;
  189.    
  190.     //do translation to make pivot the origin
  191.     point1 = translate*point1;
  192.     point2 = translate*point2;
  193.     //do scaling
  194.     point1 = scaleMat*point1;
  195.     point2 = scaleMat*point2;
  196.     //do translation to make previous origin as origin
  197.     point1 = invTranslate*point1;
  198.     point2 = invTranslate*point2;
  199.    
  200.     //draw after translation
  201.     setcolor(CYAN);
  202.     p1 = Point(point1.ele[0][0], point1.ele[1][0]);
  203.     p2 = Point(point2.ele[0][0], point2.ele[1][0]);
  204.     line(p1.getx(), p1.gety(), p2.getx(), p2.gety());
  205.     getch();
  206.    
  207.     /*end code*/
  208.  
  209.     getch();
  210.     closegraph();
  211.     return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement