Tag: 仿射变换

Java – 子像素线精度是否需要AffineTransform?

我之前从未使用过Java绘图方法,所以我决定深入研究并创建一个模拟时钟作为PoC。 除了手之外,我画了一个钟面,包括刻度标记,分钟/小时。 我使用简单的sin / cos计算来确定圆周线的位置。 但是,我注意到由于分钟刻度非常短,因此线条的角度看起来不对。 我确定这是因为Graphics2D.drawLine()和Line2D.double()方法都无法以子像素精度绘制。 我知道我可以绘制来自中心的线条并用圆圈遮盖它(以创建更长,更准确的线条),但这似乎是一种不优雅且昂贵的解决方案。 我已经做过一些关于如何做到这一点的研究,但我遇到的最好的答案是使用AffineTransform 。 我假设我只能使用带旋转的AffineTransform ,而不必执行超级采样。 这是以亚像素精度绘制的唯一/最佳方法吗? 或者是否有更快的解决方案? 编辑 :我已经将RenderingHint设置为Graphics2D对象。 根据要求,这里有一些代码(没有完全优化,因为这只是一个PoC): diameter = Math.max(Math.min(pnlOuter.getSize().getWidth(), pnlOuter.getSize().getHeight()) – 2, MIN_DIAMETER); for (double radTick = 0d; radTick < 360d; radTick += 6d) { g2d.draw(new Line2D.Double( (diameter / 2) + (Math.cos(Math.toRadians(radTick))) * diameter / 2.1d, (diameter / 2) + (Math.sin(Math.toRadians(radTick))) * diameter / […]

AffineTransform.rotate() – 如何同时进行xlate,旋转和缩放?

我有以下代码(我的第一部分)想要绘制一个棋子上有一些棋子。 Image pieceImage = getImage(currentPiece); int pieceHeight = pieceImage.getHeight(null); double scale = (double)side/(double)pieceHeight; AffineTransform transform = new AffineTransform(); transform.setToTranslation(xPos, yPos); transform.scale(scale, scale); realGraphics.drawImage(pieceImage, transform, this); 也就是说,它获得了棋子的图像和图像的高度,它将该图像的绘图转换为该片段所在的正方形,并将图像缩放到正方形的大小。 Llet说我想把黑色棋子旋转180度。 在某个地方,我希望有类似的东西: transform.rotate(Math.toRadians(180) /* ?, ? */); 但是我无法弄清楚X和Y会放入什么。如果我什么也没放,那么这个图像很好地围绕着它的棋盘方块的0点旋转,将这个块倒置在广场的东北方向它应该是。 我已经猜到了x,y的各种其他组合,但没有运气。 我已经在使用平移把这个块放在正方形中,旋转变换需要另一个x,y围绕它旋转东西,但我不知道如何告诉变换旋转一个x,y并写入图像到不同的x,y。 有人可以帮助我使用旋转参数,还是指出一些能解释这些东西如何工作的东西? 我找到了一些不能解释它们是如何工作的事情的例子,到目前为止我还没有弄清楚如何根据我的情况改变它们…… 主要编辑:添加工作代码。 对不起,我不知道如何发布图片,请替换自己的。 当我跑下面的时候,我得到一个2×2的棋盘,左上角有一辆车,右下角是骑士。 如果我进入SmallChessboardComponent并从第一个旋转变换语句中删除注释delims,我会将原始位置的车辆颠倒并且骑士不会出现。 如果我改为从第二个转换语句中删除注释,则根本不会显示任何一个。 我正在寻找一种方法将这些碎片倒置在他们无论如何都会出现的广场上。 我想把每一块都画在板上; 我不希望代码翻转电路板。 主程序: package main; import java.awt.BorderLayout; import javax.swing.JFrame; import directredraw.SmallChessboardComponent; […]