2011-04-21 13 views
5

मैं एक परियोजना है कि मुझे आवश्यकता है सही ढंग से पिक्सल कि (लगभग) परिपत्र उत्तेजनाओं आकर्षित करने के लिए उपयोग किया जाता है की संख्या को नियंत्रित करने के लिए पर काम कर रहा हूँ की एक विशिष्ट संख्या के साथ एक चक्र ड्रा, और हालांकि Bresenham के एल्गोरिदम महान हैं, वे डॉन ' एक मनमाना क्षेत्र (मेरे ज्ञान के लिए) की मंडल खींचें। मैंने स्क्रिप्ट्स की कोशिश की है जो वांछित क्षेत्र प्लॉट किए जाने पर ब्रेसनहेम के एल्गोरिदम को बाधित करते हैं, लेकिन परिणाम निश्चित रूप से हिट-या-मिस हैं। क्या किसी को दिए गए पिक्सल का उपयोग करके "सर्वश्रेष्ठ" सर्कल (कुछ हद तक व्यक्तिपरक, मुझे पता है) को साजिश करने का तरीका पता है? बहुत धन्यवाद!पिक्सल

+0

आपके द्वारा वर्णित तरीके से ब्रेसनहेम के एल्गोरिदम में बाधा डालने में समस्या क्या है? –

+2

क्या आप काले और सफेद चित्रित कर रहे हैं या क्या आपको एंटीअलाइजिंग का उपयोग करने की अनुमति है? – svick

उत्तर

1

सर्कल का क्षेत्र ए = पीआई * आर है। आप क्षेत्र से शुरू कर रहे हैं और (स्पष्ट रूप से) त्रिज्या चाहते हैं, इसलिए हम दोनों पक्षों को पीआई द्वारा विभाजित करने के लिए विभाजित करते हैं: आर = ए/पीआई। दोनों तरफ के वर्ग रूट लेना हमें देता है: r=sqrt(A/pi)। एक बार जब आप त्रिज्या हो जाते हैं, तो अधिकांश सामान्य एल्गोरिदम के साथ ड्राइंग सरल होना चाहिए।

5

, यह कर उदाहरण के लिए का मोटे तौर पर जिस तरह से:

क्षेत्र 1000 वर्ग पिक्सल के एक वृत्त की त्रिज्या sqrt (1000/अनुकरणीय) = 17.8 है ... यही कारण है कि चक्र फिर एक 35x35 मैट्रिक्स में फिट करना चाहिए। यदि आप उस मैट्रिक्स के लिए "इंडेक्स" बनाते हैं जहां केंद्रीय पिक्सेल (0,0) है, तो आप आसानी से जांच सकते हैं कि पिक्सेल सर्कल में पड़ता है या सर्कल x^2 + y^2 = r के समीकरण में प्रतिस्थापन द्वारा नहीं^2। या आप (ए, बी) पर केंद्रित एक सर्कल के लिए वैकल्पिक समीकरण का उपयोग कर सकते हैं। यदि यह सत्य का मूल्यांकन करता है, तो यह नहीं करता है, यदि नहीं, तो यह सर्कल के बाहर है।

एक स्यूडोकोड/उदाहरण के रूप में, पायथन में मैं का एक अनुकूलित संस्करण करना होगा:

import numpy, math 

target_area = 1000.0 

r = (target_area/math.pi) ** 0.5 
m = numpy.zeros((2*r+2,2*r+2)) 

a, b = r, r 

for row in range(0, m.shape[0]): 
    for col in range(0, m.shape[1]): 
     if (col-a)**2 + (row-b)**2 <= r**2: 
      m[row,col] = 1 

numpy.sum(m) 
#>>> 999 

यहाँ जब लक्षित क्षेत्र 100,000 पिक्सल है परिणाम है (वास्तविक चक्र उत्पन्न 99988.0 है): circle

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

0

मेरा पहला विचार उप-पिक्सेल परिशुद्धता के साथ एल्गोरिदम का उपयोग करना है। गौर करें कि क्या होता है यदि आपके केंद्र में तर्कहीन निर्देशांक हैं और आप धीरे-धीरे त्रिज्या को बढ़ाते हैं। यह सर्किट में शामिल होने के कारण परिधि के चारों ओर यादृच्छिक पिक्सेल भर जाएगा। आप समरूपता से बचना चाहते हैं जो सर्कल के 4 चतुर्भुज एक ही समय में पिक्सेल जोड़ते हैं ताकि आप जोड़े जाने वाले सिंगल पिक्सल के करीब आ सकें। इस तरह कुछ कैसे लागू किया जा सकता है मेरे पास कोई सुराग नहीं है।

मुझे एक बार 3 डी संस्करण का एक उदाहरण हल करना पड़ा। मुझे 255 से कम या उसके बराबर होने के लिए गोलाकार बिंदुओं के एक सेट की आवश्यकता थी। आईआईआरसी अगर आर * आर = 15 क्षेत्र के अंदर 240 अंक हैं। हालांकि मैं 255 बिल्कुल प्राप्त करने से चिंतित नहीं था।

0

