#include #include #include using namespace std; class Duz { public: Duz() {} Duz( int X0, int Y0, int X1, int Y1, int Boja ) : x0(X0), y0(Y0), x1(X1), y1(Y1), boja(Boja) {} int x0, y0, x1, y1; int boja; }; ostream& operator<< ( ostream& ostr, const Duz& d ) { ostr << "{ " << d.x0 << ", " << d.y0 << ", " << d.x1 << ", " << d.y1 << ", " << d.boja << " }"; return ostr; } class Lik { public: Lik( int boja ) : _boja(boja) {} virtual ~Lik() {} virtual int PrevodjenjePlus( vector& duzi, double eps ) = 0; int Prevodjenje( vector& duzi, double eps ) { duzi.clear(); return PrevodjenjePlus( duzi, eps ); } protected: int _boja; }; class Pravougaonik : public Lik { public: Pravougaonik( int x0, int y0, int a, int b, int boja ) : Lik(boja), _x0(x0), _y0(y0), _a(a), _b(b) {} int PrevodjenjePlus( vector& duzi, double ) { // u narednim redovima se koristi ekvivalent // sledeceg para naredbi //Duz d( _x0, _y0, _x0+_a, _y0, boja ); //duzi.push_back( d ); duzi.push_back( Duz( _x0, _y0, _x0+_a, _y0, _boja )); duzi.push_back( Duz( _x0+_a, _y0, _x0+_a, _y0+_b, _boja )); duzi.push_back( Duz( _x0+_a, _y0+_b, _x0, _y0+_b, _boja )); duzi.push_back( Duz( _x0, _y0+_b, _x0, _y0, _boja )); return 4; } private: int _x0, _y0, _a, _b; }; class Kvadrat : public Pravougaonik { public: Kvadrat( int x0, int y0, int a, int boja ) : Pravougaonik( x0, y0, a, a, boja ) {} }; class Krug : public Lik { public: Krug( int xc, int yc, int r, int boja ) : Lik(boja), _xc(xc), _yc(yc), _r(r) {} int PrevodjenjePlus( vector& duzi, double eps ) { int n = eps < _r ? ceil( M_PI/acos(1-eps/_r)) : 4; if( n<4 ) n=4; double alpha = M_PI * 2 / n; Duz d; d.x0 = _xc + _r; d.y0 = _yc; d.boja = _boja; for( int i=1; i<=n; i++ ){ d.x1 = floor( _xc + _r * cos( alpha * i ) + 0.5 ); d.y1 = floor( _yc + _r * sin( alpha * i ) + 0.5 ); duzi.push_back( d ); d.x0 = d.x1; d.y0 = d.y1; } return n; } private: int _xc, _yc, _r; }; main() { vector duzi; Pravougaonik p( 0,0,10,5,1); p.PrevodjenjePlus( duzi, 0 ); Kvadrat k( 20, 10, 40, 7 ); k.PrevodjenjePlus( duzi, 0 ); Krug kr( 0, 0, 20, 3 ); kr.PrevodjenjePlus( duzi, 100 ); kr.PrevodjenjePlus( duzi, 2 ); cout << "Duzi:" << endl; for( unsigned i=0; i