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