2010-11-06 4 views
10

alt text Может ли кто-нибудь вести меня, как закодировать линию стрелок в другом направлении. wa и wl положительно, прямоугольник будет сверху оси x. Ниже приведен пример, если wl отрицательный, а wa - положительный. В приведенном ниже коде показано, как я кодирую форму прямоугольника. x1 - это переменная, которая должна начинаться с оси x. e1 - длина формы, wa1 и wl1 - высота. wsign для определения высоты wa1 или wl1 должен отображаться с отрицательной стороны или с положительной стороны.Рисование строки со стрелкой в ​​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

Это слишком быстро для меня))). Что вы подразумеваете под «нарисовать линию между формой и направлением стрелки»? –

+0

Можете ли вы аннотировать диаграмму кругом, чтобы показать, какую строку вы имеете в виду? –

+0

Привет, спасибо за ответ, я хочу нарисовать линию со стрелкой внутри формы треугольника, один показан в положительной области другой показан на отрицательной области – user236501

ответ

26

Вот простая процедура (принята из here) для рисования произвольных стрелок:

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); 
    } 
} 

Результат:

enter image description here

+0

Привет, спасибо за ваш пример, но как я могу установить высоту линии в соответствии с wa1 и wl1 – user236501

+0

Привет, может быть, вы можете посоветовать мне, как получить x, когда точка y = 0, как показано на диаграмме? – user236501

+0

отличный ответ, но я не могу опустить голову, чтобы вы могли смещать стрелку, например, вторая координата - это центр круга, как бы я его изменил, чтобы стрелка указывала на окружность круг в отличие от центра? –

2

Простой стрелка образец

/** 
* @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; 
    } 
Смежные вопросы