Introducing Objects

This is a tidied-up version of todays worked example. It defines a new kind of objkect to represent a point, and another one to represent a triangle. It then creates a triangle, rotates and scales it a few times, drawing the result and calculating the area at each stage. The output is shown below.


      #include "library.h"
      
      struct point
      { double x, y; };
      
      void print(point p)
      { print("(");
        print(p.x);
        print(",");
        print(p.y);
        print(")"); }
      
      double distance(point a, point b)
      { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); }
      
      point rotate(point p, double angle)
      { double r=sqrt(p.x*p.x+p.y*p.y);
        double theta=atan2(p.x, p.y);
        theta=theta+angle;
        point q;
        q.x=r*sin(theta);
        q.y=r*cos(theta);
        return q; }
      
      point scale(point p, double factor)
      { point q;
        q.x=p.x*factor;
        q.y=p.y*factor;
        return q; }
      
      struct triangle
      { point p1, p2, p3; };
      
      void print(triangle t)
      { print("<");
        print(t.p1);
        print(",");
        print(t.p2);
        print(",");
        print(t.p3);
        print(">"); }
      
      triangle rotate(triangle t, double angle)
      { point a=rotate(t.p1, angle);
        point b=rotate(t.p2, angle);
        point c=rotate(t.p3, angle);
        triangle r;
        r.p1=a;
        r.p2=b;
        r.p3=c;
        return r; }
      
      triangle scale(triangle t, double factor)
      { point a=scale(t.p1, factor);
        point b=scale(t.p2, factor);
        point c=scale(t.p3, factor);
        triangle r;
        r.p1=a;
        r.p2=b;
        r.p3=c;
        return r; }
      
      double area(triangle t)
      { double a=t.p1.x*t.p2.y + t.p2.x*t.p3.y + t.p3.x*t.p1.y;
        double b=t.p1.y*t.p2.x + t.p2.y*t.p3.x + t.p3.y*t.p1.x;
        if (a>b)
          return (a-b)/2;
        else
          return (b-a)/2; }
      
      void draw(triangle t)
      { MoveTo(t.p1.x, t.p1.y);
        DrawLineTo(t.p2.x, t.p2.y);
        DrawLineTo(t.p3.x, t.p3.y);
        DrawLineTo(t.p1.x, t.p1.y); }
      
      void main(void)
      { triangle T = { {100,100}, {100,500}, {300,500} };
        cout << "area of trinagle is " << area(T) << "\n";
        triangle U = rotate(T, 0.7);   // remember it's radians
        cout << "area after rotation is " << area(U) << "\n";
        triangle V = scale(U, 0.5);
        cout << "area after scaling is " << area(V) << "\n";
        triangle W = rotate(V, -0.7);
        cout << "area after rotating back is " << area(W) << "\n";
        MakeWindow(600, 600);
        PenWidth(3);
        PenColor(PEN_RED);
        draw(T);
        PenColor(PEN_GREEN);
        draw(U);
        PenColor(PEN_BLUE);
        draw(V);
        PenColor(PEN_ORANGE);
        draw(W); }

Graphical output produced

Text output produced

area of trinagle is 40000.000000
area after rotation is 40000.000000
area after scaling is 10000.000000
area after rotating back is 10000.000000