माना जाता है आप में कुल 2000 पिक्सेल कि अपना पूरा चक्र बनाने चाहिए। पूरा से मेरा मतलब है पिक्सल में कोई टूटना नहीं होनी चाहिए और एक दूसरे से कनेक्ट होना चाहिए। चूंकि 2 पीआई * आर = परिधि, सर्कल के व्यास की चलती लंबाई, यह आपके पास पिक्सेल की कुल मात्रा है। अब बस आर = 2000/2 * पीआई लिखें और यह आपको त्रिज्या देगा। अब आप 2000 पिक्सल वाले सर्कल को आकर्षित करने में सक्षम होना चाहिए। मुझे आशा है कि यह वही है जो आप चाहते थे।

1

एक साधारण (लेकिन कुछ हद तक बेवकूफ दृष्टिकोण) किसी दिए गए त्रिज्या के लिए ब्रेसेनहम के एल्गोरिदम द्वारा खींचे गए पिक्सेल की संख्या को गिनना होगा, और तब त्रिज्या को खोजने के लिए बाइनरी खोज का उपयोग करें जो पिक्सेल की वांछित संख्या उत्पन्न करता है।

0

के एक पल के लिए पिक्सल के बारे में भूल करते हैं और के माध्यम से बुनियादी गणित/ज्यामिति भी काम करें।

हम सभी जानते हैं कि

एक वृत्त का क्षेत्रफल = पी * त्रिज्या^2

जो एक सर्किल = पी * की कह

क्षेत्र के रूप में ही है (व्यास/2)^2

हम सभी जानते हैं कि

सर्किल को घेरने वाले स्क्वायर का क्षेत्र (यानी। वर्ग के प्रत्येक पक्ष सर्कल के स्पर्श) = व्यास * व्यास है

इस प्रकार

स्क्वायर क्षेत्र = सर्किल क्षेत्र/स्क्वायर क्षेत्र के सर्किल क्षेत्र का अनुपात = (पी * (व्यास/2)^2)/(व्यास * व्यास) = पी/4

अब हम एक चक्र और एक पिक्सेल के साथ वर्ग है मान लेते हैं इतना बड़ा गिनती ताकि हम परेशानी बढ़त बारे में चिंता करने की जरूरत नहीं है चलो सर्कल की सीमा के आसपास के मामले। असल में एक सेकंड के लिए मान लें कि हमारे पास बहुत बड़ा व्यास है (शायद 10,000 या शायद अनंत भी)। इस धारणा के साथ निम्नलिखित रखती है:

पिक्सल की संख्या सर्किल = (पिक्सल की संख्या स्क्वायर में) में * (स्क्वायर क्षेत्र के सर्किल क्षेत्र का अनुपात)

के लिए दूसरे शब्दों में पर्याप्त रूप से बड़ी संख्या में पिक्सेल, पूरी तरह से खींचे गए वर्ग के लिए पूरी तरह से खींचे गए सर्कल के क्षेत्रों का अनुपात पिक्सेल वाले सर्कल में पिक्सल की संख्या के अनुपात को पिक्सेल वाले वर्ग में पिक्सल की संख्या के अनुपात का अनुमान लगाएगा।

अब पिक्सेल वाले वर्ग में, उस वर्ग में पिक्सल की संख्या पिक्सल की संख्या के दौरान पिक्सेल की संख्या के बराबर होती है। या दूसरे शब्दों में यह वर्ग का व्यास (पिक्सेल में) वर्ग है। आइए स्क्वायर के पिक्सेल व्यास डी पर कॉल करें। इसलिए हम ऊपर सूत्रों के साथ प्रतिस्थापन है:

पिक्सल की संख्या में सर्किल = (घ * घ) * (पी/4)

तो अब के लिए घ का समाधान करते हैं

d = Sqrt (4 * (अंक सर्कल में पिक्सल)/ऑफ़ पाई)

खैर हमने कहा पहले कि डी वर्ग का व्यास था। वैसे यह सर्कल का व्यास भी होता है।

सर्किल = Sqrt (4 * (वांछित पिक्सल की संख्या सर्किल क्षेत्र में)/ऑफ़ पाई व्यास: तो जब आप पिक्सल की एक निश्चित संख्या के साथ एक चक्र आकर्षित करने के लिए चाहते हैं, आप व्यास किया जा रहा है के साथ एक वृत्त)

अब स्पष्ट रूप से आप गोलाई और बहुत आगे है (वहाँ एक भिन्नात्मक पिक्सेल जैसी कोई चीज नहीं है) के बारे में कुछ विकल्प बनाने के लिए है, लेकिन आप बात समझ। साथ ही, यह सूत्र अधिक सटीक है क्योंकि सर्कल के क्षेत्र के लिए इच्छित पिक्सेल की वांछित संख्या बढ़ जाती है। पिक्सेल की थोड़ी मात्रा के लिए राउंडऑफ त्रुटि आपको पिक्सेल की सही संख्या नहीं दे सकती है।

+1

हमें पिक्सेल के बारे में नहीं भूलना चाहिए! पिक्सेल की संख्या क्षेत्र के बराबर है क्योंकि प्रत्येक पिक्सेल में 1 वर्ग पीएक्स का क्षेत्र होता है। उपर्युक्त विधि व्यास को खोजने का एक बहुत ही ठोस तरीका है। इन सबके लिए कोई ज़रूरत नहीं है, केवल सर्कल के क्षेत्र के लिए मूल सूत्र का उपयोग करें, ए = पीआई * (2 डी)^2 और डी या यहां तक ​​कि सरल के लिए हल करें, त्रिज्या का उपयोग करें ... – Benjamin

+0

आप सही हैं - इसे देखने के बाद दूसरी बार - यह बहुत ही शांत था। –

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