如何将使用g2d.rotate进行的旋转应用于三角形的x坐标?

时间:2017-01-02 04:08:41

标签: java project graphics2d

我正在尝试在游戏中为基本安全摄像头创建功能。相机位于画布的右上角,并显示一个类似于安全摄像头旋转的光束(向一个方向移动90°,然后向后移动90°)。我的目标是当鼠标触摸光束时,控制台输出“触摸”。

到目前为止,我使用g2d.rotate旋转了相机光束,但是点击检测不会随着旋转的画布移动。我尝试了很多解决方案,包括用于围绕一个点移动多边形点的定理,但每次旋转时三角形的大小都在减小。

到目前为止,这是我的代码:

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");
        }
    }

1 个答案:

答案 0 :(得分:1)

你没有旋转你正在进行测试的多边形,所以它将使用原始的未旋转光束进行命中测试。

作为一个简单的解决方案,您可以在使用多边形进行命中测试之前旋转多边形。 Graphics2D使用AffineTransform类进行旋转,您也可以:

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方法中更新角度也不是一个好主意,因为您不知道调用的时间和频率。如果您的窗口重叠然后未被覆盖,您的绘制方法也将被调用。