2010-11-06 162 views
10

alt text ¿Alguien me puede guiar cómo codificar la línea de flecha en una dirección diferente? wa y wl es positivo, el rectángulo estará en la parte superior del eje x. El ejemplo siguiente se muestra si wl es negativo y wa es positivo. El siguiente código muestra cómo codigo la forma del rectángulo. x1 es el vaiverable de indicar dónde comenzar en el eje x. e1 es la longitud de la forma, wa1 y wl1 es la altura. wsign para determinar la altura wa1 o wl1 debe mostrar en el lado negativo o positivo.Dibujando una línea con flecha en Java

 if (Math.abs(wl1) > Math.abs(wa1)) { 
      y_scale = (load_y0 - 40)/(double) Math.abs(wl1); 
     } else { 
      y_scale = (load_y0 - 40)/(double) Math.abs(wa1); 
     } 
     g.drawLine((int) ((double) x0 + x1 * x_scale), (int) (load_y), 
        (int) ((double) x0 + x1 * x_scale), 
        (int) (load_y + (wa1 * y_scale) * -1)); 
      g.drawLine((int) ((double) x0 + (x1 + e1) * x_scale), 
        (int) (load_y), (int) ((double) x0 + (x1 + e1) 
          * x_scale), (int) (load_y + (wl1 * y_scale) 
          * -1)); 

      g.drawLine((int) ((double) x0 + x1 * x_scale), 
        (int) (load_y + (wa1 * y_scale * -1)), 
        (int) ((double) x0 + (x1 + e1) * x_scale), 
        (int) (load_y + (wl1 * y_scale) * -1)); 
+0

Eso es demasiado rápido para mí))). ¿A qué te refieres con "dibujar la línea entre la forma y la dirección de la flecha"? –

+0

¿Puedes anotar tu diagrama con un círculo para mostrar a qué línea te refieres? –

+0

Hola, gracias por responder, quiero dibujar la línea con la flecha dentro de la forma del triángulo, una se muestra en el área positiva, otra se muestra en el área negativa – user236501

Respuesta

26

Aquí es una rutina simple (adoptado de here) para dibujar flechas arbitrarias:

import static java.awt.geom.AffineTransform.*; 
import java.awt.*; 
import java.awt.geom.AffineTransform; 
import javax.swing.*; 

public class Main { 
    public static void main(String args[]) { 
     JFrame t = new JFrame(); 
     t.add(new JComponent() { 

      private final int ARR_SIZE = 4; 

      void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) { 
       Graphics2D g = (Graphics2D) g1.create(); 

       double dx = x2 - x1, dy = y2 - y1; 
       double angle = Math.atan2(dy, dx); 
       int len = (int) Math.sqrt(dx*dx + dy*dy); 
       AffineTransform at = AffineTransform.getTranslateInstance(x1, y1); 
       at.concatenate(AffineTransform.getRotateInstance(angle)); 
       g.transform(at); 

       // Draw horizontal arrow starting in (0, 0) 
       g.drawLine(0, 0, len, 0); 
       g.fillPolygon(new int[] {len, len-ARR_SIZE, len-ARR_SIZE, len}, 
           new int[] {0, -ARR_SIZE, ARR_SIZE, 0}, 4); 
      } 

      public void paintComponent(Graphics g) { 
       for (int x = 15; x < 200; x += 16) 
        drawArrow(g, x, x, x, 150); 
       drawArrow(g, 30, 300, 300, 190); 
      } 
     }); 

     t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     t.setSize(400, 400); 
     t.setVisible(true); 
    } 
} 

Resultado:

enter image description here

+0

Hola, gracias por su ejemplo, pero ¿cómo puedo establecer la altura de la línea de acuerdo con wa1 y wl1 – user236501

+0

Hola tal vez me puede guiar cómo obtener x cuando el punto y = 0 como se muestra en el diagrama? – user236501

+0

excelente respuesta, pero no entiendo qué es lo que se debe hacer para dar a la flecha un desplazamiento, por ejemplo, mi segunda coordenada es el centro de un círculo, ¿cómo la cambiaría para que la flecha señale la circunferencia de el círculo en oposición al centro? –

2

muestra de la flecha simple

/** 
* @param fromPoint end of the arrow 
* @param rotationDeg rotation angle of line 
* @param length arrow length 
* @param wingsAngleDeg wingspan of arrow 
* @return Path2D arrow shape 
*/ 
public static Path2D createArrowForLine(
       Point2D fromPoint, 
       double rotationDeg, 
       double length, 
       double wingsAngleDeg) { 

     double ax = fromPoint.getX(); 
     double ay = fromPoint.getY(); 

     double radB = Math.toRadians(-rotationDeg + wingsAngleDeg); 
     double radC = Math.toRadians(-rotationDeg - wingsAngleDeg); 

     Path2D resultPath = new Path2D.Double(); 
     resultPath.moveTo(length * Math.cos(radB) + ax, length * Math.sin(radB) + ay); 
     resultPath.lineTo(ax, ay); 
     resultPath.lineTo(length * Math.cos(radC) + ax, length * Math.sin(radC) + ay); 
     return resultPath; 
    } 
Cuestiones relacionadas