2009-04-18 14 views
2

J'essaie de résoudre un problème mathématique délicat, dans un contexte cocos2d pour iphone.cocos2d aide à trouver des points sur un cercle

Fondamentalement, j'ai une roue de roulette qui tourne dans le temps. Je veux avoir un verrou Sprite sur la roue à certains points (comme les points ordinaux de la boussole N, S, E, W) et rebondir sur tous les autres points. J'ai l'image de la roue en rotation, et juste besoin de résoudre la partie où je peux tester si un sprite a intersecté avec le cercle au bon endroit sur le cercle comme il tourne.

Je pense que cette question va dans la bonne direction, mais je ne peux pas comprendre. Quelqu'un peut-il aider à expliquer?

Best way to find a point on a circle closest to a given point

Répondre

1

Si je comprends bien:

Vérifiez d'abord la distance entre l'image-objet et le centre de la roue de la roulette. Cela vous dira si le sprite est au bord de la roue. (Si ce n'est pas le cas, rien ne se passe, non?)

Puis, trouvez l'angle que l'image-objet fait à partir de "l'axe des x" de la roulette.

spriteAngle = atan2(sprite.x - rouletteCentre.x, sprite.y - rouletteCentre.y) 

Vous aurez besoin de trouver l'équivalent de la fonction atan2(). Il renvoie généralement une réponse en radians; vous pouvez le convertir en degrés ou quart de tour ou quelque chose si vous préférez. Ensuite, soustrayez l'angle de rotation de la roulette elle-même (si la roue elle-même tourne, sinon vous avez déjà terminé). Assurez-vous que votre mesure d'angle est cohérente.

actualAngle = spriteAngle - rouletteRotationAngle 

Notez que actualAngle peut être en dehors de la gamme 0-360 degrés, et vous aurez besoin de le faire « enrouler autour ». Enfin, vous souhaiterez autoriser une plage de valeurs acceptable (par exemple, 98 degrés à 102 peuvent être comptés comme "Nord").

1

Vous avez donc un cercle de rayon r, avec le centre (x0, y0).

Un point se trouve à l'extérieur du cercle, aux coordonnées (x, y). Votre question est de trouver le point le plus proche sur le cercle lui-même au point (x, y).

La solution est simple. La projection la plus proche d'un point sur un cercle est réalisée par une simple mise à l'échelle. Ainsi,

d = sqrt((x-x0)^2 + (y-y0)^2) 
xp = x0 + (x - x0)*r/d 
yp = y0 + (y - y0)*r/d 

Le nouveau point (xp, yp) reposera sur le cercle lui-même. Pour être honnête, vous feriez mieux de travailler en coordonnées polaires, avec l'origine au centre du cercle. Ensuite, tout devient beaucoup plus facile.

Votre prochaine question sera où a-t-elle touché le cercle? Ne pas oublier les points de la boussole sur le cercle tournent avec le temps. Une fonction atan2 vous donnera l'angle sur lequel se trouve le point (xp-x0, yp-y0). La plupart des outils auront cette fonctionnalité. Voyez que j'ai soustrait l'origine ici.