# 2D Bild drehen



## Paladin (25. Okt 2006)

Hi,

ich mache gerade meine ersten Versuche mit 2D Grafiken in Java. Bin zur Zeit dabei ein Programm zu erstellen welches dem User einen Tacho anzeigt. Dieser Tacho soll dem User einen bestimmten Status anzeigen. Auf meinem Tacho stehen die Werte 2, 4, 6, 8, 10, 12 und 14. Je nachdem welchen Parameter die paintComponent Methode bekommt soll die Tachonadel jetzt auf einen dieser Werte gesetzt werden. Natürlich sollte es auch möglich sein, dass jemand so etwas wie 2.1 eingibt und auch das korrekt auf dem Tacho angezeigt wird.

Den Tacho habe ich mit den Klassen von awt.geom.* gezeichnet. Die Tachonadel habe ich mit einem Grafikprogramm erstellt und als Grafik in die Mitte des Tachos gesetzt. Wenn ich die Grafik jetzt drehe ändern sich die x und y Werte so dass der Tacho sich verschiebt. Ich habe bis jetzt noch keine Formel gefunden mit der ich die neuen x und y Werte berechnen kann nachdem ich die Grafik gedreht habe.

Hat jemand von euch hier Erfahrung und kann mir einen Tipp geben wie ich das hinbekomme?

Ich lege mal noch den Quellcode meiner paintComponent Methode bei damit ihr sehen könnt wie ich das Thema angefangen habe.


```
protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    Image tacho=null;
    try {
        tacho = ImageIO.read(ClassLoader.getSystemResource( "tacho.png" ));
    } catch (IOException e) {
        e.printStackTrace();
    }

    Font normalfont = new Font("Arial", Font.BOLD, 14);
    g2.setFont(normalfont);
    g2.setStroke( new BasicStroke( 2,
        BasicStroke.CAP_SQUARE  , BasicStroke.JOIN_MITER ) );
				
    Ellipse2D ellipse2d = new Ellipse2D.Double(20,10,250,240);
    Ellipse2D center = new Ellipse2D.Double(135,120,20,20);
    Line2D w_line = new Line2D.Double(20,130,50,130);
    Line2D n_line = new Line2D.Double(145,10,145,40);
    Line2D o_line = new Line2D.Double(240,130,270,130);
    Line2D sw_line = new Line2D.Double(80,198,60,218);
    Line2D so_line = new Line2D.Double(230,218,210,198);
    Line2D nw_line = new Line2D.Double(51,51,71,71);
    Line2D no_line = new Line2D.Double(217,70,237,50);
    Rectangle2D gesamt1 = new Rectangle2D.Double(130, 210, 10, 20);
    Rectangle2D gesamt2 = new Rectangle2D.Double(142, 210, 10, 20);
    Rectangle2D gesamt3 = new Rectangle2D.Double(154, 210, 10, 20);
    Rectangle2D gesamt_rahmen = new Rectangle2D.Double(128, 208, 39, 24);
				
    g2.drawString(tachoname, 115, 110);
    g2.drawString(var1, 90, 190);
    g2.drawString(var2, 60, 135);
    g2.drawString(var3, 80, 85);
    g2.drawString(var4, 142, 65);
    g2.drawString(var5, 195, 85);
    g2.drawString(var6, 215, 135);
    g2.drawString(var7, 190, 190);
		
    g2.draw(ellipse2d);
    g2.draw(center);
				
    g2.draw(w_line); //West 
    g2.draw(o_line); //Ost		
    g2.draw(n_line); //Nord
    g2.draw(sw_line); //Südwest
    g2.draw(so_line); //Südost
    g2.draw(nw_line); //Nordwest
    g2.draw(no_line); //Nordost
    g2.draw(gesamt_rahmen);
    g2.fill(gesamt1);
    g2.fill(gesamt2);
    g2.draw(gesamt1);
    g2.draw(gesamt2);
    g2.setColor(Color.white);
    g2.fill(gesamt3);
    g2.draw(gesamt3);
				
    g2.drawString(gesamtzahl_pos1, 132, 225);
    g2.drawString(gesamtzahl_pos2, 144, 225);
    g2.setBackground(Color.black);
    g2.setColor(Color.black);
    g2.drawString(gesamtzahl_pos3, 156, 225);
		
    AffineTransform aft = new AffineTransform();
    int pos = 0;
    int basisx = 134;
    int basisy = 120;
    aft.rotate(Math.toRadians(pos),136,52);
    g2.setTransform(aft);
    g2.drawImage(tacho,x,y,this); //14		
}
```

Vielen Dank im Voraus

Gruß

Paladin


----------



## LoN_Nemesis (26. Okt 2006)

Eventuell hilft dir  dies hier


----------



## Paladin (27. Okt 2006)

Hi LoN_Nemesis,

danke für den Tipp. Habe es jetzt hinbekommen.

Vielen Dank nochmals

Gruß

Paladin


----------



## millinär (27. Okt 2006)

und wie hast du es jetzt gemacht?
kannst du vieleicht den code zeigen oder erklären?


----------



## Paladin (31. Okt 2006)

Mein Fehler war, dass ich die Achse um welche die Grafik rotieren soll nicht korrekt gesetzt hatte.
Ich hatte bei meinen ersten Versuchen immer die Grafik mit den folgenden Codezeilen gedreht:


```
AffineTransform aft = new AffineTransform();
aft.rotate ( Math.toRadians( rotation ));
g2.drawImage(bild, imagePos_x, imagePos_y, this);
```

aft.rotate besitzt aber noch einen zweiten Konstruktor mit dem man bei der Drehung die Rotationsachse setzen kann:


```
AffineTransform aft = new AffineTransform();
aft.rotate ( Math.toRadians( rotation ), imageAxis_x, imageAxis_y);
g2.drawImage(bild, imagePos_x, imagePos_y, this);
```

Nachdem ich die Rotationsachse nun korrekt gesetzt hatte bewegte sich die Tachonadel genau so wie ich mir das vorgestellt hatte.

Gruß

Paladin


----------

