# Bild drehen



## raven (11. Aug 2004)

hat vielleicht einer eine Idee wie man Bilder in 360 crad winkel drehen kann.


----------



## bygones (11. Aug 2004)

:applaus:  :applaus:  :applaus:  :applaus:  :applaus: 
dreh mal was im 360 Grad winkel  :wink:


----------



## bummerland (11. Aug 2004)

er meint wahrscheinlich animiert


----------



## macfreakz (11. Aug 2004)

```
public static AffineTransform getRotateInstance(double theta)
```

das wärs!


----------



## raven (11. Aug 2004)

das wars schon die kleine Zeile und wo muss ich dann meien Bilder, also animiert abspielen lassen das das wie gedreht wirkt


----------



## Kerberus (11. Aug 2004)

Du erzeugst ein neues AffineTransform - Objekt. Mit diesem kannst du das Koordinaten-System drehen, d.h du drehst nicht das Bild sondern eigentlich die "Zeichenfläche".

```
import java.awt.geom.*;
...
AffineTransform aft = new AffineTransform();
aft.rotate(double theta, double x, double y);
/**
*double theta repräsentiert den winkel um welchen gedreht wird
*double (x/y) der Punkt um welchen gedreht werden soll
**/
...
```

Eigentlich kannst du nun, um eine Animation zu erstellen, einfach den Winkel theta verändern und dann repaint() aufrufen.


----------



## raven (11. Aug 2004)

Meine Animation wo kommt die rein.
und das repaint() muss ich in der
Methode: public static AffineTransform getRotateInstance(double theta) aufrufen.
Oder?


----------



## Kerberus (11. Aug 2004)

Auf was zeichnest du? JPanel?[/code]


----------



## raven (11. Aug 2004)

Meins is ein Applet


----------



## Kerberus (11. Aug 2004)

Ok, das heisst, dass du eine paint()-Methode hast.
Wenn du eine Animation machst, dann implementierst du wohl das Runnable-Interface. Das heisst, dass du eine run()-Methode hast, in welcher du eine while(true)-Schleife hast und welche du mit Thread.sleep(int milis) schlafen legst. In dieser Methode rufst du eine Methode auf  die den Winkel Theta verändert. Dann rufst du repaint() auf.


```
double theta = 0;
//global definieren

private void rotateImage(){
 theta++;
}

public void paint(Graphics g){
 AffineTransform aft = new AffineTransform();
 aft.rotate(Math.toRadians(theta), double x, double y);

 ...
}

public void run(){
 while(true){
  this.rotateImage();
  try{
   Thread.sleep(int milis);
  }
   ....
}
```


----------



## raven (12. Aug 2004)

So jetzt habe ich das so wie du es geschrieben hast eingebaut am anfang kamen zwar 8 Fehler die konnte ich bis zu 2 Fehlern reduzieren.

bei denen weiß ich aber nicht was da falsch sein soll:

Main.java:45: '.class' expected
                aft.rotate(Math.toRadians(theta), double x, double y);
                                                         ^
Main.java:45: ')' expected
                aft.rotate(Math.toRadians(theta), double x, double y);
                                                                     ^



Und das ist bis jetzt mein quelltext aber noch ohne Animation:


```
import java.applet.*;						// Import befehle
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.awt.geom.*;

public class Main extends Applet implements Runnable
{
	Thread t;
	boolean bWeiter=true;

	double theta = 0;
	int milies=10;

	public void init ()						
	{

	}
	public void start()
	{
		t = new Thread(this);
		t.start();
	}
	public void stopp()
	{
		bWeiter=false;
	}
	public void run()						
	{
		while (bWeiter)
		{
			this.rotateImage();
			try { t.sleep(milies);}
			catch (Exception e) { }
			repaint();
		}
	}
	private void rotateImage(){
 		theta++;
 	}
	public void paint(Graphics g){
 		AffineTransform aft = new AffineTransform();
 		aft.rotate(Math.toRadians(theta), double x, double y);
	}
}
```


----------



## Kerberus (12. Aug 2004)

Ok, erstens solltest du noch x und y definieren, damit das Programm weiss, um was es drehen muss. Dann habe ich noch eine Methode vergessen.

```
AffineTransform aft = new AffineTransform();
aft.rotate(theta, x, y);
g.setTransform(aft);
```
Jetzt sollte es eigentlich gehen.


----------



## raven (12. Aug 2004)

