001    /*
002     * @(#)MohrStateStrsCanvas.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     * MohrStateStrsCanvas.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.
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 MohrStateStrsCanvas 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     /** Fonte adotado para desenho */
061     protected Font fnt;
062    
063    
064    /*==========================  Constructor  =========================*/
065    /**
066      * Constructor: Especifica eixo Y no sentido para cima.
067      */
068     MohrStateStrsCanvas( MohrDriver driver )
069     {
070      super( UPWARD_Y );
071      this.driver = driver;
072    
073      double xmin = 0.0;
074      double xmax = 600;
075      double ymin = 0.0;
076      double ymax = 600;
077      
078      double aresta = xmax/3.0;
079      double centro = xmax/2.0;
080      
081      setWorld( xmin, xmax, ymin, ymax );
082    
083      quad = new Rectangle2D.Double( centro - (aresta/2.0), centro - (aresta/2.0), 
084                                     aresta, aresta);
085      quad_stroke = new BasicStroke( 
086                                   (float)(world_area.height*QUAD_STROKE_FAC) );
087      arrow = new Arrow2D();
088      arrow_stroke = new BasicStroke( 
089                                   (float)(world_area.height*ARROW_STROKE_FAC) );
090                                
091      fnt = new Font( "Times New Roman", Font.ITALIC, 14 );
092     }
093    
094     /*
095     ** ---------------------------------------------------------------
096     ** Private and Protected methods: 
097     */
098     
099    
100     /*
101     ** ---------------------------------------------------------------
102     ** Public methods: 
103     */
104    
105    /*===============================  update  ==============================*/
106    /**
107      * Reset method.
108      */
109     void update()
110     {
111      double xmin = 0.0;
112      double xmax = 600;
113      double ymin = 0.0;
114      double ymax = 600;
115      
116      double aresta = xmax/3.0;
117      double centro = xmax/2.0;
118      
119      double fact = aresta/8.0;
120      
121      setWorld( xmin, xmax, ymin, ymax );
122      
123      quad.setFrame( centro - (aresta/2.0), centro - (aresta/2.0), aresta, aresta );
124    
125      quad_stroke = new BasicStroke( 
126                                   (float)(world_area.height*QUAD_STROKE_FAC) );
127    
128      arrow_stroke = new BasicStroke( 
129                                   (float)(world_area.height*ARROW_STROKE_FAC) );
130    
131      repaint();
132     }
133    
134    /*===============================  redraw  =============================*/
135     /**
136      * Redisplay method.
137      * This method is called every time the canvas is updated.
138      * Client's concrete class must implement it.
139      * @param g is the 2D graphics context that the client uses to display
140      */
141     public void redraw( Graphics2D g )
142     {
143      double pi = Math.PI;
144      double xmin = world_area.x;
145      double xmax = world_area.x + world_area.width;
146      double ymin = world_area.y;
147      double ymax = world_area.y + world_area.height;
148    
149      double aresta = (ymax-ymin)/3.0;
150      double centro = (xmax+xmin)/2.0;
151      
152      double fact = aresta/8.0;
153      
154      double x = centro;
155      double y = centro;
156    
157      g.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
158                          RenderingHints.VALUE_ANTIALIAS_ON );
159      
160      g.setFont( fnt );                    
161    
162      g.setColor( Color.white );
163      g.fill( quad );
164      g.setColor( Color.black );
165      g.draw( quad );
166      
167      g.setStroke( arrow_stroke );
168      
169      /* Desenha Sigma X */
170      if( Math.abs( driver.getSolver().getSigmaX() ) > 0.01 )
171      {
172       g.setColor( Color.blue.darker() );
173       if (driver.getSolver().getSigmaX() > 0)
174       {
175        x = centro + (aresta/2.0) + fact;
176        y = centro;
177        arrow.DrawArrow( g, x, y, 0.0, aresta/2.0, 
178                         Arrow2D.SIDE_LEAD, pi/4.0, aresta/10.0 );
179               
180        x = centro - (aresta/2.0) - fact;
181        y = centro;
182        arrow.DrawArrow( g, x, y, pi, aresta/2.0, 
183                         Arrow2D.SIDE_LEAD, pi/4.0, aresta/10.0 );
184       }
185       else if(driver.getSolver().getSigmaX() < 0)
186       {
187        x = centro + (aresta/2.0) + fact;
188        y = centro;
189        arrow.DrawArrow( g, x, y, 0.0, aresta/2.0, 
190                         Arrow2D.SIDE_TRAIL, pi/4.0, aresta/10.0 );
191       
192        x = centro - (aresta/2.0) - fact;
193        y = centro;
194        arrow.DrawArrow( g, x, y, pi, aresta/2.0, 
195                         Arrow2D.SIDE_TRAIL, pi/4.0, aresta/10.0 );
196       }
197      }
198    
199      /* Desenha Sigma Y */
200      if( Math.abs( driver.getSolver().getSigmaY() ) > 0.01 )
201      {
202       g.setColor( Color.blue.brighter() );
203       if (driver.getSolver().getSigmaY() > 0)
204       {
205        x = centro;
206        y = centro + (aresta/2.0) + fact;
207        arrow.DrawArrow( g, x, y, pi/2, aresta/2.0, 
208                         Arrow2D.SIDE_LEAD, pi/4.0, aresta/10.0 );
209       
210        x = centro;
211        y = centro - (aresta/2.0) - fact;
212        arrow.DrawArrow( g, x, y, 3*pi/2, aresta/2.0, 
213                         Arrow2D.SIDE_LEAD, pi/4.0, aresta/10.0 );
214       }
215       else if(driver.getSolver().getSigmaY() < 0)
216       {
217        x = centro;
218        y = centro + (aresta/2.0) + fact;
219        arrow.DrawArrow( g, x, y, pi/2, aresta/2.0, 
220                         Arrow2D.SIDE_TRAIL, pi/4.0, aresta/10.0 );
221       
222        x = centro;
223        y = centro - (aresta/2.0) - fact;
224        arrow.DrawArrow( g, x, y, 3*pi/2, aresta/2.0, 
225                         Arrow2D.SIDE_TRAIL, pi/4.0, aresta/10.0 );
226       }
227      }
228    
229      /* Desenha Tau XY */
230      if( Math.abs( driver.getSolver().getTauXY() ) > 0.01 )
231      {
232       if (driver.getSolver().getTauXY() > 0)
233       {
234        g.setColor( Color.blue.brighter() );         
235        x = centro - (aresta/2.0);
236        y = centro + (aresta/2.0) + (fact/1.5);
237        arrow.DrawArrow( g, x, y, 0.0, aresta, 
238                         Arrow2D.SIDE_LEAD_LEFT, pi/4.0, aresta/10.0 );
239               
240        g.setColor( Color.blue.darker());
241        x = centro + (aresta/2.0) + (fact/1.5);
242        y = centro - (aresta/2.0);
243        arrow.DrawArrow( g, x, y, pi/2, aresta, 
244                         Arrow2D.SIDE_LEAD_RIGHT, pi/4.0, aresta/10.0 );
245               
246        g.setColor( Color.blue.brighter() );
247        x = centro + (aresta/2.0);
248        y = centro - (aresta/2.0) - (fact/1.5);
249        arrow.DrawArrow( g, x, y, pi, aresta, 
250        Arrow2D.SIDE_LEAD_LEFT, pi/4.0, aresta/10.0 );
251           
252        g.setColor( Color.blue.darker() );
253        x = centro - (aresta/2.0) - (fact/1.5);
254        y = centro + (aresta/2.0);
255        arrow.DrawArrow( g, x, y, 3*pi/2, aresta, 
256        Arrow2D.SIDE_LEAD_RIGHT, pi/4.0, aresta/10.0 );
257       }
258       else if(driver.getSolver().getTauXY() < 0)
259       {
260        g.setColor( Color.blue.brighter() );
261        x = centro - (aresta/2.0);
262        y = centro + (aresta/2.0) + (fact/1.5);
263        arrow.DrawArrow( g, x, y, 0.0, aresta, 
264                         Arrow2D.SIDE_TRAIL_LEFT, pi/4.0, aresta/10.0 );
265               
266        g.setColor( Color.blue.darker() );
267        x = centro + (aresta/2.0) + (fact/1.5);
268        y = centro - (aresta/2.0);
269        arrow.DrawArrow( g, x, y, pi/2, aresta, 
270                         Arrow2D.SIDE_TRAIL_RIGHT, pi/4.0, aresta/10.0 );
271               
272        g.setColor( Color.blue.brighter() );
273        x = centro + (aresta/2.0);
274        y = centro - (aresta/2.0) - (fact/1.5);
275        arrow.DrawArrow( g, x, y, pi, aresta, 
276                         Arrow2D.SIDE_TRAIL_LEFT, pi/4.0, aresta/10.0 );
277           
278        g.setColor( Color.blue.darker() );
279        x = centro - (aresta/2.0) - (fact/1.5);
280        y = centro + (aresta/2.0);
281        arrow.DrawArrow( g, x, y, 3*pi/2, aresta, 
282                         Arrow2D.SIDE_TRAIL_RIGHT, pi/4.0, aresta/10.0 );
283       }
284      }
285      
286      g.setColor( Color.black );
287      setTextAlignment( CENTER );
288    
289      if( Math.abs( driver.getSolver().getSigmaX() ) > 0.01 )
290      {
291       drawString( "\u03C3x", centro + aresta + (2.5*fact), centro );
292       drawString( "\u03C3x", centro - (aresta + (2.5*fact)), centro );
293      }
294      
295      if( Math.abs( driver.getSolver().getSigmaY() ) > 0.01 )
296      {
297       drawString( "\u03C3y", centro, centro + aresta + (2.5*fact) );
298       drawString( "\u03C3y", centro, centro - (aresta + (2.5*fact)));
299      }
300    
301      if( Math.abs( driver.getSolver().getTauXY() ) > 0.01 )
302      {
303       if (driver.getSolver().getTauXY() > 0)
304       {
305        drawString( "\u03C4xy", centro + ((aresta/2.0) + (2.5*fact)), 
306                                centro +  (2.0*fact) );
307        drawString( "\u03C4xy", centro +  (2.0*fact), 
308                                centro + ((aresta/2.0) + (2.0*fact)) );
309        drawString( "\u03C4xy", centro - ((aresta/2.0) + (2.5*fact)), 
310                                centro -  (2.0*fact) );
311        drawString( "\u03C4xy", centro -  (2.0*fact), 
312                                centro - ((aresta/2.0) + (2.0*fact)) );
313       }
314       else if(driver.getSolver().getTauXY() < 0)
315       {
316        drawString( "\u03C4xy", centro + ((aresta/2.0) + (2.5*fact)), 
317                                centro -  (2.0*fact) );
318        drawString( "\u03C4xy", centro +  (2.0*fact), 
319                                centro - ((aresta/2.0) + (2.0*fact)) );
320        drawString( "\u03C4xy", centro - ((aresta/2.0) + (2.5*fact)), 
321                                centro +  (2.0*fact) );
322        drawString( "\u03C4xy", centro -  (2.0*fact), 
323                                centro + ((aresta/2.0) + (2.0*fact)) );
324       }
325      }
326     }
327    
328     /**
329      * Handles the event of the user pressing down the mouse button.
330      */
331     public void mousePressedWC( MouseEvent e, Point2D.Double mouse_pos )
332     {
333     }
334    
335     /**
336      * Handles the event of a user dragging the mouse while holding 
337      * down the mouse button.
338      */
339     public void mouseDraggedWC( MouseEvent e, Point2D.Double mouse_pos )
340     {
341     }
342    
343     /**
344      * Handles the event of a user releasing the mouse button.
345      */
346      public void mouseReleasedWC( MouseEvent e, Point2D.Double mouse_pos )
347     {
348     }
349    }
350