2010-07-26 15 views
5

मैंने एक कस्टम आकार बनाया है, अनिवार्य रूप से यह चार आर्क 2 डी ऑब्जेक्ट्स का संग्रह है।जावा - एक कस्टम आकार भरना

जब इन आर्कों को खींचा जाता है तो वे एक चार बिंदु गोलाकार सितारा आकार, एक क्लॉवर की तरह माना जा सकता है। जहां एक चाप समाप्त होता है, दूसरा शुरू होता है। वे केंद्र में एक वर्ग बनाते हैं। तो कल्पना करें, एक वर्ग लेना और हर तरफ आधा सर्कल बनाना।

मैं इस आकृति को ग्राफिक्स 2 डी ऑब्जेक्ट में खींच सकता हूं, लेकिन जब मैं इसे भरता हूं, तो यह केवल आर्क को भर देगा, न कि केंद्र वर्ग। इस आंतरिक वर्ग को भरना मेरी समस्या है।

मैंने नीचे getPathIterator() विधि लागू की है। मैंने विधियों को भी लागू किया है। लेकिन यह अभी भी केवल arcs भर जाएगा।

मैंने Rectangle जोड़ने की कोशिश की। आकार भरते समय, आयत/वर्ग ठीक से भर दिया जाएगा, हालांकि यह आयताकार भी खींचता है, जो स्पष्ट रूप से अपेक्षित होना चाहिए, लेकिन निश्चित रूप से वांछित परिणाम नहीं।

तो, क्या किसी के पास इस तरह के आकार को "भरने" के बारे में कोई विचार है?

public PathIterator getPathIterator(AffineTransform at) { 
    GeneralPath gp = new GeneralPath 

    for (Arc2D arcs : this.arcs) { 
     gp.append(arc, false); 
    } 

    return gp.getPathIterator(at); 
} 
+0

के लिए घुमावदार नियम क्या आपके 'Arc2D' उदाहरणों को बंद करने के प्रकार है? – trashgod

उत्तर

4

जब भी मैं एक आकार बनाता हूं, तो मैं हमेशा पथ 2 डी। डबल ऑब्जेक्ट बनाता हूं। फिर, मैं पथ के चारों ओर स्थानांतरित करने के लिए प्रारंभिक स्थान पर जाने के लिए, और lineTo() और curveTo() का संयोजन करने के लिए move का उपयोग करता हूं। फिर, जब मैं कर रहा हूं, तो मैं क्लोजपैथ() को कॉल करता हूं। यह हमेशा सही ढंग से भर गया है।

मुझे GetPathIterator को लागू करने के साथ कोई अनुभव नहीं है, लेकिन मुझे लगता है कि आप closePath() नहीं करते हैं। मुझे नहीं पता कि यह आवश्यक है या नहीं, लेकिन मुझे लगता है कि मेरा दृष्टिकोण लेना अच्छा लगेगा।

यहाँ एक उदाहरण है कि एक गोलाकार आयत भरता है:

 
double width = 300; 
double height = 400; 
Path2D.Double path = new Path2D.Double(); 
path.moveTo(0.0, 8.0); 
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0); 
path.lineTo(width - 8.0, 0.0); 
path.curveTo(width, 0.0, width, 8.0, width, 8.0); 
path.lineTo(width, height - 8.0); 
path.curveTo(width, height, width - 8.0, height, width - 8.0, height); 
path.lineTo(8.0, height); 
path.curveTo(0.0, .height, 0.0, height - 8.0, 0, height - 8.0); 
path.closePath(); 
g2.fill(path); 
+0

मैं इसे एक शॉट देने जा रहा हूं। मैं क्लोजपैथ() को फोन कर रहा था लेकिन पाया कि उसने आखिरी चाप को बंद कर दिया था। – abrightwell

+0

यह निश्चित रूप से भरने की समस्या हल करता है। यह वास्तव में आकार पाने के लिए थोड़ा मुश्किल साबित हो रहा है, लेकिन यह वक्र समस्या की गणना है। – abrightwell

+0

बहुत सारे काम की आवश्यकता है, लेकिन आपको वही देता है जो आप चाहते हैं। धन्यवाद! –

0

बदलें GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO); 
संबंधित मुद्दे