【问题标题】:Drawing a line with arrow in Java在Java中画一条带箭头的线
【发布时间】:2011-05-05 23:46:23
【问题描述】:

谁能指导我如何编码不同方向的箭头线。 wa 和 wl 为正,矩形将位于 x 轴的顶部。下面的示例显示了 wl 为负数且 wa 为正数的情况。下面的代码显示了我如何对矩形进行编码。 x1 是表示从 x 轴开始的变量。 e1 是形状的长度,wa1 和 wl1 是高度。 wsign 确定高度 wa1 或 wl1 应显示在负侧或正侧。

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

【问题讨论】:

  • 这对我来说太快了)))。 “在形状和箭头方向之间画线”是什么意思?
  • 你能用圆圈注释你的图表以显示你指的是哪条线吗?
  • 您好,谢谢您的回复,我想在三角形内画带箭头的线,一个显示在正区域,另一个显示在负区域
  • 嗨,也许你能指导我如何在点 y = 0 时得到 x,如图所示?

标签: java graphics awt


【解决方案1】:

这是一个简单的例程(取自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);
    }
}

结果:

【讨论】:

  • 嗨,谢谢你的例子,但是如何根据 wa1 和 wl1 设置行的高度
  • 嗨,也许你能指导我如何在点 y = 0 时得到 x,如图所示?
  • 很好的答案,但我无法理解你想要给箭头一个偏移量,例如,我的第二个坐标是圆心,我将如何改变它箭头指向圆的圆周而不是圆心?
  • 箭头绘制代码很简单。这是// Draw horizontal arrow starting in (0, 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-05-09
    • 2013-12-25
    相关资源
    最近更新 更多