2012-07-13 23 views
9

मैं जावा में एक 2 डी खेल बना रहा हूं बैठक के लिए Java2D लाइब्रेरी का उपयोग कर, और मैं वास्तव में एक नाव परिशुद्धता बहुभुज वस्तु की जरूरत है कि मैं खेल वस्तुओं आकर्षित करने के लिए दोनों का उपयोग कर सकते हैं और उन पर टक्कर पता लगाने क्या करना । दुर्भाग्यवश, जावा की पॉलीगॉन ऑब्जेक्ट केवल int परिशुद्धता में आती है, और आयताकार और आयताकार 2 डी के साथ समान समकक्ष पॉलीगॉन 2 डी नहीं है। मैंने यह देखने के लिए पहले से ही पर्याप्त शोध किया है कि मेरे पास कुछ विकल्प हैं, लेकिन उनमें से कोई भी बहुत अच्छा प्रतीत नहीं होता है।कार्यान्वयन Polygon2D 2 डी

  1. Path2D का प्रयोग करें। this forum में जावा डेवलपर पोस्टिंग के अनुसार, पॉलीगॉन 2 डी की कमी एक निरीक्षण थी, लेकिन इसका सुझाया गया प्रतिस्थापन पथ 2 डी है। दुर्भाग्यवश, पथ 2 डी टकराव का पता लगाने के लिए अपनी व्यक्तिगत शिखर या किनारों तक पहुंचने का एक तरीका प्रदान नहीं करता है (विशेष रूप से मुझे प्रत्येक किनारे पर वेक्टर ऑर्थोगोनल प्राप्त करने की आवश्यकता होती है)।

  2. मेरे अपने Polygon2D कि आकार इंटरफ़ेस लागू करता है को लागू करें ताकि मैं अभी भी Graphics2D.draw(Shape) करने के लिए इसे पारित कर सकते हैं। ऐसा लगता है कि यह बहुत मुश्किल होगा। आकार इंटरफ़ेस को contains(Rectangle2D) और getPathIterator(AffineTransform) जैसे कठिन-से-लागू विधियों की आवश्यकता होती है। विशेष रूप से getPathIterator के लिए, ऐसा लगता है कि इसे कार्यान्वित करने के लिए मुझे पथ प्रकार के प्रकार को वापस करने की आवश्यकता होगी, लेकिन सार्वजनिक एडब्ल्यूटी पैकेज में उपलब्ध पथइंटर इंटरफ़ेस का कोई ठोस कार्यान्वयन नहीं है।

  3. किसी ऑब्जेक्ट में लपेटें पथ 2 डी जो व्यक्तिगत वर्टिस को "याद करता है" और उन्हें क्लाइंट को प्रदान करता है। यह मेरे लिए काम करता था जब मुझे एक ऐसे क्षेत्र की आवश्यकता होती थी जिसने इसके घटक आकार को याद किया: मैंने इसे कंपाउंडशिप कक्षा में लपेट लिया जिसने आकार इंटरफ़ेस को कार्यान्वित किया और क्षेत्र के कार्यान्वयन के लिए सभी आकार विधियों को अग्रेषित किया, जबकि प्रत्येक आकार को ट्रैक करने के दौरान एक ArrayList में क्षेत्र। इसके साथ समस्या यह है कि यदि मैं float एस के दो एरे में अलग-अलग शिखरों का ट्रैक रखता हूं, तो उपयोगकर्ता को उनको उजागर करने की संभावना के बिना उपयोगकर्ता को बेनकाब करने का कोई तरीका नहीं है - और क्योंकि यह प्रत्यक्ष सरणी पहुंच से होता है , आंतरिक पथ 2 डी परिवर्तनों के बारे में सूचित नहीं किया जाएगा।

  4. Polygon.java कॉपी करें। जावा की पॉलीगॉन क्लास का वास्तविक स्रोत कोड grepcode.com पर उपलब्ध है, और मैं पॉलीगॉन 2 डी प्राप्त करने के लिए पूरे float के साथ वर्टेक्स से संबंधित int एस को प्रतिस्थापित कर सकता हूं। दुर्भाग्यवश, जब मैंने यह कोशिश की, तो लाइन import sun.awt.geom.Crossings; ने एक कंपाइलर त्रुटि फेंक दी और कहा कि "टाइप लाइब्रेरी आवश्यक लाइब्रेरी पर प्रतिबंध के कारण पहुंच योग्य नहीं है C: \ Program Files \ Java \ jre7 \ lib \ rt.jar।" this question के अनुसार ऐसा होता है क्योंकि सूर्य का लाइसेंस समझौता आपको कोर जावा क्लास को अपने आप से बदलने से रोकता है, लेकिन पॉलीगॉन ऐसा करने की कोशिश नहीं करता है - यह बस सूर्य का प्रकार ऑब्जेक्ट बनाता है sun.awt.geom.Crossings, कोई प्रतिस्थापन या विस्तार नहीं होता , और मैंने पॉलीगॉन की अपनी प्रतिलिपि को पैकेज में "जावा" नहीं कहा है।

