summaryrefslogtreecommitdiffstats
path: root/Bachelor/Prog2/Z-Uebung/Teil3/shape.cpp
blob: 7f078f35a02bf370c1b49e82ad0c4fa85ef110e4 (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
121
122
123
124
125
126
127
128
129
130
131
132
// shape.cpp

// Implementation of classes Shape and Polyline. 



#include "shape.h"



// class Shape 

// all methods inline



// class Polyline

Polyline::Polyline( Point arr[], int n )

{

   arrPoints = NULL;

   nLines = 0;

   if( n > 0 ) {

      anchor = arr[ 0 ];  // anchor

      if( n > 1 ) {

        nLines = n - 1;

        // save points relatively to anchor

        arrPoints = new Point[ nLines ];

        for( int i = 0; i < n - 1; ++i )

           arrPoints[ i ] = arr[ i + 1 ] - anchor;  

      }

   }

}



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

{

   nLines = src.nLines;

   anchor = src.anchor;

   arrPoints = NULL;

   

   if( src.nLines > 0 ) {

      arrPoints = new Point[ nLines ];

      for( int i = 0; i < nLines; ++i )

         arrPoints[ i ] = src.arrPoints[ i ];  

   }

}



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

{

   if( this != &src) {

      delete [] arrPoints;

      nLines = src.nLines;

      anchor = src.anchor;

      arrPoints = NULL;

      if( src.nLines > 0 ) {

         arrPoints = new Point[ nLines ];

         for( int i = 0; i < nLines; ++i )

            arrPoints[ i ] = src.arrPoints[ i ];  

      }

   }

   return *this;

}



double Polyline::getLength() const

{

   double len = 0.0;

   if( nLines > 0 ) {

      Point begin( 0, 0 );

      for( int i = 0; i < nLines; ++i ) {

         len += begin.distance( arrPoints[ i ] );

         begin = arrPoints[ i ];

      }

   }

   return len;

}



// append one more point:

Polyline& Polyline::operator+=( const Point& p )

{

   Point* ptr = new Point[ nLines + 1 ];  // new array

   for( int i = 0 ; i < nLines; ++i )  // copy points into new array

      ptr[ i ] = arrPoints[ i ];         

   ptr[ nLines ] = p - anchor;  // add new point       

   ++nLines;

   delete [] arrPoints;  // free old array            

   arrPoints = ptr;

   return *this;

}



// append a second line:

Polyline& Polyline::operator+=( const Polyline& src )

{

   if( src.nLines > 0 ) {

      Point last = Point( 0, 0 );  // rel. coordinates of last point

      if( nLines > 0 )

         last = arrPoints[ nLines - 1 ];

      Point* ptr = new Point[ nLines + src.nLines ];  // new array

      int i;

      for( i = 0; i < nLines; ++i )  // copy points into new array

         ptr[ i ] = arrPoints[ i ];   

      for( i = 0; i < src.nLines; ++i )  // append points of src

         ptr[ nLines + i ] = last + src.arrPoints[ i ];



      nLines += src.nLines;

      delete [] arrPoints;  // free old array

      arrPoints = ptr;

   }

   return *this;

}



void Polyline::scale( double scalingFactor )

{

   for( int i=0; i < nLines; ++i )

      arrPoints[i] *= scalingFactor;

}



string Polyline::toString() const  // points of line

{

   string str = anchor.toString();

   for( int i=0; i < nLines; ++i )

      str += "  ",  str += ( anchor + arrPoints[ i ] ).toString();

   return str;

}

/*

string Line::toString() const

{

   string str( "Linie, Start- und Endpunkt:  ");

   str += anchor.toString();

   str += "  ",  str += ( anchor + arrPoints[ 0 ] ).toString();

   return str;

}



string Polygon::toString() const

{

   string str( "Die Ecken des Polygons:  " );

   str += anchor.toString();

   for( int i=0; i < nLines; ++i )

      str += "  ",  str += ( anchor + arrPoints[ i ] ).toString();

   return str;

}

*/