Back to index

wims  3.65+svn20090927
ArcDeCercle.java
Go to the documentation of this file.
00001 // ArcDeCercle - 02/12/98 - 07/09/99 - 10/01/2001
00002 
00003 package geo ;
00004 
00005 import java.awt.Graphics ;
00006 
00013 public class ArcDeCercle extends ObjetRepere
00014 {
00015 
00020 public double xo, yo ;
00021 
00026   public double r ;
00027 
00032   public double a, b ;
00033 
00038   public ArcDeCercle (String Nom, Repere R)
00039   { super (Nom, R) ; }
00040 
00045   public ArcDeCercle (pt O, double r, double a, double b, String Nom, Repere R)
00046   { super (Nom, R) ; ArcDeCercle (O, r, a, b) ; }
00047 
00052   public ArcDeCercle (double xo, double yo, double r, double a, double b, String Nom, Repere R)
00053   { super (Nom, R) ; ArcDeCercle (xo, yo, r, a, b) ; }
00054 
00059   public ArcDeCercle (pt O, pt A, double a, double b, String Nom, Repere R)
00060   { super (Nom, R) ; ArcDeCercle (O, A, a, b) ; }
00061 
00066   public ArcDeCercle (pt A, pt O, pt B, String Nom, Repere R)
00067   { super (Nom, R) ; ArcDeCercle (A, O, B) ; }
00068 
00073   public void trace (Graphics g)
00074   { if (defini) { int B = (int)(b * 180.0 / Math.PI) ;
00075                   int B1 = B % 360 ;
00076                   if (B1 != 0)
00077                     { int Xo = R.Iabs (xo) ; int Yo = R.Iord (yo);
00078                       int RX = (int) (R.unitex * r) ; int RY = (int) (R.unitey * r) ;
00079                       g.drawArc (Xo - RX, Yo - RY, 2 * RX, 2 * RY,
00080                                  (int)(a * 180.0 / Math.PI), B) ;
00081                       pt p = new pt (xo + r * Math.cos (a), yo + r * Math.sin (a), "", R) ;
00082                       p.Rotation (p, new pt (xo, yo, "", R), b) ;
00083                       double x = p.x - xo ; double y = p.y - yo ;
00084                       double l = Math.sqrt (x * x + y * y) ;
00085                       B = B % 360 ;
00086                       if (( B > 0) && (B <= 180) || (B < -180)) y = - y ; else x = - x ;
00087                       int X = (int) (y * 4.0 / l) ;
00088                       int Y = (int) (x * 4.0 / l) ;
00089                       g.drawLine (p.X, p.Y, p.X - X - Y, p.Y + Y - X) ;
00090                       g.drawLine (p.X, p.Y, p.X - X + Y, p.Y + Y + X) ;
00091 
00092                     }
00093                   if (Nom.length () != 0 )
00094                     { int X = R.Iabs (xo + r * Math.cos (a + b / 2)) + 3 ;
00095                       int Y = R.Iord (yo + r * Math.sin (a + b / 2)) - 3 ;
00096                       g.drawString (Nom, X, Y) ;
00097                     }
00098                 }
00099   }
00100 
00105    public boolean zone (int X, int Y)
00106    { if (defini)
00107        { double dx = R.Abs (X) - xo ; double dy = R.Ord (Y) - yo ;
00108          if (Math.abs (Math.sqrt (dx * dx + dy * dy) - r) * (R.unitex + R.unitey) > 3.0)
00109            return false ;
00110          else
00111            { Scalaire s = new Scalaire ("", R) ; s.Angle (new Vecteur (1.0, 0.0, "", R), new Vecteur (dx, dy, "", R)) ;
00112 //10/01/2001
00113              double angle = na (s.d - a) ;
00114              double bt = na (b) ;
00115 //
00116              return (((bt >= 0.0) && (angle >= 0.0) && (angle <= bt)) || ((bt < 0.0) && (angle <= 0.0) && (angle >= bt))) ;
00117            }
00118        }
00119      return false ;
00120    }
00121 
00122 //10/01/2001
00123    private double na (double a)
00124    { double pi2 = 2.0 * Math.PI ;
00125      while (a > Math.PI) a -= pi2 ;
00126      while (a <= - Math.PI) a += pi2 ;
00127      return a ;
00128    }
00129 //
00130 
00135   public void ArcDeCercle (pt O, double r, double a, double b)
00136   { xo = O.x ; yo = O.y ; this.r = r ; this.a = a ; this.b = b ; defini = (r >= 0.0); }
00137 
00142   public void ArcDeCercle (double xo, double yo, double r, double a, double b)
00143   { this.xo = xo; this.yo = yo; this.r = r ; this.a = a ; this.b = b ; defini = (r >= 0.0); }
00144 
00149   public void ArcDeCercle (pt O, pt A, double a, double b)
00150   { defini = O.defini && A.defini ;
00151     this.xo = O.x ; this.yo = O.y ;
00152     r = A.x - O.x ; double d = A.y - O.y ; r = Math.sqrt (r * r + d * d) ;
00153     this.a = a ; this.b = b ;
00154   }
00155 
00160   public void ArcDeCercle (pt A, pt O, pt B)
00161   { defini = O.defini && A.defini && B.defini ;
00162     if (defini)
00163       { xo = O.x ; yo = O.y ;
00164         Vecteur u = new Vecteur (1.0, 0.0, "", R) ;
00165         Vecteur v = new Vecteur (A.x - O.x, A.y - O.y, "", R) ;
00166         r = v.Norme () ;
00167         Scalaire S = new Scalaire ("", R) ;
00168         S.Angle (u, v) ;
00169         if (defini = S.defini)
00170           { a = S.d ;
00171             u.Vecteur (B.x - O.x, B.y - O.y) ;
00172             S.Angle (v, u) ;
00173             if (defini = S.defini) b = S.d ;
00174           }
00175       }
00176   }
00177 }