Teoría
Como no especificó en qué plataforma está implementando esto, le daré una descripción del algoritmo de forma independiente del lenguaje:
- Primero apila cada carta una encima de la otra dándoles la misma posición inicial.
- Luego, para cada tarjeta, aplique una rotación (generalmente centrada alrededor de una de las esquinas inferiores , pero mover este origen esencialmente le permitirá modificar el aspecto del ventilador).
- Incremente el ángulo de rotación entre cada llamada , dependiendo de la cantidad de tarjetas y de cuánto desea que se distribuyan.
Es evidente que la rotación se centra alrededor de una de las esquinas inferiores de la tarjeta (o cerca de la esquina) al mirarla:
Implementación
En cuanto a cómo implementar esto, depende de su plataforma. En XNA, simplemente puede usar el parámetro Origen de SpriteBatch.Draw
para cambiar el centro de su rotación.
Esto es lo que obtuve con el siguiente código (con algunos ajustes en el origen para que se vea mejor, básicamente el origen comienza cerca de la esquina derecha y termina cerca de la esquina izquierda):
int cards = 20;
float range = MathHelper.ToRadians(90);
float initialAngle = MathHelper.ToRadians(-45);
float increment = range / cards;
Vector2 leftCorner = new Vector2(0, texture.Height * 0.9f);
Vector2 rightCorner = new Vector2(texture.Width, texture.Height * 0.9f);
Vector2 fanPosition = new Vector2(400, 300);
spriteBatch.Begin();
for (float angle = 0; angle < range; angle+=increment)
{
float cardAngle = initialAngle + angle;
Vector2 cardOrigin = Vector2.Lerp(rightCorner, leftCorner, angle / range);
spriteBatch.Draw(texture, fanPosition, null, Color.White, cardAngle, cardOrigin, 1f, SpriteEffects.None, 0f);
}
spriteBatch.End();
Y el resultado: