Java - 绘制标尺(带有90度角刻度线的线)

Mat*_*att 7 java graphics swing awt computational-geometry

我正在使用Java AWT在面板上绘制线条(Line2DGraphics2D.drawLine()),我想知道如何绘制带刻度线的线条,类似于:

| ---- | ---- | ---- | ---- | ---- |

我知道我想提前勾选的位置.

线条可以处于任何位置,因此刻度线必须以与线条本身相关的角度绘制.

我的基本几何和在Java中应用它的能力让我失望.:)

aio*_*obe 13

我建议你

  1. 实现一个标尺绘图方法,从左到右绘制一个简单的水平标尺
  2. 使用得出所需的角度Math.atan2.
  3. AffineTransform在调用ruler-drawing-method之前应用带平移和旋转.

这是一个完整的测试程序.(该Graphics.create方法用于创建原始图形对象的副本,因此我们不会弄乱原始变换.)

import java.awt.*;

public class RulerExample {

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

            private final double TICK_DIST = 20;

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

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

                // Draw horizontal ruler starting in (0, 0)
                g.drawLine(0, 0, (int) len, 0);
                for (double i = 0; i < len; i += TICK_DIST)
                    g.drawLine((int) i, -3, (int) i, 3);
            }

            public void paintComponent(Graphics g) {
                drawRuler(g, 10, 30, 300, 150);
                drawRuler(g, 300, 150, 100, 100);
                drawRuler(g, 100, 100, 120, 350);
                drawRuler(g, 50, 350, 350, 50);
            }
        });

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 400);
        f.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,您可以轻松地在刻度线上方绘制数字.drawString调用将经历相同的转换,并沿着该线很好地"倾斜".