summaryrefslogtreecommitdiffstats
path: root/Bachelor/Prog2/Z-Uebung/Teil1/shape.h
blob: a304329f1cf521f07435f1f21641c540ceea9476 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// shape.h

// Definition of classes Point, Shape and Polyline. 



#ifndef SHAPE_H

#define SHAPE_H



#include <sstream>

using std::string;

using std::stringstream;

using std::ostream;



#include <cmath> // sqrt



// class Point

struct Point

{

   double x, y;

   Point( double xx = 0.0, double yy = 0.0 )

        : x( xx ), y( yy ) { }



   double distance( const Point& p2 ) const

   { 

      double dx = x - p2.x,

             dy = y - p2.y;

      return sqrt( dx * dx + dy * dy );

   }

   string toString() const

   {

      stringstream sstream;

      sstream << '(' << x << ", " << y << ')';

      return sstream.str();

   }

   Point& operator*=( double c )

   {  x *= c; y *= c;  return *this; }  

};



inline Point operator+( const Point& p1, const Point& p2 )

{

   return Point( p1.x + p2.x, p1.y + p2.y );

}



inline Point operator-( const Point& p1, const Point& p2 )

{

   return Point( p1.x - p2.x, p1.y - p2.y );

}



inline bool operator==( const Point& p1, const Point& p2 )

{

   return p1.x == p2.x && p1.y == p2.y;

}



inline bool operator!=( const Point& p1, const Point& p2 )

{

   return !( p1 == p2 );

}



inline ostream& operator<<( ostream& os, const Point& p )

{

   os << p.toString();   

   return os;

}



// class Shape

class Shape

{

  protected:

    Point anchor;  // anchor: point of reference for position of figure

  public:

    Shape( const Point& a = Point() ) : anchor( a ) { }

    virtual ~Shape() {}



    Point getAnchor() const  { return anchor; }

    void setAnchor( Point a ) { anchor = a; }



    void move( double dx, double dy )  // displacement

    { anchor.x += dx; anchor.y += dy; }



    virtual void scale( double scalingFactor ) = 0;

    virtual void draw() const = 0;



    virtual string toString() const

    {

       string str( "Shape-Anker: " );

       return str += anchor.toString();

    }

};



// class Polyline

class Polyline : public Shape

{

  protected: 

    Point* arrPoints;  // end-points of lines, relativ to anchor                      

    int nLines;        // number of line-segments == number of end-points

                      

  public:

    Polyline( const Point& a = Point() )  // only one point

            : Shape( a ), nLines( 0 ), arrPoints( NULL ) { }

    Polyline( const Point& p1, const Point& p2 )  // one line

            : Shape( p1 ), nLines( 1 )

    {

       arrPoints = new Point( p2 - p1 );

    }

    Polyline( Point arr[], int n ); 

    Polyline( const Polyline& src );  // copy constructor

    ~Polyline() { delete [] arrPoints; }   // destructor



    Polyline& operator=( const Polyline& src ); // assignment



    int getNumberOfLines() const { return nLines; } 

    double getLength() const;

    void scale( double scalingFactor );         // scaling

    virtual void draw() const { }



    Polyline& operator+=( const Point& p );     // appends a new point

    Polyline& operator+=( const Polyline& pl ); // appends a new line



    string toString() const;

};



#endif