001    /*
002     * @(#)MohrArc.java
003     */
004    
005    import java.awt.*;
006    import javax.swing.*;
007    import java.awt.geom.*;
008    
009    import wc.*;
010    
011    /**
012     * MohrArc.java - Desenho de um arco genérico com nome.
013     *
014     * <p>
015     * Descrição:
016     * <p>
017     * ===============================================================
018     * <p>
019     * Este arquivo contém a definição da classe para um arco
020     * genérico com nome para desenhar em um canvas.
021     *
022     * A função de desenho recebe a seguinte informação para 
023     * desenho:
024     *
025     * - Centro do arco
026     * - Ponto que define ângulo inicial
027     * - Ponto que define ângulo final
028     * - Raio do arco
029     * - String com texto do nome
030     * <p>
031     * ===============================================================
032     *
033     * @version    1.0 04/09/2004
034     * @author     Luiz Fernando Martha
035     * @author     Alonso Juvinao Carbono
036     * @author     Anderson Resende Pereira
037     * @author     Fernando Busato Ramires
038     * @author     Paôla Reginal Dalcanal
039     * @author     Ricardo Rodrigues de Araujo  
040     *
041     */
042    public class MohrArc
043    {
044    
045     /*
046     ** ---------------------------------------------------------------
047     ** Protected instance variables:
048     */
049    
050     /** Objeto arco */
051     protected Arc2D.Double arc;
052    
053      
054     /*
055     ** ---------------------------------------------------------------
056     ** Public methods: 
057     */
058    
059     /*=======================  Constructor  =========================*/
060     /**
061      * Cria um objeto MohrPlane.
062      */
063     public MohrArc( )
064     {
065      arc = new Arc2D.Double( );
066     }
067    
068    /*=============================  getAng  =========================*/
069    /**
070     * Esta função retorna o valor do ângulo em radianos que a linha 
071     * (x-xc,y-yc) faz com a horizontal.
072     */
073     protected static double getAng( double xc, double yc, double x, double y )
074     {
075      double   s;
076      double   ang;
077    
078      s = Math.sqrt( (x-xc) * (x-xc) + (y-yc) * (y-yc) );
079      if( s == 0.0 )
080       return( Math.PI/2.0 );
081    
082      ang = Math.atan2( y-yc, x-xc );
083    
084      return( ang );
085     }
086    
087     /*========================  DrawArc  =========================*/
088     /**
089      * Desenha um arco de acordo com os dados fornecidos.
090      * @param centerx - coordenada x do centro do arco
091      * @param centery - coordenada y do centro do arco
092      * @param point0x - coordenada x do ponto que define ângulo inicial
093      * @param point0y - coordenada y do ponto que define ângulo inicial
094      * @param point1x - coordenada x do ponto que define ângulo final
095      * @param point1y - coordenada y do ponto que define ângulo final
096      * @param radius  - raio do arco
097      * @param name    - string com texto do nome
098      */
099     public void DrawArc( CanvasWC canvas, Graphics2D g, Color c,
100                          double centerx, double centery,
101                          double point0x, double point0y,
102                          double point1x, double point1y,
103                          double radius, String name, double shift,
104                          BasicStroke arc_stroke )
105     {
106      double ang0 = getAng( centerx, centery, point0x, point0y );
107      double ang1 = getAng( centerx, centery, point1x, point1y );
108      double diam = radius * 2.0;
109      double angext;
110      double angmid;
111      double sin_a;
112      double cos_a;
113      double x;
114      double y;
115      double pi = Math.PI;
116    
117      if( (ang0 > 0.0) && (ang1 < 0.0) )
118       angext = 2.0*pi + (ang1 - ang0);
119      else if( ang1 < ang0 )
120       angext = 2.0*pi + (ang1 - ang0);
121      else
122       angext = ang1 - ang0;
123      angmid = ang0 + (angext * 0.5);
124    
125      g.setColor( c );
126      g.setStroke( arc_stroke );
127    
128      arc.setArc( centerx-radius, centery-radius, diam, diam, 
129                  -Math.toDegrees( ang0 ), -Math.toDegrees( angext ),
130                  Arc2D.OPEN );
131      g.draw( arc );
132    
133      g.setColor( Color.black );
134      canvas.setTextAlignment( CanvasWC.CENTER );
135      sin_a = Math.sin( angmid );
136      cos_a = Math.cos( angmid );
137      x = centerx + (radius+shift)*cos_a;
138      y = centery + (radius+shift)*sin_a;
139      canvas.drawString( name, x, y );
140     }
141    
142     /*========================  DrawCircle  =========================*/
143     /**
144      * Desenha um circulo completo de acordo com os dados fornecidos.
145      * @param centerx - coordenada x do centro do arco
146      * @param centery - coordenada y do centro do arco
147      * @param point0x - coordenada x do ponto que define ângulo inicial
148      * @param point0y - coordenada y do ponto que define ângulo inicial
149      * @param radius  - raio do arco
150      * @param name    - string com texto do nome
151      */
152     public void DrawCircle( CanvasWC canvas, Graphics2D g, Color c,
153                             double centerx, double centery,
154                             double point0x, double point0y,
155                             double radius, String name, double shift,
156                             BasicStroke arc_stroke )
157     {
158      double ang0 = getAng( centerx, centery, point0x, point0y );
159      double diam = radius * 2.0;
160      double angmid;
161      double sin_a;
162      double cos_a;
163      double x;
164      double y;
165      double pi = Math.PI;
166    
167      angmid = ang0 + pi;
168    
169      g.setColor( c );
170      g.setStroke( arc_stroke );
171    
172      arc.setArc( centerx-radius, centery-radius, diam, diam, 
173                  -Math.toDegrees( ang0 ), -Math.toDegrees( 2.0*pi ),
174                  Arc2D.OPEN );
175      g.draw( arc );
176    
177      g.setColor( Color.black );
178      canvas.setTextAlignment( CanvasWC.CENTER );
179      sin_a = Math.sin( angmid );
180      cos_a = Math.cos( angmid );
181      x = centerx + (radius+shift)*cos_a;
182      y = centery + (radius+shift)*sin_a;
183      canvas.drawString( name, x, y );
184     }
185    
186    }