Back to index

wims  3.65+svn20090927
Figure.java
Go to the documentation of this file.
00001 // geo/Figure.java - 31/01/99
00002 
00003 package geo ;
00004 
00005 import java.awt.* ;
00006 import java.util.Vector ;
00007 
00013 public class Figure extends Vector
00014 {
00015 
00020   public Figure ()
00021   { super () ; }
00022 
00023 // marque en remplaçant le "id" de tous les éléments construits à partir de index par - id
00024 
00025   private void marquer (int index)
00026   { Element el ;
00027     el = (Element) elementAt (index) ;
00028     el.id = - el.id ;
00029     for (int i = index + 1 ; i < size () ; i ++)
00030       { el = (Element) elementAt (i) ;
00031         for (int j = 0 ; j < 3 ; j ++)
00032           { int k = el.args [j] ;
00033             if ((k > 0) && (((Element) elementAt (k)).id < 0) && (el.id > 0))
00034               el.id = - el.id ;
00035           }
00036       }
00037   }
00038 
00044   public void efface (int index, int index1, Graphics g)
00045   { if (index > 0)
00046       { marquer (index) ;
00047         for (int i = 1 ; i < size () ; i ++)
00048           { Element el = (Element) elementAt (i) ;
00049             if (el.id < 0)
00050               { el.id = - el.id ;
00051                 if (i != index1) el.efface (g) ;
00052 
00053 // 31/01/99
00054                 else if ((el.id >= Element.PT_X_Y) && (el.id <= Element.POINT_TRANSLATION_PT_VECT))
00055                   ((pt) el.obj).traceNom (g) ;
00056 //
00057                 el.id = - el.id ;
00058               }
00059           }
00060       }
00061     else for (int i = 1 ; i < size () ; i ++)
00062            if (i != index1) ((Element) elementAt (i)).efface (g) ;
00063   }
00064 
00069   public void trace (Graphics g)
00070   { for (int i = 1 ; i < size () ; i ++)
00071     { Element el = (Element) elementAt (i) ;
00072       if (el.id > Element.POINT_TRANSLATION_PT_VECT) el.trace (g) ;
00073     }
00074     for (int i = 1 ; i < size () ; i ++)
00075     { Element el = (Element) elementAt (i) ;
00076       if (el.id <= Element.POINT_TRANSLATION_PT_VECT) el.trace (g) ;
00077     }
00078   }
00079 
00080   private Element tel [] = { null, null, null } ;
00081 
00086   public void ajout (Element el, String Nom, int X, int Y, double d)
00087   { Repere R = (Repere) firstElement () ;
00088     for (int i = 0 ; i < 3 ; i ++)
00089       { tel [i] = null ;
00090         if (el.args [i] > 0) tel [i] = ((Element) elementAt (el.args [i])) ;
00091       }
00092     ObjetRepere or ;
00093     if ((el.id >= Element.PT_X_Y) && (el.id <= Element.PT_SYMETRIQUE_PT_PT))
00094       or = new pt (Nom, R) ;
00095     else if ((el.id >= Element.POINT_CENTRE) && (el.id <= Element.POINT_TRANSLATION_PT_VECT))
00096       or = new point (Nom, R) ;
00097     else if ((el.id >= Element.VECTEUR_PT_PT) && (el.id <= Element.VECTEUR_PT_PT_PT))
00098       or = new Vecteur (Nom, R) ;
00099     else if ((el.id >= Element.DROITE_PT_PT) && (el.id <= Element.DROITE_BISS_PT_PT_PT))
00100       or = new Droite (Nom, R) ;
00101     else if ((el.id >= Element.NOMBRE) && (el.id <= Element.NOMBRE_PUISSANCE))
00102       or = new Scalaire (Nom, R) ;
00103     else switch (el.id)
00104       { case Element.POINTLIBRE : or = new pointlibre (X, Y, Nom, R) ; break ;
00105         case Element.POINTSURDROITE_DT : or = new PointSurDroite (X, Y, (Droite) tel [0].obj, Nom, R) ; break ;
00106         case Element.POINTSURCERCLE_CRCL : or = new PointSurCercle (X, Y, (Cercle) tel [0].obj, Nom, R) ; break ;
00107         case Element.ARCDECERCLE_PT_PT_PT : or = new ArcDeCercle (Nom, R) ; break ;
00108         case Element.CERCLE_PT_R :
00109         case Element.CERCLE_PT_PT :
00110         case Element.CERCLE_PT_PT_PT : or = new Cercle (Nom, R) ; break ;
00111         case Element.SEGMENT_PT_PT : or = new Segment (Nom, R) ; break ;
00112         case Element.DEMIDROITE_PT_PT :
00113         case Element.DEMIDROITE_PT_VECT : or = new DemiDroite (Nom, R) ; break ;
00114 
00115         default : throw new IllegalArgumentException () ;
00116       }
00117     calcule (el, or, d) ;
00118     el.obj = or ;
00119     addElement (el) ;
00120   }
00121 
00122 
00127   private void calcule (Element el, ObjetRepere or, double d)
00128   { switch (el.id)
00129       { case Element.PT_X_Y : ((pt) or).point (((Scalaire) tel [0].obj).d, ((Scalaire) tel [1].obj).d) ; break ;
00130         case Element.PT_MILIEU_PT_PT : ((pt) or).Milieu ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00131         case Element.PT_ROTATION_PT_A : ((pt) or).Rotation ((pt) tel [0].obj, (pt) tel [1].obj, ((Scalaire) tel [2].obj).d) ; break ;
00132         case Element.PT_HOMOTHETIQUE_PT_PT_K : ((pt) or).Homothetique ((pt) tel [0].obj, (pt) tel [1].obj, ((Scalaire) tel [2].obj).d) ; break ;
00133         case Element.PT_SYMETRIQUE_PT_PT : ((pt) or).Symetrique ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00134         case Element.POINTLIBRE : ((pointlibre) or).point () ; break ;
00135         case Element.POINTSURDROITE_DT : ((PointSurDroite) or).point () ; break ;
00136         case Element.POINTSURCERCLE_CRCL : ((PointSurCercle) or).point () ; break ;
00137         case Element.POINT_CENTRE : ((point) or).Centre ((Cercle) tel [0].obj) ; break ;
00138         case Element.POINT_INTER_DT_DT : ((point) or).Intersection ((Droite) tel [0].obj, (Droite) tel [1].obj) ; break ;
00139         case Element.POINT_INTER1_DT_CRCL : ((point) or).Intersection1 ((Droite) tel [0].obj, (Cercle) tel [1].obj) ; break ;
00140         case Element.POINT_INTER2_DT_CRCL : ((point) or).Intersection2 ((Droite) tel [0].obj, (Cercle) tel [1].obj) ; break ;
00141         case Element.POINT_INTER1_CRCL_CRCL : ((point) or).Intersection1 ((Cercle) tel [0].obj, (Cercle) tel [1].obj) ; break ;
00142         case Element.POINT_INTER2_CRCL_CRCL : ((point) or).Intersection2 ((Cercle) tel [0].obj, (Cercle) tel [1].obj) ; break ;
00143         case Element.POINT_PROJECTION_PT_DT : ((point) or).Projection ((pt) tel [0].obj, (Droite) tel [1].obj) ; break ;
00144         case Element.POINT_PROJECTION_PT_SEG : ((point) or).Projection ((pt) tel [0].obj, (Segment) tel [1].obj) ; break ;
00145         case Element.POINT_SYMETRIQUE_PT_DT : ((point) or).Symetrique ((pt) tel [0].obj, (Droite) tel [1].obj) ; break ;
00146         case Element.POINT_ROTATION_PT_PT_ARCDECERCLE : ((point) or).Rotation1 ((pt) tel [0].obj, (pt) tel [1].obj, (ArcDeCercle) tel [2].obj) ; break ;
00147         case Element.POINT_SYMETRIQUE_PT_SEG : ((point) or).Symetrique ((pt) tel [0].obj, (Segment) tel [1].obj) ; break ;
00148         case Element.POINT_TRANSLATION_PT_VECT : ((point) or).Translation ((pt) tel [0].obj, (Vecteur) tel [1].obj) ; break ;
00149         case Element.ARCDECERCLE_PT_PT_PT :  ((ArcDeCercle) or).ArcDeCercle ((pt) tel [0].obj, (pt) tel [1].obj, (pt) tel [2].obj) ; break ;
00150         case Element.CERCLE_PT_R : ((Cercle) or).Cercle ((pt) tel [0].obj, ((Scalaire) tel [1].obj).d) ; break ;
00151         case Element.CERCLE_PT_PT : ((Cercle) or).Cercle ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00152         case Element.CERCLE_PT_PT_PT : ((Cercle) or).Cercle ((pt) tel [0].obj, (pt) tel [1].obj, (pt) tel [2].obj) ; break ;
00153         case Element.SEGMENT_PT_PT : ((Segment) or).Segment ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00154         case Element.VECTEUR_PT_PT : ((Vecteur) or).Vecteur ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00155         case Element.VECTEUR_SOMME_V_W_PT : ((Vecteur) or).Somme ((Vecteur) tel [0].obj, (Vecteur) tel [1].obj) ;
00156                                             ((Vecteur) or).fixeVecteur ((pt) tel [2].obj) ; break ;
00157         case Element.VECTEUR_PRODUIT_V_K_PT : ((Vecteur) or).Produit ((Vecteur) tel [0].obj, ((Scalaire) tel [2].obj).d) ;
00158                                               ((Vecteur) or).fixeVecteur ((pt) tel [1].obj) ; break ;
00159         case Element.VECTEUR_PT_PT_PT : ((Vecteur) or).Vecteur ((pt) tel [0].obj, (pt) tel [1].obj, (pt) tel [2].obj) ; break ;
00160         case Element.DROITE_PT_PT : ((Droite) or).Droite ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00161         case Element.DROITE_PT_VECT : ((Droite) or).Droite ((pt) tel [0].obj, (Vecteur) tel [1].obj) ; break ;
00162         case Element.DROITE_A_B_C : ((Droite) or).Droite (((Scalaire) tel [0].obj).d, ((Scalaire) tel [1].obj).d, ((Scalaire) tel [2].obj).d) ; break ;
00163         case Element.DROITE_PARA_DT_PT : ((Droite) or).Parallele ((Droite) tel [0].obj, (pt) tel [1].obj) ; break ;
00164         case Element.DROITE_PARA_SEG_PT : ((Droite) or).Parallele ((Segment) tel [0].obj, (pt) tel [1].obj) ; break ;
00165         case Element.DROITE_PERP_DT_PT : ((Droite) or).Perpendiculaire ((Droite) tel [0].obj, (pt) tel [1].obj) ; break ;
00166         case Element.DROITE_PERP_SEG_PT : ((Droite) or).Perpendiculaire ((Segment) tel [0].obj, (pt) tel [1].obj) ; break ;
00167         case Element.DROITE_MEDI_PT_PT : ((Droite) or).Mediatrice ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00168         case Element.DROITE_BISS_PT_PT_PT : ((Droite) or).Bissectrice ((pt) tel [0].obj, (pt) tel [1].obj, (pt) tel [2].obj) ; break ;
00169         case Element.DEMIDROITE_PT_PT : ((DemiDroite) or).DemiDroite ((pt) tel [0].obj, (pt) tel [1].obj) ; break ;
00170         case Element.DEMIDROITE_PT_VECT : ((DemiDroite) or).DemiDroite ((pt) tel [0].obj, (Vecteur) tel [1].obj) ; break ;
00171         case Element.NOMBRE : ((Scalaire) or).Scalaire (d) ;  break ;
00172         case Element.NOMBRE_PT_ABS : ((Scalaire) or).Scalaire (((pt) tel [0].obj).x) ; break ;
00173         case Element.NOMBRE_PT_ORD : ((Scalaire) or).Scalaire (((pt) tel [0].obj).y) ; break ;
00174         case Element.NOMBRE_DISTANCE_PT_DR : ((Scalaire) or).Scalaire (((point) tel [0].obj).Distance ((Droite) tel [1].obj)) ; break ;
00175         case Element.NOMBRE_DISTANCE_PT_PT : ((Scalaire) or).Scalaire (((pt) tel [0].obj).Distance ((pt) tel [1].obj)) ; break ;
00176         case Element.NOMBRE_NORME_VECT : ((Scalaire) or).Scalaire (((Vecteur) tel [0].obj).Norme ()) ; break ;
00177         case Element.NOMBRE_LONGUEUR_SEG : ((Scalaire) or).Scalaire (((Segment) tel [0].obj).Longueur ()) ; break ;
00178         case Element.NOMBRE_RAYON_CRCL : ((Scalaire) or).Scalaire (((Cercle) tel [0].obj).r) ; break ;
00179         case Element.NOMBRE_SOMME : ((Scalaire) or).Scalaire (((Scalaire) tel [0].obj).d + ((Scalaire) tel [1].obj).d) ; break ;
00180         case Element.NOMBRE_DIFFERENCE : ((Scalaire) or).Scalaire (((Scalaire) tel [0].obj).d - ((Scalaire) tel [1].obj).d) ; break ;
00181         case Element.NOMBRE_PRODUIT : ((Scalaire) or).Scalaire (((Scalaire) tel [0].obj).d * ((Scalaire) tel [1].obj).d) ; break ;
00182         case Element.NOMBRE_QUOTIENT : ((Scalaire) or).Scalaire (((Scalaire) tel [0].obj).d / ((Scalaire) tel [1].obj).d) ; break ;
00183         case Element.NOMBRE_OPPOSE : ((Scalaire) or).Scalaire (-((Scalaire) tel [0].obj).d) ; break ;
00184         case Element.NOMBRE_VABS : ((Scalaire) or).Scalaire (Math.abs (((Scalaire) tel [0].obj).d)) ; break ;
00185         case Element.NOMBRE_RACINE :
00186           double d1 = ((Scalaire) tel [0].obj).d ;
00187           if (d1 >= 0) ((Scalaire) or).Scalaire (Math.sqrt(d1)) ;
00188           else ((Scalaire) or).defini = false ;
00189           break ;
00190         case Element.NOMBRE_COS : ((Scalaire) or).Scalaire (Math.cos (((Scalaire) tel [0].obj).d)) ; break ;
00191         case Element.NOMBRE_SIN : ((Scalaire) or).Scalaire (Math.sin (((Scalaire) tel [0].obj).d)) ; break ;
00192         case Element.NOMBRE_ARCCOS : 
00193           d1 = ((Scalaire) tel [0].obj).d ;
00194           if (Math.abs(d1) <= 1.0) ((Scalaire) or).Scalaire (Math.acos (d1)) ;
00195           else ((Scalaire) or).defini = false ;
00196           break ;
00197         case Element.NOMBRE_ARCSIN :
00198           d1 = ((Scalaire) tel [0].obj).d ;
00199           if (Math.abs(d1) <= 1.0) ((Scalaire) or).Scalaire (Math.asin (d1)) ;
00200           else ((Scalaire) or).defini = false ;
00201           break ;
00202         case Element.NOMBRE_LN :
00203           d1 = ((Scalaire) tel [0].obj).d ;
00204           if (d1 > 0.0) ((Scalaire) or).Scalaire (Math.log (d1)) ;
00205           else ((Scalaire) or).defini = false ;
00206           break ;
00207         case Element.NOMBRE_PUISSANCE :
00208           d1 = ((Scalaire) tel [0].obj).d ;
00209           double d2 = ((Scalaire) tel [1].obj).d ;
00210           if ((d1 == 0.0) && (d2 < 0.0) || (d1 <= 0.0) && (d2 != Math.floor(d2))) ((Scalaire) or).defini = false ;
00211           else ((Scalaire) or).Scalaire (Math.pow (d1, d2)) ;
00212           break ;
00213 
00214         default : throw new IllegalArgumentException () ;
00215       }
00216   }
00217 
00218 
00223   public void recalcule (int index)
00224   { Repere R = (Repere) firstElement () ;
00225     Element el ;
00226     for (int i = 1 ; i < size () ; i ++)
00227       { el = ((Element) elementAt (i)) ;
00228         if ((el.id < 0) || (index <= 0))
00229           { if (el.id < 0) el.id = - el.id ;
00230             for (int j = 0 ; j < 3 ; j ++)
00231               { tel [j] = null ;
00232                 if (el.args [j] > 0) tel [j] = ((Element) elementAt (el.args [j])) ;
00233               }
00234             ObjetRepere or = el.obj ;
00235            if (el.id != el.NOMBRE) calcule (el, or, 0.0) ;
00236           }
00237       }
00238   }
00239 
00245   public int zone (int id1, int id2, int X, int Y)
00246   { Element el ;
00247       int i ;
00248       for (i = size () - 1 ; i >= 1 ; i --)
00249         { el = ((Element) elementAt (i)) ;
00250           if ((el.id >= id1) && (el.id <= id2) && (el.obj.zone (X, Y))) break ;
00251         }
00252       if (i == size ()) return 0 ; else return i ;
00253   }
00254 
00259   public void supprime (int i)
00260   { if ((i > 0) && (i < size ()))
00261       { setElementAt (null, i) ;
00262         for (int k = i + 1 ; k < size () ; k ++)
00263           { Element el = (Element) elementAt (k) ;
00264             for (int l = 0 ; l < 3 ; l ++)
00265               { int m = el.args [l] ;
00266                 if (m >0)
00267                   { if (elementAt (m) == null)
00268                       { setElementAt (null, k) ;
00269                         break ;
00270                       }
00271                   }
00272                 else break ;
00273               }
00274           }
00275         int j = i ;
00276         while (j < size ())
00277           { if (elementAt (j) == null)
00278               { removeElementAt (j) ;
00279                 for (int k = j + 1 ; k < size () ; k ++)
00280                   { Element el = (Element) elementAt (k) ;
00281                     if (el != null)
00282                       for (int l = 0 ; l < 3 ; l ++)
00283                         { int m = el.args [l] ;
00284                           if (m >0) { if (m > j) el.args [l] -- ; }
00285                           else break ;
00286                         }
00287                   }
00288               }
00289             else j ++ ;
00290           }
00291       }
00292   }
00293 
00294 }