Du bist nicht angemeldet.

Werbeanzeige

1

30.05.2019, 14:30

Java AffineTransform Rotieren und Bewegen

Hallo, und zwar habe ich folgende frage, mit der Klasse AffineTransform ist es in Java möglich Objekte zu rotieren, nun ist meine frage, kann ich damit auch das rotierte Objekt, wenn ich nur den wert der X Achse nach dem rotieren verändere, in die rotierte Richtung bewegen ?

----- Edit ------

Habe diesen ansatz, welcher schonmal etwas funktioniert, jedoch wenn ich nun das "Objekt" bewege, rotiert er nicht mehr um die eigene achse

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;

public class Main extends JFrame implements KeyListener{
    private int x = 100;
    private int y = 100;
    private int width = 100;
    private int height = 100;
    private double rota = 0;


    public static void main(String[] args) {
        Main frame = new Main();
        frame.setSize(800,600);
        frame.setVisible(true);
    }

    public Main() throws HeadlessException {
        this.addKeyListener(this);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        AffineTransform oldtrans = g2d.getTransform();
        AffineTransform newtrans = new AffineTransform();
        newtrans.setToIdentity();
        newtrans.translate(x , y);
        newtrans.rotate(Math.toRadians(rota), x - width / 2, y - height / 2);
        g2d.setTransform(newtrans);
        g2d.drawRect(0,0,width,height);
        g2d.setTransform(oldtrans);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_LEFT)
        {
            x -= 10;
        }
        else if(e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            x += 10;
        }
        else if(e.getKeyCode() == KeyEvent.VK_UP)
        {
            y -= 10;
        }
        else if(e.getKeyCode() == KeyEvent.VK_DOWN)
        {
            y += 10;
        }
        else if(e.getKeyCode() == KeyEvent.VK_E)
        {
            rota += 10;
        }
        else if (e.getKeyCode() == KeyEvent.VK_Q)
        {
            rota -= 10;
        }
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ahead Studios« (30.05.2019, 14:39)


2

30.05.2019, 16:03

Hab den Fehler gefunden, die koordinaten müssen zusammen gesetzt werden, ergo man braucht ja nur ein button um in die richtige richtung zu bewegen. Hier der Fertige code, für das bewegen in richtung eines angels.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;

public class Main extends JPanel implements KeyListener, MouseListener, MouseMotionListener {
    private int width = 100;
    private int height = 100;
    private int x = (800 / 2) - (width / 2) ;
    private int y = (600 / 2) - (height / 2);
    private double rota = 0;
    int speed = 5;


    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setSize(800,600);
        Main pane = new Main();
        frame.add(pane);
        frame.setVisible(true);

    }

    public Main() throws HeadlessException {
        this.addKeyListener(this);
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
        this.setFocusable(true);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println(rota + " - " + Math.toRadians(rota));
        Graphics2D g2d = (Graphics2D) g;
        g2d.rotate(Math.toRadians(rota), x + width /2,y + height / 2);
        g2d.drawRect(x,y,width,height);
        g2d.drawLine(x + width, y + height /2 , x + width + 30, y + height / 2);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W)
        {
            float rAngel = (float) Math.toRadians(rota);
            x += speed * Math.cos(rAngel);
            y += speed * Math.sin(rAngel);
        }
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        int oX = x + width / 2;
        int oY = y + height / 2;

        float rAngel = (float) Math.atan2(e.getY() - oY, e.getX() - oX);
        rota = (float) Math.toDegrees(rAngel);
        System.out.println(rota);
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        int oX = x + width / 2;
        int oY = y + height / 2;

        float rAngel = (float) Math.atan2(e.getY() - oY, e.getX() - oX);
        rota = (float) Math.toDegrees(rAngel);
        this.repaint();
    }
}