001    /*
002     * @(#)MohrPlane.java
003     */
004    
005    import java.awt.*;
006    import javax.swing.*;
007    import java.awt.geom.*;
008    
009    import wc.*;
010    
011    /**
012     * MohrPlane.java - Plano genérico com tensões.
013     *
014     * <p>
015     * Descrição:
016     * <p>
017     * ===============================================================
018     * <p>
019     * Este arquivo contém a definição da classe para planos
020     * genéricos de tensões.
021     * <p>
022     * ===============================================================
023     *
024     * @version    1.0 04/09/2004
025     * @author     Luiz Fernando Martha
026     * @author     Alonso Juvinao Carbono
027     * @author     Anderson Resende Pereira
028     * @author     Fernando Busato Ramires
029     * @author     Paôla Reginal Dalcanal
030     * @author     Ricardo Rodrigues de Araujo  
031     *
032     */
033    public class MohrPlane
034    {
035    
036     /*
037     ** ---------------------------------------------------------------
038     ** Protected instance variables:
039     */
040    
041     /** Seta para desenhar tensões */
042     protected Arrow2D arrow;
043    
044     /** Linha do plano */
045     protected Line2D.Double plane_line;
046    
047     /** Retângulo com corpo do plano */
048     protected Rectangle2D.Double plane_body;
049    
050     /** Linha da face do plano */
051     protected Line2D.Double plane_face;
052    
053     /** Transformação afim que faz a rotação em torno do polo */
054     protected AffineTransform rot_transf;
055    
056     /** Transformação window-viewport corrent */
057     protected AffineTransform def_transf;
058    
059     /** Disco do plano  */
060     protected Ellipse2D.Double plane_disk;
061    
062     /** Linha do offset do plano */
063     protected Line2D.Double offset_line;
064      
065     /*
066     ** ---------------------------------------------------------------
067     ** Public methods: 
068     */
069    
070     /*=======================  Constructor  =========================*/
071     /**
072      * Cria um objeto MohrPlane.
073      */
074     public MohrPlane( )
075     {
076      arrow = new Arrow2D( );
077      plane_line = new Line2D.Double( );
078      plane_body = new Rectangle2D.Double( );
079      plane_face = new Line2D.Double( );
080      rot_transf = new AffineTransform( );
081      plane_disk = new Ellipse2D.Double( );
082      offset_line = new Line2D.Double( );
083     }
084    
085     /*========================  DrawPlane  =========================*/
086     /**
087      * Desenha as tensões no plano de acordo com os dados fornecidos.
088      */
089     public void DrawPlane( CanvasWC canvas, Graphics2D g, Color c,
090                            double center,
091                            double polex, double poley,
092                            double sig, double tau,
093                            String s_sig, String s_tau,
094                            double offset, double arrow_len,
095                            BasicStroke arrow_stroke, BasicStroke line_stroke,
096                            BasicStroke face_stroke, double disk_size )
097     {
098      double len;
099      double radius;
100      double sin_a;
101      double cos_a;
102      double x;
103      double y;
104      double shift;
105      double pi = Math.PI;
106      double fact = arrow_len/8.0;
107      len = Math.sqrt( (sig-polex)*(sig-polex) + (tau-poley)*(tau-poley) );
108    
109      if( len < 0.001 )
110      {
111       radius = Math.sqrt( (polex-center)*(polex-center) + (poley*poley) );
112       cos_a = -poley / radius;
113       sin_a = (polex-center) / radius;
114      }
115      else
116      {
117       sin_a = (tau-poley) / len;
118       cos_a = (sig-polex) / len;
119      }
120    
121      rot_transf.setTransform( cos_a, sin_a, -sin_a, cos_a, 0.0, 0.0 );
122    
123      def_transf = g.getTransform();
124      AffineTransform curr_transf = g.getTransform();
125    
126      curr_transf.translate( polex, poley );
127      curr_transf.concatenate( rot_transf );
128      curr_transf.translate( -polex, -poley );
129      g.setTransform( curr_transf );
130    
131      if( len < (4.0*offset) )
132       shift = 4.0 * offset;
133      else
134       shift = len;
135    
136      g.setColor( Color.gray.brighter() );
137      g.setStroke( face_stroke );
138      offset_line.setLine( polex+len, poley, polex+shift+offset, poley );
139      g.draw( offset_line );
140    
141      g.setColor( c );
142      g.setStroke( arrow_stroke );
143    
144      x = polex + shift + offset;
145      y = poley;
146      plane_body.setFrame( x, y - (arrow_len/2.0), (2.0*fact), arrow_len );
147      g.fill( plane_body );
148     
149      if( Math.abs( sig ) > 0.01 )
150      {
151       x = polex + shift + offset + (3.0*fact);
152       y = poley;
153       if( sig > 0.0 )
154        arrow.DrawArrow( g, x, y, 0.0, arrow_len/2.0, Arrow2D.SIDE_LEAD, 
155                         pi/4.0, arrow_len/6.0 );
156       else if( sig < 0.0 )
157        arrow.DrawArrow( g, x, y, 0.0, arrow_len/2.0, Arrow2D.SIDE_TRAIL, 
158                        pi/4.0, arrow_len/6.0 );
159      }
160    
161      if( Math.abs( tau ) > 0.01 )
162      {
163       x = polex + shift + offset + (2.0*fact) + (fact/1.5);
164       y = poley - arrow_len/2.0;
165       if( tau > 0.0 ) 
166        arrow.DrawArrow( g, x, y, pi/2, arrow_len, Arrow2D.SIDE_TRAIL_RIGHT, 
167                         pi/4.0, arrow_len/6.0 );
168       else if ( tau < 0.0 )
169        arrow.DrawArrow( g, x, y, pi/2, arrow_len, Arrow2D.SIDE_LEAD_RIGHT, 
170                         pi/4.0, arrow_len/6.0 );
171      }
172    
173      g.setColor( Color.black );
174      g.setStroke( face_stroke );
175      canvas.setTextAlignment( CanvasWC.CENTER );
176    
177      x = polex + shift + offset + (2.0*fact);
178      y = poley;
179      plane_face.setLine( x, y - (arrow_len/2.0), x, y + (arrow_len/2.0) );
180      g.draw( plane_face );
181    
182      if( Math.abs( sig ) > 0.01 )
183      {
184       x = polex + shift + offset + (arrow_len/2.0) + (5.5*fact);
185       y = poley;
186       canvas.drawString( s_sig, x, y );
187      }
188    
189      if( Math.abs( tau ) > 0.01 )
190      {
191       if( tau > 0 )
192       {
193        x = polex + shift + offset + (4.5*fact);
194        y = poley - (arrow_len/2.0) - (1.5*fact);
195        canvas.drawString( s_tau, x, y );
196       }
197       else if( tau < 0 )
198       {
199        x = polex + shift + offset + (4.5*fact);
200        y = poley + (arrow_len/2.0) + (1.5*fact);
201        canvas.drawString( s_tau, x, y );
202       }
203      }
204    
205      g.setTransform( def_transf );
206    
207      g.setColor( c );
208      g.setStroke( line_stroke );
209    
210      plane_line.setLine( polex, poley, sig, tau );
211      g.draw( plane_line );
212      plane_disk.setFrame( sig - (disk_size*0.5), tau - (disk_size*0.5),
213                          disk_size, disk_size );
214      g.fill(plane_disk);
215       
216      g.setColor( Color.black );
217      g.setStroke( face_stroke );
218      plane_disk.setFrame( sig - (disk_size*0.5), tau - (disk_size*0.5),
219                           disk_size, disk_size);
220      g.draw(plane_disk);
221     }
222    
223    }