मैं हर परत पर मध्य वृत्त एल्गोरिथ्म चल रहा एक बार आप डंडे तक पहुँचने के वांछित परिणाम दे देंगे, जैसा कि आप सतह में अंतराल जहां एल ई डी नहीं हैं होगा विश्वास नहीं करते ज्योतिर्मय । यह परिणाम आपको दे सकता है, हालांकि, यह सौंदर्यशास्त्र तक होगा। यह पोस्ट मिडपॉइंट सर्कल एल्गोरिदम का उपयोग मध्य दो लंबवत ऑक्टेट्स के माध्यम से परतों के त्रिज्या को निर्धारित करने के लिए किया जाता है, और फिर उन सर्किलों में से प्रत्येक को ध्रुवीय ऑक्टों के लिए अंक निर्धारित करते समय भी चित्रित करता है।
मुझे लगता है कि @ निक उडल की टिप्पणी पर आधारित है और here आपके क्षैतिज टुकड़े के त्रिज्या को निर्धारित करने के लिए सर्कल एल्गोरिदम का उपयोग करके जवाब देगा जो मैंने अपने उत्तर पर एक टिप्पणी में प्रस्तावित एक संशोधन के साथ काम किया है। एक प्रारंभिक त्रुटि इनपुट के रूप में लेने के लिए सर्कल एल्गोरिदम को संशोधित किया जाना चाहिए, और ध्रुवीय ऑक्टेंट्स के लिए अतिरिक्त अंक भी आकर्षित करना चाहिए।
y0 + y1
और y0 - y1
पर मानक चक्र एल्गोरिथ्म अंक ड्रा: x0 +/- x, z0 +/- z, y0 +/- y1
, x0 +/- z, z0 +/- x, y0 +/- y1
, कुल 16 अंक। यह गोलाकार के लंबवत का बड़ा रूप बनाता है।
- इसके अतिरिक्त अंक
x0 +/- y1, z0 +/- x, y0 +/- z
और x0 +/- x, z0 +/- y1, y0 +/- z
, कुल 16 अंक, जो क्षेत्र के लिए ध्रुवीय कैप्स बनाएंगे।
सर्कल एल्गोरिदम में बाहरी एल्गोरिदम की त्रुटि को पार करके, यह प्रत्येक परत के सर्कल के उप-वोक्सल समायोजन की अनुमति देगा। आंतरिक एल्गोरिदम में त्रुटि को पारित किए बिना, सर्कल का भूमध्य रेखा एक सिलेंडर के लिए अनुमानित किया जाएगा, और एक्स, वाई, और जेड अक्ष पर प्रत्येक अनुमानित क्षेत्र का चेहरा एक वर्ग बन जाएगा। त्रुटि में शामिल होने के साथ, प्रत्येक चेहरे को एक बड़ा पर्याप्त त्रिज्या दिया जाता है जिसे एक भरे सर्कल के रूप में अनुमानित किया जाएगा।
निम्नलिखित कोड विकिपीडिया के Midpoint circle algorithm से संशोधित किया गया है। DrawCircle
एल्गोरिदम में xz-plane में संचालित करने के लिए नामकरण बदल गया है, तीसरा प्रारंभिक बिंदु y0
, वाई ऑफसेट y1
, और प्रारंभिक त्रुटि error0
के अतिरिक्त। DrawSphere
तीसरे प्रारंभिक बिंदु y0
लेने के लिए एक ही समारोह से संशोधित और कॉल DrawCircle
बल्कि DrawPixel
public static void DrawCircle(int x0, int y0, int z0, int y1, int radius, int error0)
{
int x = radius, z = 0;
int radiusError = error0; // Initial error state passed in, NOT 1-x
while(x >= z)
{
// draw the 32 points here.
z++;
if(radiusError<0)
{
radiusError+=2*z+1;
}
else
{
x--;
radiusError+=2*(z-x+1);
}
}
}
public static void DrawSphere(int x0, int y0, int z0, int radius)
{
int x = radius, y = 0;
int radiusError = 1-x;
while(x >= y)
{
// pass in base point (x0,y0,z0), this algorithm's y as y1,
// this algorithm's x as the radius, and pass along radius error.
DrawCircle(x0, y0, z0, y, x, radiusError);
y++;
if(radiusError<0)
{
radiusError+=2*y+1;
}
else
{
x--;
radiusError+=2*(y-x+1);
}
}
}
त्रिज्या 4 (जो वास्तव में 9x9x9 की आवश्यकता है) के एक क्षेत्र के लिए की तुलना में, इस के तीन पुनरावृत्तियों चल पाएंगे था DrawCircle
दिनचर्या, पहली बार एक सामान्य त्रिज्या 4 सर्कल (तीन चरणों) को चित्रित करने के साथ, दूसरा त्रिज्या 4 सर्कल को 0 की प्रारंभिक त्रुटि (तीन चरणों) के साथ चित्रित करता है, और फिर तीसरा ड्राइंग त्रिज्या 3 सर्कल प्रारंभिक त्रुटि 0 के साथ (भी तीन कदम)। यह 9 गणना अंकों के साथ समाप्त होता है, प्रत्येक 32 पिक्सल ड्राइंग करता है। जो 32 (प्रति सर्कल अंक) x 3 बनाता है (प्रति बिंदु संचालन जोड़ें या घटाएं) + 6 (प्रतिवर्तन, घटाना, प्रति पुनरावृत्ति प्रति संचालन) = 102 प्रति गणना बिंदु को जोड़ना, घटाना या स्थानांतरित करना। इस उदाहरण में, प्रत्येक सर्कल = 306 संचालन प्रति परत के लिए यह 3 अंक है।त्रिज्या एल्गोरिदम भी प्रति परत 6 ऑपरेशंस जोड़ता है और 3 बार पुनरावृत्त करता है, इसलिए 306 + 6 * 3 = 936
4.के उदाहरण त्रिज्या के लिए मूल अंकगणितीय परिचालन। यहां लागत यह है कि आप अतिरिक्त स्थिति जांच के बिना बार-बार कुछ पिक्सल सेट करेंगे (यानी x = 0, y = 0, या z = 0), इसलिए यदि आपका I/O धीमा है तो आप स्थिति जांच जोड़ने से बेहतर हो सकते हैं। मानते हैं कि सभी एल ई डी शुरू होने पर मंजूरी दे दी गई थी, उदाहरण सर्कल 288 एल ई डी सेट करेगा, जबकि कई कम एल ई डी हैं जो दोहराने वाले सेटों के कारण वास्तव में जलाए जाएंगे।
ऐसा लगता है कि यह 8x8x8 ग्रिड में फिट होने वाले सभी क्षेत्रों के लिए ब्रूटफोर्स विधि से बेहतर प्रदर्शन करेगा, लेकिन ब्रूटफोर्स विधि में त्रिज्या के बावजूद लगातार समय होगा, जबकि यह विधि बड़े त्रिज्या के क्षेत्र को चित्रित करते समय धीमा हो जाएगी केवल एक हिस्सा प्रदर्शित किया जाएगा। चूंकि डिस्प्ले क्यूब रिज़ॉल्यूशन में बढ़ता है, हालांकि, यह एल्गोरिदम समय लगातार रहेगा जबकि ब्रूटफोर्स बढ़ेगा।
एलईडी क्षेत्र के आधार पर हमें यह मानना चाहिए कि आपको किसी भी तरह के क्षेत्र के आंतरिक क्षेत्र की आवश्यकता है? – NominSim
@NominSim मुझे ऐसा नहीं लगता है। इस मामले में वह ब्रेसनहेम के सर्कल रास्टरराइजेशन के बारे में बात नहीं करेंगे और सिर्फ जैप्रिस 'ब्रूट फोर्स सॉल्यूशन का उपयोग कर सकते हैं। –
@ क्रिस्टियन वास्तव में, मैं दोनों विकल्प रखना चाहता हूं। –