如何将使用 g2d.rotate 进行的旋转应用于三角形的 x 坐标?
How do I apply rotations made using g2d.rotate to the x coordinates of a triangle?
我正在尝试在我的游戏中创建基本安全摄像头的功能。摄像头位于 canvas 的右上角,并显示一束类似于安全摄像头旋转的光束(向一个方向移动 90°,然后向后移动 90°)。我的目标是当鼠标接触到横梁时,控制台输出 "touching".
到目前为止,我使用 g2d.rotate 旋转相机光束,但是命中检测不会随着旋转的 canvas 移动。我已经尝试了多种解决方案,包括用于围绕一个点移动多边形的点的定理,但三角形的大小随着每次旋转而不断减小。
到目前为止,这是我的代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Camera {
private BufferedImage img;
private int x;
private int y;
private boolean moving = false;
private double angle;
private boolean up;
private Graphics2D graphicsTemp;
private AffineTransform at;
private Polygon beam;
private Point p1;
private Point p2;
private Point p3;
private int[] xArray;
private int[] yArray;
public Camera(int x, int y, Point p1, Point p2, Point p3) {
try {
img = ImageIO.read(getClass().getResource("Camera.png"));
} catch (IOException e) {
System.out.println("NO IMAGE");
}
this.x = x;
this.y = y;
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
angle = 0;
up = true;
}
public void update() {
xArray = new int[] { p1.x, p2.x, p3.x };
yArray = new int[] { p1.y, p2.y, p3.y };
beam = new Polygon(xArray, yArray, 3);
}
public void paint(Graphics2D g2d) {
if (up) {
angle += 0.2;
} else {
angle -= 0.2;
}
if (angle >= 90.0 || angle <= 0.0) {
up = !up;
}
g2d.rotate(Math.toRadians(angle), p1.x, p1.y);
g2d.setColor(color);
g2d.fillPolygon(beam);
g2d.setColor(Color.BLACK);
g2d.drawPolygon(beam);
g2d.rotate(-Math.toRadians(angle), p1.x, p1.y);
}
public void testTouch(int mouseX, int mouseY) {
if (beam.contains(mouseX, mouseY)) {
System.out.println("INSIDE");
} else {
System.out.println("OUTSIDE");
}
}
您还没有旋转您正在进行命中测试的多边形,因此它将使用原始未旋转的光束进行命中测试。
作为一种简单的解决方案,您可以先旋转多边形,然后再将其用于命中测试。 Graphics2D
使用 AffineTransform class 进行旋转,您也可以:
public void testTouch(int mouseX, int mouseY) {
AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(angle), p1.x, p1.y);
Shape rotatedBeam = transform.createTransformedShape(beam);
if (rotatedBeam.contains(mouseX, mouseY)) {
不过,您也可以直接在 paint
方法中绘制旋转的多边形;最好旋转一次并将旋转后的形状用于命中测试和绘制方法。
请注意,在 paint
方法中更新角度也不是一个好主意,因为您不知道调用它的时间和频率。如果你的 window 被重叠然后又被揭开,你的 paint 方法也会被调用。
我正在尝试在我的游戏中创建基本安全摄像头的功能。摄像头位于 canvas 的右上角,并显示一束类似于安全摄像头旋转的光束(向一个方向移动 90°,然后向后移动 90°)。我的目标是当鼠标接触到横梁时,控制台输出 "touching".
到目前为止,我使用 g2d.rotate 旋转相机光束,但是命中检测不会随着旋转的 canvas 移动。我已经尝试了多种解决方案,包括用于围绕一个点移动多边形的点的定理,但三角形的大小随着每次旋转而不断减小。
到目前为止,这是我的代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Camera {
private BufferedImage img;
private int x;
private int y;
private boolean moving = false;
private double angle;
private boolean up;
private Graphics2D graphicsTemp;
private AffineTransform at;
private Polygon beam;
private Point p1;
private Point p2;
private Point p3;
private int[] xArray;
private int[] yArray;
public Camera(int x, int y, Point p1, Point p2, Point p3) {
try {
img = ImageIO.read(getClass().getResource("Camera.png"));
} catch (IOException e) {
System.out.println("NO IMAGE");
}
this.x = x;
this.y = y;
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
angle = 0;
up = true;
}
public void update() {
xArray = new int[] { p1.x, p2.x, p3.x };
yArray = new int[] { p1.y, p2.y, p3.y };
beam = new Polygon(xArray, yArray, 3);
}
public void paint(Graphics2D g2d) {
if (up) {
angle += 0.2;
} else {
angle -= 0.2;
}
if (angle >= 90.0 || angle <= 0.0) {
up = !up;
}
g2d.rotate(Math.toRadians(angle), p1.x, p1.y);
g2d.setColor(color);
g2d.fillPolygon(beam);
g2d.setColor(Color.BLACK);
g2d.drawPolygon(beam);
g2d.rotate(-Math.toRadians(angle), p1.x, p1.y);
}
public void testTouch(int mouseX, int mouseY) {
if (beam.contains(mouseX, mouseY)) {
System.out.println("INSIDE");
} else {
System.out.println("OUTSIDE");
}
}
您还没有旋转您正在进行命中测试的多边形,因此它将使用原始未旋转的光束进行命中测试。
作为一种简单的解决方案,您可以先旋转多边形,然后再将其用于命中测试。 Graphics2D
使用 AffineTransform class 进行旋转,您也可以:
public void testTouch(int mouseX, int mouseY) {
AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(angle), p1.x, p1.y);
Shape rotatedBeam = transform.createTransformedShape(beam);
if (rotatedBeam.contains(mouseX, mouseY)) {
不过,您也可以直接在 paint
方法中绘制旋转的多边形;最好旋转一次并将旋转后的形状用于命中测试和绘制方法。
请注意,在 paint
方法中更新角度也不是一个好主意,因为您不知道调用它的时间和频率。如果你的 window 被重叠然后又被揭开,你的 paint 方法也会被调用。