Bagaimana saya bisa mengulurkan tangan kartu secara merata?

20

Diberikan seperangkat kartu remi (gambar persegi panjang dengan lebar dan tinggi) bagaimana saya bisa memutar dan memposisikan masing-masing sehingga muncul dalam pola 'kipas', sama seperti Anda akan memegang tangan kartu dalam kehidupan nyata. Matematika apa yang diperlukan untuk melakukan ini?

MEMPERBARUI

Berikut ini adalah final, implementasi browser dalam JavaScript: https://cosmicrealms.com/blog/2013/03/16/hand-of-cards/ dan http://jsfiddle.net/tyyvk/108/

Sembiance
sumber
9
Pak, Anda tampaknya memiliki kartu As yang terlalu banyak di tangan Anda. Harap menjauh dari meja.
Tomas Andrle
Biola perlu diperbarui untuk menggunakan versi MooTools yang lebih baru.
tomdemuyt

Jawaban:

30

Teori

Karena Anda tidak menentukan dalam platform apa Anda menerapkan ini, saya akan memberikan deskripsi algoritma dengan cara agnostik bahasa:

  1. Pertama, susun setiap kartu saling bertumpukan dengan memberi mereka posisi awal yang sama.
  2. Kemudian untuk setiap kartu menerapkan rotasi (biasanya berpusat di sekitar salah satu sudut bawah , tetapi memindahkan asal-usul ini pada dasarnya akan memungkinkan Anda untuk mengubah tampilan kipas).
  3. Menambah sudut rotasi antara setiap panggilan , tergantung pada jumlah kartu dan seberapa banyak Anda ingin tersebar.

Bahwa rotasi terpusat di sekitar salah satu sudut bawah kartu (atau di dekat sudut) harus jelas dari melihatnya:

masukkan deskripsi gambar di sini


Pelaksanaan

Adapun cara mengimplementasikannya, itu tergantung pada platform Anda. Pada XNA Anda cukup menggunakan parameter Origin SpriteBatch.Drawuntuk mengubah pusat rotasi Anda.

Inilah yang saya dapatkan dengan kode berikut (dengan beberapa penyesuaian ke asal agar terlihat lebih baik - pada dasarnya asal dimulai di dekat sudut kanan dan berakhir di dekat sudut kiri):

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();

Dan hasilnya:

masukkan deskripsi gambar di sini

David Gouveia
sumber
7
Saya akan menambahkan bahwa tampilan dapat diubah dengan menggunakan pusat rotasi yang berbeda, jika Anda ingin menjangkau busur yang lebih kecil Anda harus menggunakan titik rotasi yang terletak di bawah kartu.
aaaaaaaaaaaa
@eBusiness Anda benar, saya akan menambahkannya.
David Gouveia
Terima kasih banyak, David! Saya telah menerapkan kode yang Anda perlihatkan dalam JavaScript di sini: jsfiddle.net/tyyvk/7
Sembiance