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 }