AWT AffineTransform

Grejak

Aktives Mitglied
Hallo

Ich will ein Programm schreiben mit der eine Art Marionette dargestellt wird.

bis jetzt habe ich ein enum:
Java:
	public enum bodyPart{
		oberArm1(0),unterArm1(1),hand1(2),oberSchenkel1(3),unterSchenkel1(4),fuß1(5),körper(6),
		hals1(7),kopf1(8),hals2(9),kopf2(10),hals3(11),kopf3(12),
		oberArm2(13),unterArm2(14),hand2(15),oberSchenkel2(16),unterSchenkel2(17),fuß2(18),;
		int ID;
		bodyPart(int i){
			ID=i;
		}
		public int getPartID(){
			return ID;
		}
	}
und drei Arrays ,das erste ist ein BufferedImage die anderen beiden Point,
Die Punkte der Arrays liegen immer übereinender, der eine stellt da wo im bild das zweite bild hinzugefügt wird,der andere steht für den Punkt in bild 2 der auf diesem Punkt liegt.

und zwar habe ich an folgendes Prinzip gedacht z.B. wird der unterSchenkel1 am oberSchenkel1 befestigt.

Um nun eine marionette zu erhalten habe ich noch mit AffineTransform eine Methode um die Bilder zu drehen, da liegt jetzt das größte Problem wenn ich das Bild oberSchenkel drehe muss der Punkt an dem
der unterSchenkel hängt mitwandern. der Punkt auf Bild 2 darf beim drehen aber nicht wandern(er ist gleichzeitig der dreh anchor)

Wie kann ich das schaffen?:rtfm:

Danke im vorraus
 

Marco13

Top Contributor
Ein paar Codeteile, die "näher am Problem" sind, wären vielleicht hilfreich. Im allgemeinen kann man um einen Punkt drehen, indem man diesen Punkt in den Ursprung verschiebt, dreht, und wieder zurckschiebt. AffineTransform hat da eine extra Methode dafür.
 

Grejak

Aktives Mitglied
rotate methode:
Java:
private BufferedImage rotateImg(BufferedImage input,double degrees,double xAnchor,double yAnchor){
AffineTransform at=new AffineTransform();
at.rotate(Math.toRadians(degrees),xAnchor,yAnchor);

Graphics g=input.getGraphics();
BufferedImage copy=input;
g.clearRect(0,0,input.getWidth,input.getHeight);
g.setAffineTransform(at);
g.drawImage((Image)copy,0,0,null);

return input;
}
//Die Methode ist aus dem Kopf nachgeschrieben enthält aber alle vorgänge wie die echte
//Dann gibt es noch drei getter Methoden:


private BufferedImage getImageFor(bodyPart p){
return images[p.getID()];//Bild für KörperTeil
}

private Point getPositionFor(bodyPart p){
return position[p.getID()];//Punkt wo das bild an einem anderen bild hinzugefügt wird
}

private Point getDockPositionFor(bodyPart p){
return dockPosition[p.getID()];//Punkt vom bild der über den anderen Punkt gelegt wird
}

Wie meinst du das mit dem verschieben??
 

Marco13

Top Contributor
Sehe ich es richtig, dass es KEINE Information gibt, wie die Teile miteinander verbunden sind? Es soll ja z.B. die Transformation vom Oberarm Auswirkungen auf den Unterarm haben. Woher soll man das wissen, also wo ist festgelegt, dass der Oberarm keine Auswirkungen auf den Fuß, wohl aber auf die Hand hat?
 

Grejak

Aktives Mitglied
Daran feile ich noch :
Java:
public BufferedImage drawBodyPart(BufferedImage image, bodyPart p){

Graphics2D g=(Graphics2D)image.getGraphics();

BufferedImage add=getImageFor(p);
Point k=getPositionFor(p);
Point j=getDockPositionFor(p);

double x=k.getX()-j.getX();
double y=k.getY()-j.getY();

g.drawImage(add,x,y,null);

return image;
}

public BufferedImage drawBodyPart(BufferedImage image, bodyPart p,double rotateDegrees){

Graphics2D g=(Graphics2D)image.getGraphics();

BufferedImage add=getImageFor(p);
Point k=getPositionFor(p);
Point j=getDockPositionFor(p);

double x=k.getX()-j.getX();
double y=k.getY()-j.getY();

BufferedImage copy=rotateImg(add,rotateDegrees,j.getX(),k.getY());

g.drawImage(copy,x,y,null);

return image;
}

Hatte noch keine Zeit diese zu testen
 

Neue Themen


Oben