इसके साथ आगे बढ़ने का सबसे अच्छा तरीका क्या है? मैं इन सुझावों में से किसी एक को कैसे काम करता हूं या किसी अन्य विकल्प के लिए एक विचार बनाने के लिए सुझावों की सराहना करता हूं जिसमें इन मुठभेड़ों की समस्या नहीं है।

+0

Google पर [जावा पॉलीगॉन 2 डी] (https://www.google.com/search?q=java+polygon2d&ie=utf-8&oe=utf-8&client=ubuntu&channel=fs) के लिए खोज [मुझे यह साइट] (http : //www.koders.com/java/fid058B5904198EB5BA18B9B086CC3B953F96CD2750.aspx) जो डबल-परिशुद्धता का उपयोग करके 'पॉलीगॉन 2 डी' है)। – dacwe

+1

ऐसा लगता है कि पॉलीगॉन 2 डी कोड sun.awt.geom.Crossings का भी उपयोग करता है, इसलिए इसे 'पॉलीगॉन' की प्रतिलिपि बनाने के प्रयास के रूप में वही समस्याएं होती हैं और इसे 'फ्लोट' का उपयोग करने के लिए बदलती हैं। – Edward

उत्तर

5

मैं भी Path2D की सिफारिश करेंगे। GeneralPath एक विरासत वर्ग है; इसका इस्तेमाल न करें।

Path2D, यह हालांकि एक राउंडअबाउट फैशन शिखर मूल्यों के लिए पहुँच प्रदान करता है।

PathIterator pi = path.getPathIterator(null); 
float[] value = new float[6]; 
float x = 0, y = 0; 

while (!pi.isDone()) { 
    int type = pi.currentSegment(values); 
    if (type == PathIterator.SEG_LINETO) { 
     x = values[0]; 
     y = values[1]; 
    } 
    else if (type == PathIterator.SEG_CLOSE) { 
     x = 0; 
     y = 0; 
    } 
    else { 
     // SEG_MOVETO, SEG_QUADTO, SEG_CUBICTO 
    } 
    pi.next(); 
} 

जब आप कल्पना प्राप्त करने के लिए तैयार हों, तो आप विस्तार कर सकते हैं कि और द्विघात और घन घटता समर्थन करने के लिए: आप एक PathIterator उपयोग करने के लिए की जरूरत है। मुझे लगता है कि आप इस समय उन लोगों की आवश्यकता नहीं है क्योंकि आप बहुभुज के बारे में बात कर रहे हैं।

इसके अलावा, पथ 2 डी में यह जांचने के लिए कुछ आसान स्थैतिक विधियां हैं कि पथ intersects एक आयताकार है और क्या पथ contains एक आयताकार या बिंदु है। अफसोस की बात है कि पथ को छेड़छाड़ करने या किसी अन्य पथ को जोड़ने के लिए परीक्षण करने के लिए कोई तरीका नहीं है।

+1

मैं पथ 2 डी/पथ 2 डी चौराहे और एक पथ के प्रत्येक सेगमेंट पर पुनरावृत्ति करके और प्रत्येक पथ के प्रत्येक सेगमेंट पर पुनरावृत्त करके, इस तरह के सेगमेंट के लिए परीक्षण करके परीक्षण करता हूं। यह ओ (एन^2) है, लेकिन मुझे लगता है कि यह अपरिहार्य है। प्रत्येक दो सेगमेंट (प्रत्येक पथ से एक) के लिए, मैं चौराहे के लिए परीक्षण करता हूं। यदि किसी भी दो सेगमेंट के बीच कोई छेड़छाड़ नहीं है, तो मैं दूसरे पथ के अंदर मौजूद प्रत्येक पथ से एक बिंदु के लिए परीक्षण करता हूं। यदि दोनों परीक्षण विफल हो जाते हैं, तो न तो पथ छेड़छाड़ करता है, न ही संलग्न होता है। –

0

क्या आप तृतीय पक्ष लाइब्रेरी का उपयोग कर सकते हैं? यदि ऐसा है, तो क्या मैं Slick 2D Polygon कक्षा का उपयोग करने का सुझाव दे सकता हूं। मैं आंतरिक रूप से क्या करूँगा, इस कक्षा का उपयोग अपने वास्तविक पॉलीगॉन के लिए contains के साथ छेड़छाड़ की जांच करने के लिए करें और फिर जब आपको आकर्षित करने की आवश्यकता हो, तो float मानों को int पर डालें और जावा 2 डी पॉलीगॉन बनाएं।

मुझे पता है कि यह इष्टतम समाधान नहीं हो सकता है, लेकिन यह आपके द्वारा किए जा रहे कार्यों के लिए काम कर सकता है।

0

शायद बहुभुज के आंतरिक स्तर पर एक अलग पैमाने पर हैं?

इसे लिखते समय एक बड़ी संख्या और टाइपकास्ट int में गुणा करके, पढ़ने के दौरान एक ही बड़ी संख्या से विभाजित करें?