【发布时间】:2021-04-28 23:05:38
【问题描述】:
我正在尝试在给定点绘制一个旋转的形状。举个例子,在下图中,红色矩形是在一个点绘制的非旋转矩形,然后蓝色矩形旋转并绘制在同一位置。蓝色矩形是我想要的结果。
我一直在尝试不同的方法。目前,这是我用于图像的内容:
Point point = new Point(300, 300);
Dimension dim = new Dimension(200, 100);
double radians = Math.toRadians(30);
g.setColor(new java.awt.Color(1f, 0f, 0f, .5f));
g.fillRect(point.x, point.y, dim.width, dim.height);
translate(g, dim, radians);
g.rotate(radians, point.getX(), point.getY());
g.setColor(new java.awt.Color(0f, 0f, 1f, .5f));
g.fillRect(point.x, point.y, dim.width, dim.height);
private static void translate(Graphics2D g, Dimension dim, double radians) {
if (radians > Math.toRadians(360)) {
radians %= Math.toRadians(360);
}
int xOffsetX = 0;
int xOffsetY = 0;
int yOffsetX = 0;
int yOffsetY = 0;
if (radians > 0 && radians <= Math.toRadians(90)) {
xOffsetY -= dim.getHeight();
} else if (radians > Math.toRadians(90) && radians <= Math.toRadians(180)) {
xOffsetX -= dim.getWidth();
xOffsetY -= dim.getHeight();
yOffsetY -= dim.getHeight();
} else if (radians > Math.toRadians(180) && radians <= Math.toRadians(270)) {
xOffsetX -= dim.getWidth();
yOffsetX -= dim.getWidth();
yOffsetY -= dim.getHeight();
} else {
yOffsetX -= dim.getWidth();
}
int x = rotateX(xOffsetX, xOffsetY, radians);
int y = rotateY(yOffsetX, yOffsetY, radians);
g.translate(x, y);
}
private static int rotateX(int x, int y, double radians) {
if (x == 0 && y == 0) {
return 0;
}
return (int) Math.round(x * Math.cos(radians) - y * Math.sin(radians));
}
private static int rotateY(int x, int y, double radians) {
if (x == 0 && y == 0) {
return 0;
}
return (int) Math.round(x * Math.sin(radians) + y * Math.cos(radians));
}
这适用于矩形,但不适用于其他类型的形状。我试图弄清楚是否有一种方法可以为每种类型的形状完成此操作。另请注意,该代码仅用于测试目的,其中有很多不好的做法,例如调用 Math.toRadians。
【问题讨论】:
-
@AndrewThompson 在我发布的示例中,它使用了您通过Graphics2D.html#rotate(double, double, double) 链接的getRotateInstance 方法,具有相同的效果。你也是对的,我试图让它旋转和未旋转形状之间的最小 X 和 Y 值是相同的。这可能需要以某种方式通过旋转然后平移来完成,反之亦然。
-
前几天我用类似的图片回答了问题。它在哪里?