Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <graphics.h>
- using namespace std;
- #define what_is(x) cerr << fixed << setprecision(2) << boolalpha << #x << " = " << x << endl
- const double PI = acos(-1.0);
- double xmid, ymid;
- class Point{
- double x, y;
- public:
- Point(double _x, double _y){
- x = _x;
- y = _y;
- y *= -1;/*reflect about x axis*/
- x += xmid;
- y += ymid;
- }
- Point():Point(0, 0) {}
- void setx(double _x){
- x = _x;
- x += xmid;
- }
- void sety(double _y){
- y = _y;
- y *= -1;/*reflect about x axis*/
- y += ymid;
- }
- double getx(){return x;}
- double gety(){return y;}
- string to_string(){
- char str[1000];
- sprintf(str, "x: %.2lf y: %.2lf", 1.0*x-xmid, 1.0*y-ymid);
- return str;
- }
- };
- void drawAxes(Point origin){
- int col = getcolor();
- setcolor(LIGHTCYAN);
- line(origin.getx()-origin.getx(), origin.gety(), origin.getx()+origin.getx(), origin.gety());
- line(origin.getx(), origin.gety()-origin.gety(), origin.getx(), origin.gety()+origin.gety());
- outtextxy(origin.getx()+1, origin.gety()+1, "O");
- outtextxy(origin.getx() + origin.getx() - textwidth("X")-1, origin.gety()+1, "X");
- outtextxy(origin.getx() - origin.getx(), origin.gety()+1, "X'");
- outtextxy(origin.getx()+1, origin.gety() - origin.gety(), "Y");
- outtextxy(origin.getx()+1, origin.gety() + origin.gety()-textheight("Y'"), "Y'");
- setcolor(col);
- }
- void drawGridLines(Point origin, int intv){
- int col = getcolor();
- setcolor(DARKGRAY);
- int stx = origin.getx();
- while(stx-intv > 0)
- stx -= intv;
- int sty = origin.gety();
- while(sty-intv > 0)
- sty -= intv;
- for(int i = stx; i < getmaxx(); i+=intv)
- if(i != origin.getx())
- line(i, 0, i, getmaxy());
- for(int i = sty; i < getmaxy(); i+=intv)
- if(i != origin.gety())
- line(0, i, getmaxx(), i);
- char msg[100];
- sprintf(msg, "Side of Square = %d pixel", intv);
- outtext(msg);
- setcolor(col);
- }
- void checkError(){
- int ecode = graphresult();
- if(ecode != grOk) {
- printf("Graphics error: %s\n", grapherrormsg(ecode));
- printf("Press any key to exit...");
- getch();
- exit(1);
- }
- }
- struct Matrix
- {
- int row, col;
- vector<vector<double>>ele;
- Matrix(int _row, int _col){
- row = _row;
- col = _col;
- ele.resize(row);
- for(int i = 0; i < row; i++)ele[i].resize(col);
- }
- Matrix operator*(const Matrix& m)const
- {
- if(col != m.row){
- cout << "Matrices are incompatible. Can't multiply\n";
- return Matrix(0,0);
- }
- Matrix ret(row, m.col);
- for(int r = 0; r < row; r++){
- for(int c = 0; c < m.col; c++){
- ret.ele[r][c] = 0;
- for(int k = 0; k < col; k++){
- ret.ele[r][c] += ele[r][k]*m.ele[k][c];
- }
- }
- }
- return ret;
- }
- };
- double toRadian(double deg)
- {
- return PI*deg/180;
- }
- int main()
- {
- int gdriver = DETECT;
- int gmode;
- initgraph(&gdriver, &gmode, NULL);
- xmid = getmaxx()/2;
- ymid = getmaxy()/2;
- checkError();
- Point origin;
- drawAxes(origin);
- drawGridLines(origin, 20);/* to show graph grid(if needed)*/
- /*do code*/
- double pix, piy;
- cout << "Enter Pivot point: ";
- cin >> pix >> piy;
- double px, py;
- cout << "Enter Point1 of a line: ";
- cin >> px >> py;
- double px2, py2;
- cout << "Enter Point2 of the line: ";
- cin >> px2 >> py2;
- Matrix pivot(3, 1);
- pivot.ele[0][0] = pix;
- pivot.ele[1][0] = piy;
- pivot.ele[2][0] = 1;
- Matrix point1(3, 1);
- point1.ele[0][0] = px;
- point1.ele[1][0] = py;
- point1.ele[2][0] = 1;
- Matrix point2(3, 1);
- point2.ele[0][0] = px2;
- point2.ele[1][0] = py2;
- point2.ele[2][0] = 1;
- //draw before translation
- Point pi(pivot.ele[0][0], pivot.ele[1][0]);
- //show pivot
- circle(pi.getx(), pi.gety(), 2);
- setcolor(LIGHTBLUE);
- Point p1(point1.ele[0][0], point1.ele[1][0]);
- Point p2(point2.ele[0][0], point2.ele[1][0]);
- line(p1.getx(), p1.gety(), p2.getx(), p2.gety());
- cout << "Enter scaling factor: ";
- double factor;
- cin >> factor;
- Matrix scaleMat(3, 3);
- scaleMat.ele[0][0] = factor;//universal scaling
- scaleMat.ele[1][1] = factor;
- scaleMat.ele[2][2] = 1;
- Matrix translate(3, 3);
- translate.ele[0][0] = 1;
- translate.ele[1][1] = 1;
- translate.ele[2][2] = 1;
- translate.ele[0][2] = -pix;
- translate.ele[1][2] = -piy;
- Matrix invTranslate(3, 3);
- invTranslate.ele[0][0] = 1;
- invTranslate.ele[1][1] = 1;
- invTranslate.ele[2][2] = 1;
- invTranslate.ele[0][2] = pix;
- invTranslate.ele[1][2] = piy;
- //do translation to make pivot the origin
- point1 = translate*point1;
- point2 = translate*point2;
- //do scaling
- point1 = scaleMat*point1;
- point2 = scaleMat*point2;
- //do translation to make previous origin as origin
- point1 = invTranslate*point1;
- point2 = invTranslate*point2;
- //draw after translation
- setcolor(CYAN);
- p1 = Point(point1.ele[0][0], point1.ele[1][0]);
- p2 = Point(point2.ele[0][0], point2.ele[1][0]);
- line(p1.getx(), p1.gety(), p2.getx(), p2.gety());
- getch();
- /*end code*/
- getch();
- closegraph();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement