2010-11-06 152 views
10

alt text任何人都可以引导我如何在不同的方向编码箭头线。 wa和wl是正的,矩形将位于x轴的顶部。下面的例子显示了wl是否定的,wa是正的。下面的代码显示了我如何编码矩形形状。 x1是可变的状态以指示从x轴开始的位置。 e1是形状的长度,wa1和wl1是高度。设定高度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

这对我来说太快了)))。 “在形状和箭头方向之间画线”是什么意思? – 2010-11-06 10:32:01

+0

你可以用圆圈标注你的图表,以显示你的意思? – 2010-11-06 10:44:26

+0

嗨,谢谢你的回复,我想绘制带有箭头的三角形内的线,其中一个显示在正面区域另一个显示在负面区域 – user236501 2010-11-06 11:05:36

回答

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 2010-11-06 12:14:14

+0

嗨,也许你可以指导我如何获得x点y = 0时,如图所示? – user236501 2010-11-06 12:21:52

+0

伟大的答案,但我不能让我的头周围,你会给箭头一个偏移量,例如,我第二个坐标是一个圆的中心,我将如何改变它,使箭头指向圆周圆圈与中心相对吗? – 2017-02-27 11:08:14

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