Java: Point de Rotation autour de l'autre par degré spécifié de la valeur
Je suis en train de faire tourner un Point 2D en java autour de l'autre, avec un degré spécifié de la valeur, dans ce cas simplement autour du Point (0, 0) à 90 degrés.
Méthode:
public void rotateAround(Point center, double angle) {
x = center.x + (Math.cos(Math.toRadians(angle)) * (x - center.x) - Math.sin(Math.toRadians(angle)) * (y - center.y));
y = center.y + (Math.sin(Math.toRadians(angle)) * (x - center.x) + Math.cos(Math.toRadians(angle)) * (y - center.y));
}
Prévu pour (3, 0): X = 0, Y = -3
Retourné pour (3, 0): X = 1.8369701987210297 E-16, Y = 1.8369701987210297 E-16
Prévu pour (0, -10): X = -10, Y = 0
Retourné pour (0, -10): X = 10.0, Y = 10.0
Est quelque chose de mal avec la méthode elle-même? J'ai porté à la fonction de (La rotation d'Un Point en 2D Dans Lua - GPWiki) à Java.
EDIT:
Fait quelques tests de performance. Je n'aurais pas pensé, mais le vecteur solution gagné, donc je vais utiliser celui-ci.
OriginalL'auteur Aich | 2012-04-03
Vous devez vous connecter pour publier un commentaire.
Si vous avez accès à
java.awt
, c'est justeAWT est construit pour les graphiques, ce qui signifie souvent des jeux, donc je ne m'inquiéterais pas.
excellent travail , beaucoup de merci pour vous
OriginalL'auteur Louis Wasserman
Vous êtes à la mutation de la valeur X de
center
avant d'effectuer le calcul sur la valeur de Y. L'utilisation temporaire de point à la place.En outre, cette fonction prend trois paramètres. Pourquoi ne vôtre ne prendre deux?
Ajouté le temp coordonnées, la méthode est encore retourner des valeurs inattendues. =/
Vous pouvez poster votre nouveau code alors? Parce que @Pierre a correctement expliqué pourquoi votre code ne pas faire la bonne chose. Il semble que vous n'avez pas bien compris ce qu'il vous a demandé de le faire.
la classe Point { double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public void rotateAround(Point centre, double angle) { double tempx = center.x + (Math.cos(Math.toRadians(angle)) * (x - center.x) Math.sin(Math.toRadians(angle)) * (y - center.y)); double tempy = center.y + (Math.sin(Math.toRadians(angle)) * (x - center.x) + Math.cos(Math.toRadians(angle)) * (y - center.y)); x = tempx; y = tempy; } public String toString() { return "Point { X =" + String.valueOf(x) + ", Y = " + String.valueOf(y) + " }"; } }
OK, ce n'est pas 6.123..., c'est 6.123 x 10^-16. Qui est un petit nombre, et est simplement l'habitude d'inexactitude vous attendez lorsque vous traitez avec des nombres à virgule flottante. C'est, il est effectivement impossible de distinguer à partir de zéro. Et la raison pourquoi y vient comme 10, pas -10, c'est que votre formule tourne dans le sens INVERSE; donc aller de 90 degrés à partir de ( 10, 0 ) vous donne ( 0, 10 ).
OriginalL'auteur Peter