2010-08-17 6 views
0

Mon application permet de faire pivoter des points autour d'un centre en fonction de la position de la souris. Je suis essentiellement en rotation autour des points un autre point comme celui-ci:Aide sur ce problème

void CGlEngineFunctions::RotateAroundPointRad(const POINTFLOAT &center, const POINTFLOAT &in, POINTFLOAT &out, float angle) 
{ 
//x' = cos(theta)*x - sin(theta)*y 
//y' = sin(theta)*x + cos(theta)*y 

POINTFLOAT subtr; 
subtr.x = in.x - center.x; 
subtr.y = in.y - center.y; 

out.x = cos(angle)*subtr.x - sin(angle)*subtr.y; 
out.y = sin(angle)*subtr.x + cos(angle)*subtr.y; 

out.x += center.x; 
out.y += center.y; 
} 

où POINTFLOAT est tout simplement

struct POINTFLOAT { 
float x; 
float y; 
} 

Le problème est que les points doivent être mis à jour sur mousemove. Je cherche un moyen de le faire sans faire ce qui suit:

Store original points 
Rotate Original points 
Copy result 
Show Result 
Rotate Original points 
Copy result 
Show Result.... 

je me sens le stockage des originaux semble en désordre et utilise la mémoire supplémentaire. Y a-t-il un moyen, en connaissant l'angle de rotation précédent et l'angle actuel, d'éviter en quelque sorte d'appliquer la transformation aux points d'origine tout le temps et de construire sur les points que je modifie?

* le centre ne changera jamais jusqu'à ce que souris vers le haut des thats donc pas un problème

Merci

+4

chaque fois que je vois une question étiquetée à la fois c et C++ ma tête veut exploser – James

+2

sera la tête ['explode()'] (http://php.net/manual/en/function.explode.php) si elle est étiqueté avec [c, C++ et php] (http://stackoverflow.com/questions/tagged/c%20c%2b%2b%20php)? : p – kennytm

+0

En outre, cela semble être une question mathématique, c'est-à-dire que l'on pourrait trouver de meilleures réponses sur math.stackexchange. – James

Répondre

1

Si vous soustrayez l'ancienne rotation de la nouvelle, vous obtiendrez une valeur que vous devriez pouvoir utiliser pour faire pivoter les points déjà modifiés. Notez que cela nécessite de stocker l'ancienne rotation, et que les coordonnées seront de moins en moins précises au fur et à mesure que vous les traduisez. C'est assez proche pour le travail du gouvernement, cependant.

+0

Donc, si ang était de 3 et maintenant son 4, j'ai seulement besoin de tourner par une chose de type? – jmasterx

+0

@Milo: Droit. Cela devrait fonctionner. Relisez la partie sur la perte de précision des coordonnées - si cela se produit beaucoup avec les mêmes points, les erreurs d'arrondi peuvent vous déranger. – cHao

+0

Cette marge d'erreur serait-elle visiblement visible? Je fais tourner des polygones dans une application de dessin vectoriel. – jmasterx

1

Ainsi, au lieu de stocker le point précédent, vous préférez stocker l'angle précédent?

Peut-être que je peux vous décourager de le faire. Au lieu de conserver une structure de deux flottants, vous garderiez un seul flottant (angle), mais ajouteriez de la complexité à l'application, pour un gain très faible. Revisitez ce code dans 6 mois et vous vous demanderez pourquoi vous avez passé tout ce temps à jouer avec la trigonométrie pour sauver un seul flotteur.

Mon 2 ¢. C'est néanmoins un problème de trig intéressant :)

+0

Non, ce n'est pas seulement pour sauver 2 flotteurs, ce ne serait pas juste 1 point, cela pourrait être des milliers qui signifient des milliers de points, alors modifiez les originaux au premier mouvement de la souris, puis recopiez les anciens , c'est beaucoup ... – jmasterx

+0

Oh, c'est pour un polygone! Je vois. Alors, oui, cHao en a le droit. – MPelletier