Java - 画一把尺子(带有90度角刻度线的线)
我正在使用 Java AWT 在面板上绘制线条(Line2D
和 Graphics2D.drawLine()
),我想知道如何绘制带有刻度线的线条,类似于:
|----|----|----|----|----|
我提前知道我想要绘制刻度线的位置。
这些线可以位于任何位置,因此必须以相对于线本身的角度绘制刻度。
我的基本几何和在 Java 中应用它的能力让我失望。 :)
I'm using Java AWT to draw lines on a panel (Line2D
and Graphics2D.drawLine()
) and I'm wondering how I can draw a line with tick marks, similar to:
|----|----|----|----|----|
I know the positions I'd like to draw the ticks at in advance.
The lines could be in any position, so the ticks must be drawn at an angle releative to the line itself.
My basic geometry & ability to apply it in Java is failing me. :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我建议您
Math.atan2
。AffineTransform
在调用标尺绘制方法之前进行平移和旋转。这是一个完整的测试程序。
Graphics.create
方法用于创建原始图形对象的副本,因此我们不会弄乱原始转换。)( net/zjZgf.png" alt="在此处输入图像描述">
请注意,您可以轻松地在刻度上方绘制数字。绘制字符串调用将经历相同的转换,并沿线很好地“倾斜”。
I suggest you
Math.atan2
.AffineTransform
with translation and rotation before invoking the ruler-drawing-method.Here is a complete test-program. (The
Graphics.create
method is used to create a copy of the original graphics object, so we don't mess up the original transform.)Note, that you could just as easily draw numbers above the ticks. The drawString-calls would go through the same transformation and get nicely "tilted" along the line.
需要注意的是:
是一个单位向量(sqrt(dx*dx+dy+dy)==1
,或dx ==cos(theta); dy=sin(theta)
对于某些 theta),您只需要知道您想要刻度线的距离。因此,
(开始 x,y)到
到Things that need noting:
newdx=dy; newdy=-1*dx
.<dx, dy>
is a unit vector (sqrt(dx*dx+dy+dy)==1
, ordx==cos(theta); dy=sin(theta)
for some theta), you then just need to know how far apart you want the tick marks.Thus,
<sx,sy>
(start x,y) to<sx+dx*length,sy+dy*length>
<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>
我希望你知道矩阵乘法。为了旋转一条线,您需要将其乘以旋转矩阵。 (我无法绘制正确的矩阵,但假设两条线都没有分开)
旧点是 x,y,新点是 x',y'。让我们通过一个例子来说明,假设你有一条从 (0,0) 到 (0,1) 的垂直线,现在你想将它旋转 90 度。 (0,0) 将保持为零,所以让我们看看 (0,1)
==
==
会发生什么,就像你一样到达水平线
(0,0),(0,1)
预计。希望有帮助,
罗尼
I hope you know matrix multiplication. In order to rotate a line you need to multiple it by rotation matrix. (I coudln't draw a proper matrix but assume both line are not separated)
The old points are x,y and the new is x',y'. Let us illustrate by an example, lets say you have a vertical line from (0,0) to (0,1), now you want to rotate it by 90 degrees. (0,0) will remain zero so lets just see what happens to (0,1)
==
==
you get to horizontal line
(0,0),(0,1)
like you would expect.Hope it helps,
Roni