2015-01-02 6 views
9

के भीतर आयत को रोकें मैं प्रोग्राम में जावा की Rectangle कक्षा का उपयोग कर रहा हूं।आयताकार

मैं दो Rectangle वस्तुओं है:

Rectangle big = new Rectangle(...); 
Rectangle small = new Rectangle(...); 

आयतों की विशिष्ट आकार महत्वपूर्ण नहीं हैं। हालांकि, big हमेशा small से अधिक होगा (दोनों चौड़ाई और ऊंचाई)।

आमतौर पर, small पूरी तरह से big के भीतर निहित है। मैं इसे सत्यापित करने के लिए Rectangle#contains का उपयोग कर सकता हूं। हालांकि, जब यह मामला नहीं है, तो मैं small को big के भीतर पूरी तरह से निहित करना चाहता हूं। न तो आयताकार के आयाम बदलना चाहिए।

उदाहरण के लिए:

Rectangles Example

मैं Math.max और Math.min के साथ चार सशर्त, इस्तेमाल कर सकते हैं पता है, लेकिन वहाँ ऐसा करने का एक और अधिक सुरुचिपूर्ण तरीका है?

+0

चार शर्तों आप की जाँच करने के लिए है कि कर रहे हैं, तो मैं यकीन नहीं है आप कर सकते हैं "सशर्तों का समूह" के बिना दूर हो जाओ ... –

+0

सच है ... लेकिन शायद मैं 'आयताकार' वर्ग का उपयोग कर शायद एक सुरुचिपूर्ण सिंगल-लाइन अभिव्यक्ति की तलाश में था। शायद यह संभव नहीं है। – baum

+1

एक टर्नरी अभिव्यक्ति "थोड़ा" थोड़ा क्लीनर या छोटा होगा। – issathink

उत्तर

2

आप इसे केवल Math.max और Math.min के साथ कर सकते हैं। इस तरह कुछ कोशिश करें:

small.setLocation(
    Math.max(Math.min(small.getX(),big.getX() - small.getWidth()),big.getX()), 
    Math.max(Math.min(small.getY(),big.getY() - small.getHeight()),big.getY()) 
); 

हालांकि आपको पठनीयता पर विचार करना होगा।

+0

हम्म नहीं है, तो मुझे डर है। मैंने सोचा कि शायद मैं चौराहे का उलटा उपयोग कर सकता हूं ... शायद नहीं। – baum

+0

यह अधिक कॉम्पैक्ट है, लेकिन कोई भी "सुरुचिपूर्ण" –

+0

कहता है, हाँ, मैं व्यक्तिगत रूप से केवल मानक चौगुनी-आईएसएस के साथ जाऊंगा क्योंकि इसका उपयोग हमेशा सीमाओं की जांच के लिए किया जाता है, इसलिए एक प्रोग्रामर जिसे इसे बनाए रखने की आवश्यकता होती है उसे तुरंत पहचानना चाहिए । – Ghostkeeper

2

आपको एक मजबूत डिजाइन की आवश्यकता है। यदि आप Rectangle कक्षा पर विस्तार करते हैं, तो आप उस सटीक कार्यक्षमता को जोड़ सकते हैं जिसे आप ढूंढ रहे हैं। जाहिरा तौर पर "बड़ा आयत" एक कंटेनर के रूप में कार्य करना चाहिए, छोटे आयत युक्त: अब

class BigRectangle extends Rectangle { 
    //reference to or list of rectangle(s) here 

    private boolean isAlignedWith(Rectangle rect) { 
     return /* bounds logic */; 
    } 

    private void align(Rectangle rect) { 
     //move rectangle to proper position 
    } 

    public void add(Rectangle rect) { 
     if(!isAlignedWith(rect)) { 
      align(rect); 
     } 

     //store in reference or add to list 
    } 
} 

, तो आप बस बड़ा एक के लिए छोटे आयत जोड़ सकते हैं:

Rectangle smallRectangle = new Rectangle(); 
BigRectangle bigRectangle = new BigRectangle(); 
bigRectangle.add(smallRectangle); //automatically aligns if needed 

अब आप कोड की अपनी केंद्रीय इकाई को साफ रखने के लिए (आवश्यक) तर्क छुपाएं। यह इसे संभालने के सबसे शानदार तरीके की मेरी राय है। (मैं भी शायद एक अंतरफलक RectangleContainer या ShapeContainer बन जाएगा, कि लागू BigRectangle रही है। इंटरफ़ेस एक विधि add(Rectangle) या add(SmallShape) होते हैं)

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