Question

D'accord, je suis en train de faire tourner Java Polygon basée sur sa position initiale de l'angle 0. x, et à la fin y jusqu'à être converti en un entier à la fin de moi de les utiliser, pour que je puisse comprendre de ne pas voir un changement, mais quand la différence dans les angles est grand comme 0 à 180, je pense que je devrais voir quelque chose .

Je suis dans ce domaine depuis un peu de temps et ne peut pas penser à ce qu'il est. Voici la méthode. (Désolé si elle bousille dans les balises de code, mon firefox les endommagerait.)

public void rotate(double x, double y, obj o1)
{
    double dist = Math.sqrt(Math.pow(x - (o1.x + (o1.w/2)), 2) + Math.pow(y - (o1.y + (o1.h/2)),2));

    x +=  (Math.sin(Math.toRadians(o1.a)) * dist);
    y -=  (Math.cos(Math.toRadians(o1.a)) * dist);  
}
Était-ce utile?

La solution

Les valeurs de x et y qui sont manipulés dans la méthode rotate ne seront pas visibles dans la méthode qui appelle parce que Java passe arguments de la méthode par la valeur .

Par conséquent, les valeurs de x et y qui sont en cours de modification dans la méthode de rotate est une copie locale, donc une fois qu'il est hors de portée (c.-à-retour de la méthode rotate à sa méthode d'appel), les valeurs de x et y seront disparaître.

actuellement, ce qui se passe est:

x = 10;
y = 10;
o1 = new obj();
o1.a = 100;
rotate(x, y, obj);
System.out.println(x);  // Still prints 10
System.out.println(y);  // Still prints 10

La seule façon d'obtenir plusieurs valeurs de retour d'une méthode en Java est de passer d'un objet, et de manipuler l'objet qui est passé dans. (En fait, une copie de la référence à l'objet est passé quand un appel de méthode est fait.)

Par exemple, redéfinir rotate pour revenir un Point:

public Point rotate(int x, int y, double angle)
{
    // Do rotation.
    return new Point(newX, newY);
}

public void callingMethod()
{
    int x = 10;
    int y = 10;
    p = rotate(x, y, 45);
    System.out.println(x);  // Should print something other than 10.
    System.out.println(y);  // Should print something other than 10.
}

Cela dit, comme Pierre suggère , en utilisant le AffineTransform serait beaucoup plus facile à mon avis.

Par exemple, la création d'un Rectangle objet et tournant à l'aide de AffineTransform peut être effectuée par ce qui suit:

Rectangle rect = new Rectangle(0, 0, 10, 10);

AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(45));

Shape rotatedRect = at.createTransformedShape(rect);

AffineTransform peut être appliqué à des classes qui mettent en œuvre la Shape interface. Une liste des classes de mise en œuvre Shape se trouve dans les spécifications API Java liées à l'interface Shape.

Pour plus d'informations sur la façon d'utiliser AffineTransform et Java 2D:

Autres conseils

Pour votre information: formes tournantes et des points a été mis en œuvre dans java.awt.geom.AffineTransform

Vous effectuez une transformation de rotation 2D .

Il devrait ressembler à ceci:

xnew = xold*cos(t) - yold*sin(t)
ynew = xold*sin(t) + yold*cos(t)

L'angle de rotation t doit être en radians, bien sûr. Il est nul à l'axe x, et une augmentation dans le sens anti-horaire.

Les deux anciens et nouveaux points doivent être exprimés par rapport à l'origine vous tournant autour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top