теория
Поскольку вы не указали, на какой платформе вы это реализуете, я дам описание алгоритма без учета языка:
- Сначала кладите каждую карту друг на друга, давая им одинаковую начальную позицию.
- Затем для каждой карты примените вращение (обычно по центру вокруг одного из нижних углов , но перемещение этого источника по существу позволит вам настроить внешний вид вентилятора).
- Увеличивайте угол поворота между каждым вызовом , в зависимости от количества карточек и от того, насколько сильно вы хотите их разложить.
То, что вращение центрировано вокруг одного из нижних углов карты (или около угла), должно быть видно из его просмотра:
Реализация
Что касается того, как реализовать это, это зависит от вашей платформы. В XNA вы можете просто использовать параметр Origin SpriteBatch.Draw
для изменения центра вашего вращения.
Вот что я получил с помощью следующего кода (с несколькими изменениями исходного положения, чтобы он выглядел лучше - в основном источник начинается около правого угла и заканчивается у левого угла):
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();
И результат: