7

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

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

我事先知道我想在哪些位置画刻度线。

线条可以在任何位置,因此必须以相对于线条本身的角度绘制刻度。

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

4

3 回答 3

12

我建议你

  1. 实现从左到右绘制简单水平标尺的标尺绘图方法
  2. 使用 找出所需的角度Math.atan2
  3. 在调用标尺绘图方法之前应用AffineTransform平移和旋转。

这是一个完整的测试程序。(该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);
    }
}

在此处输入图像描述

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

于 2010-08-15T17:39:05.837 回答
1

需要注意的事项:

  • 一条垂直线的斜率为 -1/oldslope。
  • 为了支持任何方向的线,您需要参数化地进行
  • 因此,您在原始线上有 dy 和 dx,这意味着newdx=dy; newdy=-1*dx.
  • 如果你有它<dx, dy>是一个单位向量(sqrt(dx*dx+dy+dy)==1,或dx==cos(theta); dy=sin(theta)一些 theta ),那么你只需要知道你想要的刻度线相距多远。
  • sx, sy 是你的起点 x 和 y
  • length 是线的长度
  • seglength 是破折号的长度
  • dx, dy 是原线的斜率
  • newdx, newdy 是交叉线的(上面计算的)斜率

因此,

  1. <sx,sy>从(start x,y)画一条线到<sx+dx*length,sy+dy*length>
  2. 画一组线 (for(i=0;i<=length;i+=interval) from <sx+dx*i-newdx*seglength/2,sy+dy*i-newdy*seglength/2>to<sx+dx*i+newdx*seglength/2,sy+dy*i+newdy*seglength/2>
于 2010-08-15T17:51:13.727 回答
1

我希望你知道矩阵乘法。为了旋转一条线,您需要通过旋转矩阵将其倍数。(我不能画出合适的矩阵,但假设两条线都没有分开)

|x'| = |cos(an) -sin(an)| |x|

|y`| = |sin(an)  cos(an)| |y|

旧点是 x,y,新点是 x',y'。让我们通过一个例子来说明,假设你有一条从 (0,0) 到 (0,1) 的垂直线,现在你想将它旋转 90 度。(0,0) 将保持为零,所以让我们看看 (0,1) 会发生什么

|x'| = |cos(90) -sin(90)| |0|

|y`| = |sin(90)  cos(90)| |1|

==

|1 0| |0|

|0 1| |1|

==

| 1*0 + 0*1|

| 0*0 + 1*1|

== |0|

   |1|

(0,0),(0,1)你会像你期望的那样到达水平线。

希望它有帮助,
罗尼

于 2010-08-15T18:50:55.283 回答