Utiliser une matrice de rotation. Ce code permet de se déplacer d'un point (x,y) par theta radians vers un nouveau point (px, px).
Point Rotate(x, y, theta)
int px = (x * Math.Cos(theta)) - (y * Math.Sin(theta));
int py = (y * Math.Cos(theta)) + (x * Math.Sin(theta));
return new Point(px, py);
end
La matrice utilisée ci-dessus,
[cosθ - sinθ][x]
[cosθ + sinθ][y]
Déplace un point autour du cercle dans le sens des aiguilles d'une montre lors de l'utilisation de coordonnées graphiques.
J'ai fait exactement la même chose la semaine dernière. Vous pouvez animer ceci en trouvant le thêta total que vous souhaitez déplacer et en le divisant par le nombre d'images (ou de pas). Maintenant, commencez chaque mouvement à un point arbitraire (par exemple, (0, rayon)) et incrémentez un compteur totalSteps et déplacez toujours à partir de ce point initial . Si vous déplacez simplement le point lui-même à chaque image, vous accumulerez des erreurs, mais si vous vous déplacez toujours du point initial en fonction de l'incrément actuel, en vous arrêtant lorsque l'incrément == totalTheta, ce sera parfait. J'aimerais savoir si cela a du sens.
Je devrais peut-être illustrer un peu plus. Supposons que vous ayez une méthode "BeginMove" :
double totalTheta = 0;
double increment = 0;
double currentTheta = 0;
bool moving = false;
void BeginMove()
{
totalTheta = (2 * Math.PI) / numObjects;
increment = totalTheta / steps;
currentTheta = 0;
moving = true;
}
Vous disposez maintenant d'une méthode qui met à jour le mouvement à chaque image :
void Update
{
if (!moving) return;
// do a min/max to ensure that you never pass totalTheta when incrementing.
// there will be more error handling, but this is the basic idea.
currentTheta += increment;
SomeObject.Location = Rotate(0, radius, currentTheta);
moving = (currentTheta < totalTheta);
}
Il y aura évidemment plus de logique ici en fonction de votre situation exacte, mais l'idée est la suivante :
- Trouvez la valeur totale de la thêta à déplacer.
- Trouver l'incrément (totalTheta / pas)
- Tenez à jour le total de ce que vous avez déjà déménagé.
- Incrémenter le total en cours par l'incrément d'angle avant chaque mouvement.
- Chaque mouvement commence au même point (arbitraire) du cercle et tourne en fonction du total courant.
- Répéter jusqu'à ce que le total courant == total thêta.