So jetzt habe ich nur noch einen Fehler:


Main.java:51: cannot resolve symbol
symbol  : method setTransform (java.awt.geom.AffineTransform)
location: class java.awt.Graphics
                g.setTransform(aft);
                 ^
1 error


Für was ist das "g.setTransform(aft);" gut, was macht das.

Und noch was dreht sich dann automatisch alles oder muss ich dann die x und y Variable bvei meiner Animation reinsetzten.


----------



## Kerberus (13. Aug 2004)

Ok, dann musst du das Graphics-Object zuerst noch in ein Graphics2D casten.
Füge einfach am Anfang der paint()-Methode folgende Zeile ein:

```
Graphics2D g2d = (Graphics2D) g;
```

Im weiteren Code musst du dann aber g2d verwenden anstelle von g.
Konkret:

```
g2d.setTransform(aft);
```

Das AffineTransform-Objekt beinhaltet, soweit ich weiss, die Informationen, welche benötigt werde, um das KoordinatenSystem zu drehen. Jedoch erst, wenn du setTransform() aufrufst, werden dies angewendet.

Hab dir mal den Quellcode kompletiert. Anstelle eines Bildes habe ich allerdings ein Rechteck genommen. x und y verweisen auf die Mitte des Rechteckes.

```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.awt.geom.*;

public class Main extends Applet implements Runnable
{
 Thread t;
 boolean bWeiter = true;

 double theta = 0;
 int milis = 25;

 double x = 150;
 double y = 150;

 public void init()
 {
 }

 public void start()
 {
  t = new Thread(this);
  t.start();
 }

 public void stopp()
 {
  bWeiter = false;
 }

 public void run()
 {
  while(bWeiter)
  {
   this.rotateImage();
   repaint();
   try
   {
    t.sleep(milis);
   }
   catch(InterruptedException e)
   {
   }
  }
 }

 private void rotateImage()
 {
  theta++;
 }

 public void paint(Graphics g)
 {
  Graphics2D g2d = (Graphics2D) g;
  AffineTransform aft = new AffineTransform();
  aft.rotate(Math.toRadians(theta), x, y);
  g2d.setTransform(aft);

  g2d.setColor(new Color(255,0,0));
  g2d.drawRect(100,100,100,100);
 }
}
```


----------



## raven (14. Aug 2004)

Jetzt ist noch ein neuer Fehler aufgetaucht.

Main.java:52: illegal character: \160
g2d.drawLine(100,100,100,100);
 ^
1 error


----------



## Grizzly (14. Aug 2004)

X_Master hat gesagt.:
			
		

> Jetzt ist noch ein neuer Fehler aufgetaucht.
> 
> Main.java:52: illegal character: \160
> g2d.drawLine(100,100,100,100);
> ...



Da hast Du wahrscheinlich irgendetwas vergessen. Poste mal den Code.


----------



## raven (14. Aug 2004)

So das is er.



```
import java.applet.*;						
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.awt.geom.*;


public class Main extends Applet implements Runnable
{
	Thread t;
	boolean bWeiter=true;

//	Fly F1 = new Fly();

	double theta = 0;
	double x = 150;
	double y = 150;
	int milies=10;

	public void init ()						
	{

	}
	public void start()
	{
		t = new Thread(this);
		t.start();
	}
	public void stopp()
	{
		bWeiter=false;
	}
	public void run()						
	{
		while (bWeiter)
		{
			this.rotateImage();
			try { t.sleep(milies);}
			catch (Exception e) { }
			repaint();
		}
	}
	private void rotateImage(){
 		theta++;
 	}
	public void paint(Graphics g){
		Graphics2D g2d = (Graphics2D) g;
		AffineTransform aft = new AffineTransform();
		aft.rotate(theta, x, y);
 		g2d.setTransform(aft);

   		g2d.drawRect(100,100,100,100);
	}
}
```


----------



## Kerberus (14. Aug 2004)

Ne, das weisst darauf hin, dass er einen Tab verwenden hat, oder so was. Habe ich auch immer, wenn ich Code aus dem Forum verwende und es direkt kompilieren möchte. Geh zur betroffenen Zeile und lösche alle Zeichen vor dem eigentlichen Code und erzeuge den benötigten Abstand mit Leerzeichen, dann sollte es gehen.


----------



## raven (14. Aug 2004)

Na endlich keine Fehler mehr.

