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

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

| —- | —- | —- | —- | —- |

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

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

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

我建议你

  1. 实现一个标尺绘图方法,从左到右绘制一个简单的水平标尺
  2. 使用Math.atan2出所需的角度。
  3. 在调用ruler-drawing-method之前应用具有平移和旋转的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调用将经历相同的转换,并沿着该线很好地“倾斜”。

需要注意的事项:

  • 垂直线的斜率为-1 / oldslope。
  • 为了支持任何方向的线,您需要以参数方式进行
  • 因此,你在原始行上有dy和dx,这意味着newdx=dy; newdy=-1*dx newdx=dy; newdy=-1*dx
  • 如果你有这样的是一个单位向量( sqrt(dx*dx+dy+dy)==1 ,或者dx==cos(theta); dy=sin(theta)对于某些theta, dx==cos(theta); dy=sin(theta) ),然后你只需要知道你想要刻度线的距离。
  • sx,sy是你的开始x和y
  • 长度是线的长度
  • seglength是破折号的长度
  • dx,dy是原始线的斜率
  • newdx,newdy是交叉线的(上面计算的)斜率

从而,

  1. (start x,y)到画一条线
  2. 绘制一组线(对于(i = 0; i <=长度; i + =间隔),从

我希望你知道矩阵乘法。 要旋转一条线,您需要通过旋转矩阵对其进行多次旋转。 (我没有绘制一个合适的矩阵,但假设两条线都没有分开)

 |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)就像你期望的那样。

希望能帮助到你,
罗尼