2012-12-21 46 views
7

जावा में काम करना, मैं एक ड्रॉ फ़ंक्शन (पॉलीगॉन निर्माता) को सरल बनाना चाहता था जिसके साथ मैं काम कर रहा हूं। आमतौर पर, जब आप एक बहुभुज बनाते हैं, आप ऐसा करते हैं:जावा विधि को तर्कसंगत मात्रा के साथ सरलीकृत करना

Polygon mypoly = new Polygon(); 
mypoly.addPoint(x1, y1); 
mypoly.addPoint(x2, y2); 
mypoly.addPoint(x3, y3); 
Draw.fillPolygon(g, mypoly, Color.blue); 

मैं एक छवि नक्शाकार उपयोग करने के लिए स्वचालित रूप से मुझे निर्देशांक देना चाहते हैं, तो मैं सिर्फ उन्हें अपने ही समारोह में पेस्ट नकल कर सकता है।

myCommand(x1, y1, x2, y2, x3, y3); 

इनमें से प्रत्येक शीर्ष पर बहुभुज कमांड में जाएगा। जिस समस्या का मैं सामना कर रहा हूं वह यह है कि जब मेरी पोली बनाई जाती है, तो यह कैसे पता चलेगा कि कितने अंक जोड़ना है और उन्हें कहां रखा जाए?

मैं अंक जोड़ने के लिए myCommand प्राप्त करने की कोशिश कर रहा हूं क्योंकि मैं तर्क जोड़ता हूं, और प्रत्येक बिंदु मूल बहुभुज निर्माण विधि के x, y के अनुरूप है।

+1

उपयोग [varargs] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) । –

उत्तर

7

लगता है जैसे आपको builder पैटर्न का उपयोग करने की आवश्यकता है। स्यूडोकोड में:

PolygonBuilder pb = new PolygonBuilder(); 
pb.addPoint(1,1); 
pb.addPoint(1,2); 
// etc... 

Polygon p = pb.newPolygon(); 

तो विचार है कि आप अंक का एक सेट के साथ बिल्डर प्रदान करना है, और यह आप उचित बहुभुज जेनरेट करना होगा। बिल्डर्स को अक्सर fluent interface के साथ डिज़ाइन किया गया है। ध्यान दें कि निर्माता एक कारखाने की तरह कार्य कर सकता है और यदि आप चाहें तो Polygon (वर्ग, त्रिकोण, पेंटगेल इत्यादि) के उचित उप-वर्गों को वापस कर सकते हैं।

ध्यान दें कि आप Java varargs mechanism का उपयोग करके तर्कों की एक परिवर्तनीय संख्या लेते हैं, इसके बजाय आप एक विधि प्रदान कर सकते हैं। जैसे

public void addPoints(Integer... args) { 
    // and iterate here 
} 

आप एक एक्स परिभाषित करने के लिए एक Point वस्तु बनाने के लिए इच्छा हो सकती है/y एक साथ समन्वय। अन्यथा उपरोक्त को भी तर्कों की एक संख्या की जांच करनी होगी, और उन तर्कों को एक साथ बंधे नहीं होंगे।

5

आप varargs का उपयोग करें और बहुभुज constructor कि XS के एरे और वाईएस

हो जाता है का उपयोग करके गतिशील बना सकते हैं

(कोड का परीक्षण नहीं)

public Polygon createPolygon(int... points) { 
    if (0 != points.length % 2) { 
     throw new IllegalArgumentException("Must have even number of points"); 
    } 

    int numOfPoints = points.length/2; 
    int xs = new int[numOfPoints]; 
    int ys = new int[numOfPoints]; 
    for (int i=0; i < numOfPoints;i++) { 
     xs[i] = points[i*2]; 
     yx[i] = points[i*2 + 1]; 
    } 

    return new Polygon(xs, ys, numOfPOints); 
} 

तो फिर तुम के किसी भी संख्या के साथ विधि आह्वान कर सकते हैं बताते हैं

Polygon p = createPolygon(x1,y1,x2,y2,x3,y3);

+0

+1 इस पृष्ठ पर सभी उत्तरों तकनीकी रूप से सही हैं लेकिन यह मेरा अपवित्र हो जाता है क्योंकि यह * केवल * varargs (सर्वोत्तम उत्तर) का उल्लेख करता है और चीजों को ट्रिविया के साथ अव्यवस्थित नहीं करता है। – Asaph

+2

'i ++' के बजाय 'int (int i = 0; i BalusC

+0

और एक्सएस और वाईएस के लिए सूचकांक क्या होगा? –

1

मैं तुम्हें एक विधि है कि एक varar प्राप्त इस्तेमाल कर सकते हैं लगता है gs (...)

आप प्रत्येक बिंदु के लिए एक आवरण की जरूरत है:

class Point { 
    int x; 
    int y; 
    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

विधि हो सकता है:

myCommand(Point ... points) 
कॉल

myCommand(new Point(0,0), new Point(1,1), new Point(0,1)); 

लिए

और ड्रॉ के लिए:

Polygon mypoly = new Polygon(); 
for(Point p : points) 
    mypoly.addPoint(p.x,p.y); 
Draw.fillPolygon(g,mypoly,Color.blue); 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) पहले से मौजूद है (1.0 के बाद से)। पहिया का पुन: आविष्कार करने की कोई ज़रूरत नहीं है। – Asaph

+0

आपका अधिकार सही है। –

2

ब्रायन एग्नेव के उत्तर का विस्तार करने के लिए, यह पॉइंट क्लास जोड़ने के लायक भी हो सकता है जो ऐडपॉइंट्स विधि ले सकता है। यह आपके पॉलीगॉन से अंक जोड़ने/निकालने में थोड़ा आसान बना सकता है।

public final class Point<X,Y>{ 
    private final X x; 
    private final Y y; 

    public Point(X x, Y y){ 
     this.x=x; 
     this.y=y; 
    } 

    public X getX(){return x;} 

    public Y getY(){return y;} 
} 

तो फिर तुम एक हो सकता है:

public void addPoints(Point<Integer,Integer>... points){ 
    for(Point<Integer,Integer> point:points) 
     //your logic 
} 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) पहले से मौजूद है (1.0 के बाद से)। पहिया का पुन: आविष्कार करने की कोई ज़रूरत नहीं है। – Asaph

+0

मैं आम तौर पर सहमत हूं, लेकिन इस मामले के लिए एक अपरिवर्तनीय बिंदु वर्ग का उपयोग कुछ समझ में आता है, और यह कोड कई अन्य अनुप्रयोगों में पुन: प्रयोज्य है क्योंकि यह जेनेरिक का उपयोग करता है। –

+0

शायद इसे अलग करने के लिए कक्षा 'इमटेबल पॉइंट' नाम दें और कोड को इरादे का बेहतर वर्णन करें? – Asaph