मैं समान रूप से कार्ड का एक हाथ कैसे लगा सकता हूं?


20

प्लेइंग कार्ड्स का एक सेट (एक चौड़ाई और ऊँचाई के साथ आयत चित्र) को देखते हुए मैं कैसे हर एक को घुमा सकता हूं और स्थिति दे सकता हूं ताकि वे एक 'फैन' पैटर्न में दिखाई दें, जैसे कि आप वास्तविक जीवन में कार्ड का एक हाथ पकड़ेंगे। इसे करने के लिए क्या गणित आवश्यक है?

अपडेट करें

यहाँ अंतिम है, जावास्क्रिप्ट में ब्राउज़र कार्यान्वयन: https://cosmicrealms.com/blog/2013/03/16/hand-of-cards/ और http://jsfiddle.net/tyyvk/108/


9
सर, आपके हाथ में बहुत इक्के लगते हैं। कृपया मेज से दूर हट जाएं।
टॉमस आंद्रे

फिड को मूट्स के बाद के संस्करण का उपयोग करने के लिए अद्यतन करने की आवश्यकता है।
टोमडेमुइट

जवाबों:


30

सिद्धांत

चूंकि आप निर्दिष्ट नहीं कर रहे हैं कि आप इसे किस प्लेटफ़ॉर्म पर लागू कर रहे हैं, इसलिए मैं एल्गोरिथ्म का एक भाषा-अज्ञेय तरीके से वर्णन करूँगा:

  1. पहले हर कार्ड को एक ही प्रारंभिक स्थिति देकर एक दूसरे के ऊपर रखें।
  2. फिर प्रत्येक कार्ड के लिए एक रोटेशन लागू करें (आमतौर पर नीचे के कोनों में से एक के आसपास केंद्रित होता है , लेकिन इस मूल को चारों ओर ले जाने से अनिवार्य रूप से आप पंखे के लुक को मोड़ सकेंगे)।
  3. प्रत्येक कॉल के बीच रोटेशन की कोण वृद्धि , कार्ड की संख्या और आप उन्हें फैलाना चाहते हैं कितना पर निर्भर करता है।

यह रोटेशन कार्ड के निचले कोनों (या कोने के पास) में से एक के आसपास केंद्रित है , इसे देखने से स्पष्ट होना चाहिए:

यहां छवि विवरण दर्ज करें


कार्यान्वयन

इसे कैसे लागू किया जाए, यह आपके प्लेटफॉर्म पर निर्भर करता है। 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();

और परिणाम:

यहां छवि विवरण दर्ज करें


7
मुझे लगता है कि रोटेशन के एक अलग केंद्र का उपयोग करके लुक को ट्विक किया जा सकता है, यदि आप एक छोटे चाप को जोड़ना चाहते हैं तो आपको रोटेशन बिंदु का उपयोग करना चाहिए जो कार्ड के नीचे स्थित है।
आआआआआआआआ आआआआआआआआआना

@eBusiness आप सही हैं, मैं इसमें जोड़ दूंगा।
डेविड

बहुत बहुत धन्यवाद डेविड! मैंने यहाँ आपके द्वारा जावास्क्रिप्ट में दिखाए गए कोड को लागू किया है: jsfiddle.net/tyyvk/7
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.