NAbdulla

rotation

Oct 23rd, 2019
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.26 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 Point to rotate across pivot: ";
  138.     cin >> px >> py;
  139.    
  140.     Matrix pivot(3, 1);
  141.     pivot.ele[0][0] = pix;
  142.     pivot.ele[1][0] = piy;
  143.     pivot.ele[2][0] = 1;
  144.    
  145.     Matrix point(3, 1);
  146.     point.ele[0][0] = px;
  147.     point.ele[1][0] = py;
  148.     point.ele[2][0] = 1;
  149.    
  150.     //draw before translation
  151.     setcolor(LIGHTBLUE);
  152.     Point pi(pivot.ele[0][0], pivot.ele[1][0]);
  153.     Point p(point.ele[0][0], point.ele[1][0]);
  154.     outtextxy(p.getx(), p.gety(), "P");
  155.     line(pi.getx(), pi.gety(), p.getx(), p.gety());
  156.    
  157.     cout << "Enter rotation angle in degree: ";
  158.     double ang;
  159.     cin >> ang;
  160.    
  161.     ang = toRadian(ang);
  162.    
  163.     Matrix rotateMat(3, 3);
  164.     rotateMat.ele[0][0] = cos(ang);
  165.     rotateMat.ele[0][1] = -sin(ang);
  166.     rotateMat.ele[1][0] = sin(ang);
  167.     rotateMat.ele[1][1] = cos(ang);
  168.     rotateMat.ele[2][2] = 1;
  169.    
  170.     Matrix translate(3, 3);
  171.     translate.ele[0][0] = 1;
  172.     translate.ele[1][1] = 1;
  173.     translate.ele[2][2] = 1;
  174.     translate.ele[0][2] = -pix;
  175.     translate.ele[1][2] = -piy;
  176.    
  177.     Matrix invTranslate(3, 3);
  178.     invTranslate.ele[0][0] = 1;
  179.     invTranslate.ele[1][1] = 1;
  180.     invTranslate.ele[2][2] = 1;
  181.     invTranslate.ele[0][2] = pix;
  182.     invTranslate.ele[1][2] = piy;
  183.    
  184.     //do translation to make pivot the origin
  185.     point = translate*point;
  186.     //do rotation
  187.     point = rotateMat*point;
  188.     //do translation to make previous origin as origin
  189.     point = invTranslate*point;
  190.    
  191.     //draw after translation
  192.     setcolor(CYAN);
  193.     p = Point(point.ele[0][0], point.ele[1][0]);
  194.     outtextxy(p.getx(), p.gety(), "P'");
  195.     line(pi.getx(), pi.gety(), p.getx(), p.gety());
  196.     getch();
  197.    
  198.     /*end code*/
  199.  
  200.     getch();
  201.     closegraph();
  202.     return 0;
  203. }
Add Comment
Please, Sign In to add comment