00001
00002 #include <j2k/Fred/Standard.hpp>
00003 #include <j2k/Fred/MathCst.hpp>
00004
00005
00006 #ifndef Type
00007 #error "Type is not defined."
00008 #endif
00009
00010 #ifndef FType
00011 #error "FType is not defined."
00012 #endif
00013
00014 #ifndef JPoint
00015 #error "JPoint is not defined."
00016 #endif
00017
00018 #ifndef JPoint_t
00019 #error "JPoint_t is not defined."
00020 #endif
00021
00022 #ifndef JCircle
00023 #error "JCircle is not defined."
00024 #endif
00025
00026 #ifndef JCircle_t
00027 #error "JCircle_t is not defined."
00028 #endif
00029
00030 struct JCircle_t {
00031 FType radius;
00032 FType area_cache;
00033 };
00034
00035 class JCircle : public JPoint {
00036 public:
00037
00038 inline JCircle() : JPoint()
00039 {
00040 memset( &c, 0, sizeof( JCircle_t ) );
00041 }
00042
00043 inline JCircle( Type X ) : JPoint( X )
00044 {
00045 memset( &c, 0, sizeof( JCircle_t ) );
00046 }
00047
00048 inline JCircle( Type X, Type Y ) : JPoint( X, Y )
00049 {
00050 memset( &c, 0, sizeof( JCircle_t ) );
00051 }
00052
00053 inline JCircle( Type X, Type Y, FType Radius ) : JPoint( X, Y )
00054 {
00055 memset( &c, 0, sizeof( JCircle_t ) );
00056 c.radius = Radius;
00057 c.area_cache = -1;
00058 check();
00059 }
00060
00061 inline JCircle( const JCircle& src ) : JPoint( (const JPoint&)src )
00062 {
00063
00064 memcpy( &c, &src.c, sizeof( JCircle_t ) );
00065 }
00066
00067 inline const JCircle& operator=( const JCircle& src )
00068 {
00069 memcpy( &pt, &src.pt, sizeof( JPoint_t ) );
00070 memcpy( &c, &src.c, sizeof( JCircle_t ) );
00071 return *this;
00072 }
00073
00074
00075 inline BOOL operator==( const JCircle& src )
00076 {
00077 return !memcmp( &pt, &src.pt, (sizeof( Type ) * 2) ) &&
00078 ( c.radius == src.c.radius);
00079 }
00080
00081 inline BOOL operator!=( const JCircle& src )
00082 {
00083 return memcmp( &pt, &src.pt, (sizeof( Type ) * 2) ) ||
00084 ( c.radius != src.c.radius);
00085 }
00086
00087 inline const JCircle& operator++()
00088 {
00089 JPoint::operator++();
00090 return *this;
00091 }
00092
00093 inline const JCircle& operator++( int )
00094 {
00095 JPoint::operator++( 0 );
00096 return *this;
00097 }
00098
00099 inline const JCircle& operator--()
00100 {
00101 JPoint::operator--();
00102 return *this;
00103 }
00104
00105 inline const JCircle& operator--( int )
00106 {
00107 JPoint::operator--( 0 );
00108 return *this;
00109 }
00110
00111
00112
00113
00114
00115
00116 inline void setRadius( FType r )
00117 {
00118 c.radius = r;
00119 check();
00120 }
00121
00122 inline void check()
00123 {
00124 if ( c.radius <= 0 ) {
00125 c.radius = 0;
00126 }
00127 }
00128
00129
00130 inline FType getRadius() const
00131 {
00132 return c.radius;
00133 }
00134
00135
00136 inline JCircle& setCircle( Type X, Type Y, FType Radius )
00137 {
00138 JPoint::setPoint( X, Y );
00139 c.radius = Radius;
00140 check();
00141 return *this;
00142 }
00143
00144
00145 inline JCircle& setPoint( Type X, Type Y )
00146 {
00147 JPoint::setPoint( X, Y );
00148 return *this;
00149 }
00150
00151
00152 inline FType area()
00153 {
00154 if ( c.area_cache < 0 ) {
00155 c.area_cache = Math_PI * c.radius * c.radius;
00156 }
00157 return c.area_cache;
00158 }
00159
00160
00161
00162
00163
00164
00165 inline JCircle& setPolar( FType R, FType Theta )
00166 {
00167 JPoint::setPolar( R, Theta );
00168 return *this;
00169 }
00170
00171 inline JCircle& setX( Type X ) {
00172 JPoint::setX( X );
00173 return *this;
00174 }
00175
00176 inline JCircle& setY( Type Y ) {
00177 JPoint::setY( Y );
00178 return *this;
00179 }
00180
00181 inline JCircle& setR( FType R ) {
00182 JPoint::setR( R );
00183 return *this;
00184 }
00185
00186 inline JCircle& setAngle( FType Theta ) {
00187 JPoint::setAngle( Theta );
00188 return *this;
00189 }
00190
00191
00192
00193 friend ostream& operator<<( ostream &os, const JCircle &Circ )
00194 {
00195 os << "Center = " << (const JPoint&)(Circ)
00196 << "; Radius = "
00197 << setiosflags( ios::fixed | ios::showpoint )
00198 << setprecision( 2 )
00199 << Circ.c.radius;
00200 return os;
00201 }
00202
00203 protected:
00204 struct JCircle_t c;
00205 };
00206