सिद्धांत
चूंकि आप निर्दिष्ट नहीं कर रहे हैं कि आप इसे किस प्लेटफ़ॉर्म पर लागू कर रहे हैं, इसलिए मैं एल्गोरिथ्म का एक भाषा-अज्ञेय तरीके से वर्णन करूँगा:
- पहले हर कार्ड को एक ही प्रारंभिक स्थिति देकर एक दूसरे के ऊपर रखें।
- फिर प्रत्येक कार्ड के लिए एक रोटेशन लागू करें (आमतौर पर नीचे के कोनों में से एक के आसपास केंद्रित होता है , लेकिन इस मूल को चारों ओर ले जाने से अनिवार्य रूप से आप पंखे के लुक को मोड़ सकेंगे)।
- प्रत्येक कॉल के बीच रोटेशन की कोण वृद्धि , कार्ड की संख्या और आप उन्हें फैलाना चाहते हैं कितना पर निर्भर करता है।
यह रोटेशन कार्ड के निचले कोनों (या कोने के पास) में से एक के आसपास केंद्रित है , इसे देखने से स्पष्ट होना चाहिए:
कार्यान्वयन
इसे कैसे लागू किया जाए, यह आपके प्लेटफॉर्म पर निर्भर करता है। XNA पर आप SpriteBatch.Draw
अपने रोटेशन के केंद्र को बदलने के लिए मूल पैरामीटर का उपयोग कर सकते हैं ।
यहाँ मुझे निम्नलिखित कोड के साथ मिला (मूल के लिए कुछ tweaks के साथ यह बेहतर दिखने के लिए - मूल रूप से मूल दाएं कोने के पास शुरू होता है और बाएं कोने के पास समाप्त होता है):
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();
और परिणाम: