00001
00002 #ifndef jAPIgeometryH
00003 #define jAPIgeometryH
00004
00005
00006
00007 enum jIntersections {inter_n_existe_pas=0, inter_existe, negatif, positif, posterieur, anterieur, bas, haut, confondues, paralleles_strict, segment_inside, segment_outside };
00008
00009 class jPoint;
00010
00011 class jVecteur
00012 {
00013 public:
00014 double x,y;
00015 jVecteur(double xx=0, double yy=0) { x = xx; y = yy; }
00016 jVecteur(const TPoint & a, const TPoint & b) { x = b.x-a.x; y = b.y-a.y; }
00017 jVecteur & operator=(const jVecteur & v) { x = v.x; y = v.y; return *this;}
00018
00019 friend jVecteur operator*(jVecteur v, double f) { return jVecteur(v.x*f, v.y*f); }
00020 friend jVecteur operator*(float f, jVecteur v) { return jVecteur(v.x*f, v.y*f); }
00021 void __fastcall operator*=(double f) { x*=f; y*=f; }
00022 jVecteur __fastcall operator+(jVecteur v) { return jVecteur(x+v.x, y+v.y); }
00023 void __fastcall Rotation(float);
00024 float __fastcall Norme();
00025 };
00026
00027 class jSegment;
00028
00029 class jDroite
00030 {
00031 public:
00032
00033
00034 double a, b, c;
00035
00036 jDroite() {a=0; b=0; c=0; }
00037 jDroite(const TPoint & p, const jVecteur & v);
00038 jDroite(const jVecteur& v, const TPoint& p);
00039 jDroite(const TPoint & p1, const TPoint & p2);
00040 jDroite & operator=(const jDroite & D) { a = D.a; b = D.b; c = D.c; return *this;}
00041
00042 bool __fastcall Rotation(const TPoint & centre, double angleRotDegres);
00043 jVecteur __fastcall Porteur();
00044 jVecteur __fastcall Normal();
00045 };
00046
00047 TPoint __fastcall jGEOmilieu(const TPoint & p, const TPoint & q) { return TPoint((p.x+q.x)/2.0, (p.y+q.y)/2.0); }
00048
00049 double jGEOdistance(const jDroite & d, const jPoint & p);
00050 double jGEOdistance(const jSegment & s, const jPoint & p);
00051
00052 TPoint __fastcall jGEOintersection(const jDroite & d1, const jDroite & d2, jIntersections & _cas);
00053 TPoint __fastcall jGEOintersection(const jDroite & d, const jSegment & s, jIntersections & _cas);
00054 inline TPoint __fastcall jGEOintersection(const jSegment & s, const jDroite & d, jIntersections & _cas) { return jGEOintersection(d, s, _cas); }
00055
00056 jDroite __fastcall jGEOperpendiculaire(const jDroite & d, const TPoint & p) { return jDroite(p, d.Normal()); }
00057 inline jDroite __fastcall jGEOperpendiculaire(const TPoint & p, const jDroite & d) { return jGEOperpendiculaire(d, p); }
00058
00059 TPoint __fastcall jGEOprojection(const TPoint & p, const jDroite & d) { jIntersections existe; return jGEOintersection(d, jGEOperpendiculaire(d, p), existe); }
00060 inline TPoint __fastcall jGEOprojection(const jDroite & d, const TPoint & p) { return jGEOprojection(p, d); }
00061
00062 jDroite __fastcall jGEOparallele(const jDroite & d, const TPoint & p) { return jDroite(p, d.Porteur()); }
00063 inline jDroite __fastcall jGEOparallele(const TPoint & p, const jDroite & d) { return jGEOparallele(d, p); }
00064
00065 jDroite __fastcall jGEOrotation(const jDroite &d, const TPoint &p, float angle);
00066
00067 jDroite __fastcall jGEOparalleleDistante(const jDroite &d, double distance, jIntersections sens);
00068 inline jDroite __fastcall jGEOparalleleDistante(double distance, jDroite d, jIntersections sens) { return jGEOparalleleDistante(d, distance, sens); }
00069
00070 TPoint __fastcall jGEOpointDistant(const TPoint & p, const jVecteur & v, double distance, jIntersections sens);
00071 inline TPoint __fastcall jGEOpointDistant(const jVecteur & v, const TPoint & p, double f, jIntersections sens) { return jGEOpointDistant(p,v,f,sens); }
00072 inline TPoint __fastcall jGEOpointDistant(const TPoint & p, const jDroite & d, double f, jIntersections sens) { return jGEOpointDistant(p,d.Porteur(),f,sens);}
00073 inline TPoint __fastcall jGEOpointDistant(const jDroite & d, const TPoint & p, double f, jIntersections sens) { return jGEOpointDistant(p,d.Porteur(),f,sens);}
00074
00075 class jPoint : public TPoint
00076 {
00077 public:
00078
00079 jPoint() { x=0; y=0; }
00080 jPoint(int a, int b) { x=a; y=b; }
00081
00082
00083 jPoint(const TPoint & p) { x=p.x; y=p.y; }
00084 jPoint & operator=(const TPoint & P) { x=P.x; y=P.y; return *this;}
00085 bool __fastcall Rotation(const jPoint & centre, double angleRotDegres);
00086 bool __fastcall Translation(const jVecteur & v) { x+=v.x; y+=v.y; return true;}
00087 void __fastcall Stretch(const jPoint & origine, double rapX, double rapY)
00088 {
00089 x = origine.x + rapX*(x - origine.x);
00090 y = origine.y + rapY*(y - origine.y);
00091 }
00092 bool __fastcall Symetrie(const jDroite & d);
00093
00094 bool __fastcall Stretch( const TRect & NewCadre, const TRect & OldCadre, bool right=true);
00095
00096 bool __fastcall UnStretch(const TRect & NewCadre, const TRect & OldCadre, bool right=true);
00097 bool operator==(const jPoint & p) { return (x==p.x && y==p.y); }
00098 bool operator!=(const jPoint & p) { return (x!=p.x || y!=p.y); }
00099 };
00100
00101 class jSegment
00102 {
00103 public:
00104 TPoint p, q;
00105 jDroite d;
00106
00107 jSegment() { p=TPoint(0, 0); q=TPoint(0, 0); d=jDroite(p, q); }
00108 jSegment(TPoint pp, TPoint qq) { p=pp; q=qq; d=jDroite(pp, qq); }
00109 jSegment(TPoint pp, TPoint qq, jDroite dd) { p=pp; q=qq; d=dd; }
00110
00111 jDroite & Porteuse() { return d; }
00112 };
00113
00114 #endif