Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

jAPIbeziers.h

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------
00002 #ifndef jAPIbeziersH
00003 #define jAPIbeziersH
00004 //---------------------------------------------------------------------------
00005 
00006 #include <vector.h>
00007 #include <stdio.h>
00008 
00009 //----------------------------------------------------------------------------
00010 // CLASS CONROL_POINT
00011 // = segment de courbe de bezier
00012 //----------------------------------------------------------------------------
00013 
00014 class jBEZctrlPoint
00015 {
00016         POINT lppt[4];
00017 
00018         public:
00019 
00020         TPoint point_debut;
00021         TPoint point_fin;
00022         TPoint point_ctrl_deb;
00023         TPoint point_ctrl_fin;
00024 
00025         jBEZctrlPoint()
00026         {
00027             TPoint tmp;
00028             tmp.x = 0;
00029             tmp.y = 0;
00030             jBEZctrlPoint(tmp, tmp, tmp, tmp);
00031         }
00032         jBEZctrlPoint(TPoint a, TPoint b, TPoint c, TPoint d)
00033         {
00034                 point_debut     = a;
00035                 point_ctrl_deb  = b;
00036                 point_fin       = c;
00037                 point_ctrl_fin  = d;
00038         }
00039 
00040         TPoint __fastcall Symetrique_point_ctrl_deb(double rapport=1)
00041         {
00042                 TPoint tmp;
00043                 tmp.x = point_debut.x-(point_ctrl_deb.x-point_debut.x)*rapport;
00044                 tmp.y = point_debut.y-(point_ctrl_deb.y-point_debut.y)*rapport;
00045                 return tmp;
00046         }
00047         TPoint __fastcall Symetrique_point_ctrl_fin(double rapport=1)
00048         {
00049                 TPoint tmp;
00050                 tmp.x = point_fin.x-(point_ctrl_fin.x-point_fin.x)*rapport;
00051                 tmp.y = point_fin.y-(point_ctrl_fin.y-point_fin.y)*rapport;
00052                 return tmp;
00053         }
00054 
00055         jBEZctrlPoint * __fastcall  Copy();
00056 
00057         // transformations
00058         void __fastcall Move(TPoint vect);
00059         void __fastcall Scale(TPoint origine, float rapportX, float rapportY);
00060         void __fastcall Rotate(TPoint origine, float angle);
00061         void __fastcall HorizontalSymetry(double ord);
00062         void __fastcall VerticalSymetry(double abs);
00063 
00064         void __fastcall Draw(TCanvas * CV, bool tangentes=false, jBEZctrlPoint * suiv=NULL);
00065         void __fastcall UnDraw(TCanvas * CV, bool tangentes=false, jBEZctrlPoint * suiv=NULL);
00066         void __fastcall LoadFromFile(FILE * f);
00067         void __fastcall SaveToFile(FILE * f);
00068 };
00069 
00070 //----------------------------------------------------------------------------
00071 // CLASS BEZIER_CRV
00072 // = courbe de bezier (composée de plusieurs segment control_point)
00073 //----------------------------------------------------------------------------
00074 
00075 class jBEZcurve
00076 {
00077         vector<jBEZctrlPoint *> vecteur;
00078         vector<jBEZctrlPoint *>::iterator it;
00079 
00080         public:
00081         jBEZcurve()      {vecteur.clear();}
00082 
00083         void __fastcall AddPoint(int X, int Y, int X2=0, int Y2=0);
00084         void __fastcall AddPoint(const TPoint & A, const TPoint & B=TPoint(0,0))   { AddPoint(A.x, A.y, B.x, B.y); }        
00085         void __fastcall DelLastPoint();
00086         void __fastcall DelPoint(int num);
00087         void __fastcall ChangeVectorOfLastPoint(int X, int Y);
00088         void __fastcall InsertPoint(int num, int X, int Y, int X2=0, int Y2=0);
00089 
00090         void __fastcall Draw(TCanvas * CV, bool tangentes=false);
00091         bool __fastcall DrawFetched(TCanvas * CV, const TRect & z_dst, const TRect & z_src, bool tangentes=false);
00092 
00093         void __fastcall RedrawLast(TCanvas * CV, bool tangentes=false);
00094         void __fastcall RefreshLast(TCanvas * CV, int X, int Y, bool tangentes=false);
00095         void __fastcall TranslatePoint(TCanvas * CV, int num, int X, int Y, bool tangentes=false);
00096         void __fastcall TranslateCtrlFinPoint(TCanvas * CV, int num, int X, int Y, bool tangentes=false);
00097         void __fastcall TranslateCtrlDebPoint(TCanvas * CV, int num, int X, int Y, bool tangentes=false);
00098         TPoint __fastcall Check4Point(bool tangentes, int X, int Y);
00099         void __fastcall Smooth(float);
00100         int  __fastcall Check4MinDistance(int X, int Y);
00101         void __fastcall LoadFromFile(FILE * f, int max);
00102         void __fastcall SaveToFile(FILE * f);
00103 
00104         jBEZcurve * __fastcall Copy();
00105 
00106         // transformations
00107         void __fastcall Move(TPoint vect)
00108         {
00109             for (unsigned int i=0; i< vecteur.size(); i++)
00110                 vecteur.at(i)->Move(vect);
00111         }
00112         void __fastcall Scale(TPoint origine, float rapportX, float rapportY)
00113         {
00114             for (unsigned int i=0; i< vecteur.size(); i++)
00115                 vecteur.at(i)->Scale(origine, rapportX, rapportY);
00116         }
00117         void __fastcall Rotate(TPoint origine, float angle)
00118         {
00119             for (unsigned int i=0; i< vecteur.size(); i++)
00120                 vecteur.at(i)->Rotate(origine, angle);
00121         }
00122         void __fastcall HorizontalSymetry(double ord)
00123         {
00124             for (unsigned int i=0; i< vecteur.size(); i++)
00125                 vecteur.at(i)->HorizontalSymetry(ord);
00126         }
00127         void __fastcall VerticalSymetry(double abs)
00128         {
00129             for (unsigned int i=0; i< vecteur.size(); i++)
00130                 vecteur.at(i)->VerticalSymetry(abs);
00131         }
00132 
00133         bool __fastcall Fetch(const TRect & dst, const TRect & src);
00134 
00135         TPoint __fastcall FirstPoint(bool & existe)
00136         {
00137                 if (vecteur.size() <= 0)       { existe = false; return TPoint(-1, -1); }
00138                 existe = true;
00139                 return vecteur.front()->point_debut;
00140         }
00141         ~jBEZcurve()
00142         {
00143                 for (unsigned int i=0; i<vecteur.size(); i++)
00144                 {
00145                         if (vecteur.at(i))
00146                                 delete vecteur.at(i);
00147                 }
00148                 vecteur.clear();
00149         }
00150 };
00151 
00152 //----------------------------------------------------------------------------
00153 // CLASS jBEZcurves
00154 // = ensemble de courbes de bezier
00155 //----------------------------------------------------------------------------
00156 
00157 class jBEZcurves
00158 {
00159         vector<jBEZcurve *> vecteur;
00160 
00161         public:
00162 
00163         jBEZcurves()      {vecteur.clear();}
00164 
00165         void __fastcall AddCurve(jBEZcurve * crv) {vecteur.push_back(crv);}
00166         jBEZcurve * __fastcall CurveAt(unsigned int num)   {return ((num < 0 || num >= vecteur.size()) ? NULL : vecteur.at(num));}
00167 
00168         bool __fastcall LoadFromFile(FILE * f, int max1, int max2);
00169         bool __fastcall SaveToFile(FILE * f);
00170 
00171         void __fastcall Move(int x, int y)                                   { Move(TPoint(x, y)); }
00172         // transformations
00173         void __fastcall Move(TPoint vect)
00174         {
00175             for (unsigned int i=0; i< vecteur.size(); i++)
00176                 vecteur.at(i)->Move(vect);
00177         }
00178 
00179         void __fastcall Scale(TPoint origine, double rapportX, double rapportY)
00180         {
00181             for (unsigned int i=0; i< vecteur.size(); i++)
00182                 vecteur.at(i)->Scale(origine, rapportX, rapportY);
00183         }
00184 
00185         void __fastcall Rotate(TPoint origine, double angle)
00186         {
00187             for (unsigned int i=0; i< vecteur.size(); i++)
00188                 vecteur.at(i)->Rotate(origine, angle);
00189         }
00190         void __fastcall HorizontalSymetry(double ord)
00191         {
00192             for (unsigned int i=0; i< vecteur.size(); i++)
00193                 vecteur.at(i)->HorizontalSymetry(ord);
00194         }
00195         void __fastcall VerticalSymetry(double abs)
00196         {
00197             for (unsigned int i=0; i< vecteur.size(); i++)
00198                 vecteur.at(i)->VerticalSymetry(abs);
00199         }
00200 
00201 /*      // ne marche pas : copie les adresses au lieu de copier l'objet
00202         jBEZcurves & operator=(const jBEZcurves & b)
00203         {
00204             for (int i=0; i<b.vecteur.size(); i++)
00205                 vecteur.push_back(b.vecteur.at(i)->Copy());
00206             return *this;
00207         }*/
00208 
00209         void Copy(const jBEZcurves & b)
00210         {
00211             for (unsigned int i=0; i<b.vecteur.size(); i++)
00212                 vecteur.push_back(b.vecteur.at(i)->Copy());
00213         }
00214 
00215         ~jBEZcurves()   { Empty(); }
00216 
00217         void __fastcall Empty()
00218         {
00219                 jBEZcurve * l_courbe = NULL;
00220                 for (unsigned int i=0; i<vecteur.size(); i++)
00221                 {
00222                         l_courbe = vecteur.at(i);
00223                         if (!l_courbe)  continue;
00224                         delete l_courbe;
00225                 }
00226                 vecteur.clear();
00227         }
00228 
00229         bool __fastcall Resize(int nb);        
00230 
00231         void __fastcall Draw(TCanvas * CV, int num=0)
00232         {
00233                 if (num==0)
00234                         for (unsigned int i=0; i<vecteur.size(); i++)
00235                                 vecteur.at(i)->Draw(CV, false); // JEG avant (i==num));
00236                 else
00237                         vecteur.at(num)->Draw(CV, false);
00238         }
00239 
00240         void __fastcall DrawFetched(TCanvas * CV, const TRect & dst, const TRect & src, int num=0)
00241         {
00242                 jBEZcurves l_courbes;
00243                 l_courbes.Copy(*this);
00244                 l_courbes.Fetch(dst, src);
00245                 l_courbes.Draw(CV, num);
00246         }
00247 
00248         void __fastcall Fetch(const TRect & dst, const TRect & src)
00249         {
00250                 TPoint l_vect    = TPoint(dst.Left - src.Left, dst.Top - src.Top);
00251                 TPoint origine   = TPoint(dst.Left, dst.Top);
00252                 float  l_rapportH= dst.Height() ? dst.Height() / ((float)(src.Height() ? src.Height() : 1)) : 1;
00253                 float  l_rapportW= dst.Height() ? dst.Width()  / ((float)(src.Width()  ? src.Width()  : 1)) : 1;
00254                 Move(l_vect);
00255                 Scale(origine, l_rapportW, l_rapportH);
00256         }
00257         int  __fastcall Size()                          { return vecteur.size(); }
00258         bool __fastcall ContainsCurves()                { return ((bool)vecteur.size()); }
00259         bool __fastcall IsEmpty()                       { return (!vecteur.size()); }
00260 };
00261 #endif

Generated on Sat Nov 15 10:52:34 2003 for JAPI by doxygen 1.3.4