001    /*
002     * @(#)MohrPrincipalStrsCanvas.java
003     */
004    
005    import java.awt.*;
006    import java.awt.geom.*;
007    import java.awt.event.*;
008    import java.text.*;
009    
010    import wc.*;
011    
012    /**
013     * MohrPrincipalStrsCanvas.java - Desenha o estado de tensões.
014     *
015     * <p>
016     * Descrição:
017     * <p>
018     * ===============================================================
019     * <p>
020     * Este arquivo contém a classe que desenha e manipula o 
021     * estado de tensões principais.
022     *
023     * <p>
024     * ===============================================================
025     *
026     * @version    1.0 04/09/2004
027     * @author     Luiz Fernando Martha
028     * @author     Alonso Juvinao Carbono
029     * @author     Anderson Resende Pereira
030     * @author     Fernando Busato Ramires
031     * @author     Paôla Reginal Dalcanal
032     * @author     Ricardo Rodrigues de Araujo  
033     *
034     */
035    class MohrPrincipalStrsCanvas extends CanvasWC
036    {
037     /** Driver do programa Mohr-Circle */
038     protected MohrDriver driver;
039    
040     /** Quadrado  */
041     protected Rectangle2D.Double quad;
042     
043     /** Fator de proporção em relação ao tamanho horizontal da janela
044      *  em coordenadas do mundo para stroke básico do quadrado */
045     protected static final double QUAD_STROKE_FAC = 0.005;
046    
047     /** Objeto seta para desenhar tensões */
048     protected Arrow2D arrow;
049    
050     /** Fator de proporção em relação ao tamanho horizontal da janela
051      *  em coordenadas do mundo para stroke básico das setas */
052     protected static final double ARROW_STROKE_FAC = 0.010;
053    
054     /** Stroke básico dos eixos */
055     protected BasicStroke arrow_stroke;
056    
057     /** Stroke básico do quadrado */
058     protected BasicStroke quad_stroke;
059    
060     /** Objeto arco para desenhar ângulos */
061     protected MohrArc arc;
062    
063     /** Objeto linha para desenho de linhas auxiliares */
064    
065     protected Line2D.Double auxline;
066    
067     /** Fator de proporção em relação ao tamanho horizontal da janela
068      *  em coordenadas do mundo para stroke básico das linhas auxiliares */
069     protected static final double AUXLINE_STROKE_FAC = 0.010;
070    
071     /** Stroke básico das linhas auxiliares */
072     protected BasicStroke auxline_stroke;
073    
074     /** Transformação window-viewport corrent */
075     protected AffineTransform def_transf;
076    
077     /** Fonte adotado para desenho */
078     protected Font fnt;
079    
080    
081    /*==========================  Constructor  =========================*/
082    /**
083      * Constructor: Especifica eixo Y no sentido para cima.
084      */
085     MohrPrincipalStrsCanvas( MohrDriver driver )
086     {
087      super( UPWARD_Y );
088      this.driver = driver;
089    
090      double xmin = 0.0;
091      double xmax = 600.0;
092      double ymin = 0.0;
093      double ymax = 600.0;
094      
095      double aresta = xmax/3.0;
096      double centro = xmax/2.0;
097      
098      setWorld( xmin, xmax, ymin, ymax );
099    
100      quad = new Rectangle2D.Double( centro - (aresta/2), centro - (aresta/2), 
101                                     aresta, aresta);
102      quad_stroke = new BasicStroke( 
103                                   (float)(world_area.height*QUAD_STROKE_FAC) );
104      arrow = new Arrow2D();
105      arrow_stroke = new BasicStroke( 
106                                   (float)(world_area.height*ARROW_STROKE_FAC) );
107    
108      arc = new MohrArc( );
109    
110      auxline = new Line2D.Double( );
111      auxline_stroke = new BasicStroke(
112                                (float)(world_area.height*AUXLINE_STROKE_FAC) );
113    
114      def_transf = new AffineTransform( );
115    
116      fnt = new Font( "Times New Roman", Font.ITALIC, 14 );
117     }
118    
119     /*
120     ** ---------------------------------------------------------------
121     ** Private and Protected methods: 
122     */
123     
124    
125     /*
126     ** ---------------------------------------------------------------
127     ** Public methods: 
128     */
129    
130    /*===============================  update  ==============================*/
131    /**
132      * Reset method.
133      */
134     void update()
135     {
136      
137      double xmin = 0.0;
138      double xmax = 600.0;
139      double ymin = 0.0;
140      double ymax = 600.0;
141      
142      double aresta = xmax/3.0;
143      double centro = xmax/2.0;
144      
145      setWorld( xmin, xmax, ymin, ymax );
146    
147      quad.setFrame( centro - (aresta/2), centro - (aresta/2), aresta, aresta );
148      
149    
150      quad_stroke = new BasicStroke( 
151                                   (float)(world_area.height*QUAD_STROKE_FAC) );
152    
153      arrow_stroke = new BasicStroke( 
154                                   (float)(world_area.height*ARROW_STROKE_FAC) );
155    
156      auxline_stroke = new BasicStroke(
157                                (float)(world_area.height*AUXLINE_STROKE_FAC) );
158    
159      repaint();
160     }
161    
162    /*===============================  redraw  =============================*/
163     /**
164      * Redisplay method.
165      * This method is called every time the canvas is updated.
166      * Client's concrete class must implement it.
167      * @param g is the 2D graphics context that the client uses to display
168      */
169     public void redraw( Graphics2D g )
170     {
171      double pi = Math.PI;
172    
173      double xmin = world_area.x;
174      double xmax = world_area.x + world_area.width;
175      double ymin = world_area.y;
176      double ymax = world_area.y + world_area.height;
177    
178      double aresta = (ymax-ymin)/3.0;
179      double centro = (xmax+xmin)/2.0;
180      
181      double fact = aresta/8.0;
182      
183      double x = centro;
184      double y = centro;
185    
186      double sin_a;
187      double cos_a;
188    
189      g.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
190                          RenderingHints.VALUE_ANTIALIAS_ON );
191    
192      g.setFont( fnt );
193    
194      /* Desenha arco com ângulo */
195      if( driver.getSolver().ThetaP() > 0.2 )
196      {
197       g.setColor( Color.gray.brighter() );
198       g.setStroke( auxline_stroke );
199       auxline.setLine( centro + 0.5*aresta, centro, centro + 0.9*aresta, centro );
200       g.draw( auxline );
201       cos_a = Math.cos( driver.getSolver().ThetaP() );
202       sin_a = Math.sin( driver.getSolver().ThetaP() );
203       arc.DrawArc( this, g, Color.gray.brighter(),
204                    centro, centro, centro + aresta, centro,
205                    centro + aresta*cos_a, centro + aresta*sin_a,
206                    0.8*aresta, "\u03B8p", 1.5*fact, auxline_stroke );
207      }
208    
209      /* Ajusta transformação de rotação */
210      def_transf = g.getTransform();
211      AffineTransform curr_transf = g.getTransform();
212    
213      curr_transf.translate( centro, centro );
214      curr_transf.rotate( driver.getSolver().ThetaP() );
215      curr_transf.translate( -centro, -centro );
216      g.setTransform( curr_transf );
217    
218      g.setColor( Color.white );
219      g.fill( quad );
220      g.setColor( Color.black );
221      g.draw( quad );
222      
223      /* Desenha Sigma 1 */
224      if( Math.abs( driver.getSolver().Sigma1() ) > 0.01 )
225      {
226       g.setColor( Color.red );
227       g.setStroke( arrow_stroke );
228       if( driver.getSolver().Sigma1() > 0 )
229       {
230        x = centro + (aresta/2.0) + fact;
231        y = centro;
232        arrow.DrawArrow( g, x, y, 0, aresta/2.0, Arrow2D.SIDE_LEAD, 
233                         pi/4.0, aresta/10.0 );
234               
235        x = centro - (aresta/2.0) - fact;
236        y = centro;
237        arrow.DrawArrow( g, x, y, pi, aresta/2.0, Arrow2D.SIDE_LEAD, 
238                         pi/4.0, aresta/10.0 );
239       }
240       else if( driver.getSolver().Sigma1() < 0 )
241       {
242        x = centro + (aresta/2.0) + fact;
243        y = centro;
244        arrow.DrawArrow( g, x, y, 0, aresta/2.0, Arrow2D.SIDE_TRAIL, 
245                         pi/4.0, aresta/10.0 );
246       
247        x = centro - (aresta/2.0) - fact;
248        y = centro;
249        arrow.DrawArrow( g, x, y, pi, aresta/2.0, Arrow2D.SIDE_TRAIL, 
250                         pi/4.0, aresta/10.0 );
251       }
252      }
253    
254      /* Desenha Sigma 2 */
255      if( Math.abs( driver.getSolver().Sigma2() ) > 0.01 )
256      {
257       g.setColor( Color.red.darker() );
258       g.setStroke( arrow_stroke );
259       if( driver.getSolver().Sigma2() > 0 )
260       {
261        x = centro;
262        y = centro + (aresta/2.0) + fact;
263        arrow.DrawArrow( g, x, y, pi/2, aresta/2.0, Arrow2D.SIDE_LEAD, 
264                         pi/4.0, aresta/10.0 );
265       
266        x = centro;
267        y = centro - (aresta/2.0) - fact;
268        arrow.DrawArrow( g, x, y, 3*pi/2, aresta/2.0, Arrow2D.SIDE_LEAD, 
269                         pi/4.0, aresta/10.0 );
270       }
271       else if( driver.getSolver().Sigma2() < 0 )
272       {
273        x = centro;
274        y = centro + (aresta/2.0) + fact;
275        arrow.DrawArrow( g, x, y, pi/2, aresta/2.0, Arrow2D.SIDE_TRAIL, 
276                         pi/4.0, aresta/10.0 );
277       
278        x = centro;
279        y = centro - (aresta/2.0) - fact;
280        arrow.DrawArrow( g, x, y, 3*pi/2, aresta/2.0, Arrow2D.SIDE_TRAIL, 
281                         pi/4.0, aresta/10.0 );
282       }
283      }
284    
285      g.setColor( Color.black );
286      setTextAlignment( CENTER );
287      if( Math.abs( driver.getSolver().Sigma1() ) > 0.01 )
288      {
289       drawString( "\u03C31", centro + aresta + (2.5*fact), centro );
290       drawString( "\u03C31", centro - (aresta + (2.5*fact)), centro );
291      }
292      if( Math.abs( driver.getSolver().Sigma2() ) > 0.01 )
293      {
294       drawString( "\u03C32", centro, centro + aresta + (2.5*fact) );
295       drawString( "\u03C32", centro, centro - (aresta + (2.5*fact)) );
296      }
297    
298      g.setTransform( def_transf );
299     }
300    
301     /**
302      * Handles the event of the user pressing down the mouse button.
303      */
304     public void mousePressedWC( MouseEvent e, Point2D.Double mouse_pos )
305     {
306     }
307    
308     /**
309      * Handles the event of a user dragging the mouse while holding 
310      * down the mouse button.
311      */
312     public void mouseDraggedWC( MouseEvent e, Point2D.Double mouse_pos )
313     {
314     }
315    
316     /**
317      * Handles the event of a user releasing the mouse button.
318      */
319      public void mouseReleasedWC( MouseEvent e, Point2D.Double mouse_pos )
320     {
321     }
322    }
323