00001
00002 #ifndef jAPIbeziersH
00003 #define jAPIbeziersH
00004
00005
00006 #include <vector.h>
00007 #include <stdio.h>
00008
00009
00010
00011
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
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
00072
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
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
00154
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
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
00202
00203
00204
00205
00206
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);
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