2012-09-06 12 views
6

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

interface ICollidable 
{ 
    bool CollidedWith(Shape other); 
} 

मेरे पास एक सारणी वर्ग आकार है जो उपरोक्त इंटरफ़ेस को लागू करता है।

abstract class Shape : ICollidable 
{ 
    protected bool IsPicked { private set; get; } 
    protected Form1 Form { private set; get; } 

    protected int X { set; get; } // Usually top left X, Y corner point 
    protected int Y { set; get; } // Used for drawing using the Graphics object 

    protected int CenterX { set; get; } // The center X point of the shape 
    protected int CenterY { set; get; } // The center X point of the shape 

    public Shape(Form1 f, int x, int y) 
    { 
     Form = f; 
     X = x; Y = y; 
     Form.MouseDown += new MouseEventHandler(form_MouseDown); 
     Form.MouseMove += new MouseEventHandler(Form_MouseMove); 
     Form.MouseUp += new MouseEventHandler(Form_MouseUp); 
    } 

    void Form_MouseMove(object sender, MouseEventArgs e) 
    { 
     if(IsPicked) 
      Update(e.Location); 
    } 

    void Form_MouseUp(object sender, MouseEventArgs e) 
    { 
     IsPicked = false; 
    } 

    void form_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (MouseInside(e.Location)) 
      IsPicked = true; 
    } 

    protected abstract bool MouseInside(Point point); 
    protected abstract void Update(Point point); 
    public abstract void Draw(Graphics g); 
    public abstract bool CollidedWith(Shape other); 
} 

मैं तो दस ठोस वर्ग वृत्त, वर्ग, आयत आदि कि आकार वर्ग का विस्तार करने और अमूर्त तरीकों को लागू करने की है। मैं करना चाहते हैं क्या बजाय अगर CollidedWith विधि ऐसे में बयान

public bool CollidedWith(Shape other) 
{ 
    if(other is Square) 
    { 
     // Code to detect shape against a square 
    } 
    else if(other is Triangle) 
    { 
     // Code to detect shape against a triangle 
    } 
    else if(other is Circle) 
    { 
     // Code to detect shape against a circle 
    } 
    ... // Lots more if statements 
} 

किसी को भी है किसी भी विचार है की एक बड़ी ब्लॉक होने collosion पता लगाने क्या करना कुछ OOP स्वच्छ और सुरुचिपूर्ण तरीका के साथ आने कर रहा है। यह एक समस्या है जिसे मैंने पहले सोचा था लेकिन अब केवल अभ्यास में डाल रहा हूं।

+0

यह उपयोगी होगा अगर आप यह समझ सकें कि आप टकराव को कैसे परिभाषित कर रहे हैं, और यह सबक्लास के बीच कैसे भिन्न हो सकता है। क्या 'आकार' में भी निर्देशांक निर्देशों पर कोई जानकारी शामिल होगी? – mclark1129

+0

@ मिक सी। मैंने आकार वर्ग –

उत्तर

1

विशिष्ट आकारों के बजाय, वे सभी Paths या Regions हैं।

एक वर्ग केवल 4 पॉइंट वाला पॉली है, जो कि सही कोण पर होता है। फिर बस एक Path.CollidesWith(Path) विधि लिखें और अपने रास्ते पर रहें।

कुछ relatedquestions देखें।

4

टक्कर पता लगाने इसलिए "आकार विशिष्ट" है ऐसा लगता है आप सभी संभावनाओं के एक मैट्रिक्स बनाने के लिए कोशिश कर रहे हैं

Circle vs. Other Circle 
Circle vs. Other Square 
Circle vs. Other Triangle 
Square vs. Other Circle 
... 

के हर क्रमचय के लिए एक अलग कार्यान्वयन नहीं है कि लेकिन यदि आप 10 के साथ आते हैं नए आकार, कुल मिलाकर 20, आपके पास 400 possibilites हैं।

इसके बजाय, मैं आपके सार वर्ग में एक सामान्य Shape.Overlaps(Shape other) विधि के साथ आने का प्रयास करूंगा जो उन सभी को संतुष्ट करेगा।

यदि यह केवल 2 डी ज्यामिति है तो यह पता लगाने के लिए छोटा होना चाहिए कि किसी भी आकार के किनारों के पथ का अंतर होता है या नहीं।

1

Double dispatch आमतौर पर इस स्थिति में उपयोग किया जाता है।

+1

के लिए पूरे कोड को सम्मिलित कोड बदल दिया है यदि आप इसके बारे में सोचते हैं, तो यह वास्तव में ओपी की 'कोलाइडविथ' विधि से बड़ा नहीं है, यदि बड़े कथन के साथ। केवल अंतर यह है कि ढांचा आपके लिए स्विचिंग तर्क को संभालेगा। दूसरी समस्या यह है कि इस दृष्टिकोण के लिए आपको हर उप-वर्ग को संशोधित करने और हर नए प्रकार के लिए एक नया कार्यान्वयन प्रदान करने की आवश्यकता है, जिसके परिणामस्वरूप एक तेजी से बढ़ते रखरखाव का बोझ होगा। – mclark1129

संबंधित मुद्दे