Ein klitze kleines Problem noch.

Er zeigt nichts an ob wohl ich ein viereck gezeichnet habe.


----------



## Kerberus (14. Aug 2004)

Du musst wohl noch die Farbe von weiss auf irgendetwas anderes stellen, denn weiss auf weiss sieht man bekanntlich nicht so gut 


```
g2d.setColor(new Color(100,100,100)); //Beliebige RGB-Werte einzetzen
```


----------



## macfreakz (14. Aug 2004)

@X-Master: Ich muss dir was ehrlich sagen: ich finde deine Postings wirklich blöd ... du hättest Java doch von anfang an zu lernen und nicht gleich am Ende oder mittendrin! Ich sehe, du hast wirklich null Ahnung über Java und versuchst nur, die Code zu kopieren. Die bei dir auftretenen Probleme können doch jeder lösen, der schon Java Grundlagen hat! Zum Glück hat Kerberus Lust, dir 100 % zu helfen ... :bloed: 

Jetzt zu deinem Problem: du wirst merken, dass das Fenster stark ruckeln wird. Du musst eine spezielle Zeichnen-Technik anwenden, sie heisst "DoubleBuffering". Mehr darüber benutze die Suchfunktion hier ... viel Spass ... (ich empfehle dir, vorher zuerst die Java Grundlagen zu lernen ... ) 

@Kerberus: sehr lieb, wie du X-Master geholfen hast! In dieser Weise sollst du beim näcshten Mal nicht machen, gell?


----------



## raven (15. Aug 2004)

Ich habe keine null Ahnung von Java ich besitzte zwar noch nicht alle Grundlage, aber sag mer mal die hälfte davon.

Ich hab sowas mit Bildern drehen bloß noch nie gemacht und in tutiorals und Büchern habe ich nich nie so eas gesehen wie die das beschreiben.

und noch was wozu ist denn das Forum da damit man Probleme lössen kann.

So das mit dem drehen funktioniert jetzt.


----------



## macfreakz (17. Aug 2004)

@X_Master: 1/2 Grundlagen hast du im Kopf? Ich kann kaum fassen ... wie du über dich selbst so beurteilen kannst. 

Diese Zeile sagt schon viel aus: 


```
aft.rotate(Math.toRadians(theta), double x, double y);
```

Jede Java Anfänger hätte diese Zeile sofort korrigieren können!!! 
Nimm Javabuch und lerne nochmals von vorne an ... [/code]


----------



## Illuvatar (17. Aug 2004)

macfreakz hat gesagt.:
			
		

> @X-Master: Ich muss dir was ehrlich sagen: ich finde deine Postings wirklich blöd ... du hättest Java doch von anfang an zu lernen und nicht gleich am Ende oder mittendrin! Ich sehe, du hast wirklich null Ahnung über Java und versuchst nur, die Code zu kopieren. Die bei dir auftretenen Probleme können doch jeder lösen, der schon Java Grundlagen hat! Zum Glück hat Kerberus Lust, dir 100 % zu helfen ... :bloed:
> 
> Jetzt zu deinem Problem: du wirst merken, dass das Fenster stark ruckeln wird. Du musst eine spezielle Zeichnen-Technik anwenden, sie heisst "DoubleBuffering". Mehr darüber benutze die Suchfunktion hier ... viel Spass ... (ich empfehle dir, vorher zuerst die Java Grundlagen zu lernen ... )
> 
> @Kerberus: sehr lieb, wie du X-Master geholfen hast! In dieser Weise sollst du beim näcshten Mal nicht machen, gell?





			
				macfreakz hat gesagt.:
			
		

> @X_Master: 1/2 Grundlagen hast du im Kopf? Ich kann kaum fassen ... wie du über dich selbst so beurteilen kannst.
> 
> Diese Zeile sagt schon viel aus:
> 
> ...



Halte dich bitte in Zukunft mit solchen Aussagen zurück. :noe:


----------



## Guest (20. Okt 2004)

_Edit by Illuvatar: Hier stand das Geflame eines Gastes (jedenfalls haben die IPs weder auf Xmaster noch auf sonstwen aus dem Forum gepasst) gegen macfreakz.
Ich habe diese Sache damals schon per pn mit Macfreakz geklärt.
Wenn du noch weiter sachlich darüber reden willst, wende dich per pn an mich, einen anderen Mod oder Admin, oder direkt an macfreakz selbst._


----------

