2008-10-02 16 views
5

एक समकोण पूर्णांकोंएक यादृच्छिक क्रम

मैं एक बार और केवल एक बार त्रिकोण में प्रत्येक पिक्सेल (*) प्लॉट करने के लिए चाहते हैं पर से < = ग एक समीकरण ax + द्वारा निर्दिष्ट के लिए में एक त्रिकोण में अंक यात्रा पर जाने वाले, एक छद्म यादृच्छिक क्रम में, और पहले हिट पॉइंट्स की एक सूची संग्रहीत किए बिना।

मुझे पता है कि 0 और एक्स

एक यादृच्छिक point'o लेने के बीच एक रेखा खंड के साथ ऐसा करना 'रेखा के साथ,
पिकअप' पी 'है कि अपेक्षाकृत एक्स
दोहराने के लिए प्रधानमंत्री है एक्स गुना तक के लिए: हे अगले = (ओ मौजूदा + पी) एमओडी एक्स

एक त्रिकोण
, मैं करूंगाके लिए ऐसा करने के लिए1. त्रिकोण बिना में पिक्सेल की संख्या की गिनती करने की आवश्यकता को सूचीबद्ध
2. कुल्हाड़ी में नक्शा एक पूर्णांक 0..points, वाई जोड़ी है कि त्रिकोण

मुझे आशा है कि किसी भी समाधान सामान्यीकृत किया जा सकता है अंदर एक वैध पिक्सेल है पिरामिड और उच्च आयामी आकार के लिए।

(*) मैं पूर्णांक बिंदु एक्स, वाई की जोड़ी के लिए सीजी टर्म पिक्सेल का उपयोग करता हूं जैसे समीकरण संतुष्ट है।

उत्तर

3

चूंकि आप एक बार और केवल एक बार प्रत्येक पिक्सेल का दौरा करने की गारंटी देना चाहते हैं, तो असली त्रिकोणों की बजाय पिक्सेल के संदर्भ में शायद सोचना बेहतर होता है। आप क्षैतिज त्रिकोण को टुकड़ा कर सकते हैं और क्षैतिज scan lines का गुच्छा प्राप्त कर सकते हैं। स्कैन लाइनों को एकसाथ कनेक्ट करें और आपने अपनी "त्रिभुज" को एक लंबी रेखा में परिवर्तित कर दिया है। स्कैन लाइनों की अपनी लंबी श्रृंखला में अपने बिंदु पर जाने वाले एल्गोरिदम लागू करें।

वैसे, यह मानचित्रण केवल कागज पर होने की आवश्यकता है, आपको केवल एक ऐसा फ़ंक्शन है जो वर्चुअल स्कैन लाइन के साथ (x, y) दिया गया (टी) लौटा सकता है।

संपादित करें: दो बिंदुओं को एक रेखा खंड में बदलने के लिए, आप Bresenham's scan conversion देख सकते हैं। एक बार जब आप 3 लाइन खंडों को अंक की श्रृंखला में परिवर्तित कर लेते हैं, तो आप सभी बिंदुओं को एक बाल्टी में डाल सकते हैं और y द्वारा सभी बिंदुओं को समूहित कर सकते हैं। उसी वाई-वैल्यू के भीतर, x द्वारा क्रमबद्ध करें। वाई-वैल्यू के भीतर सबसे छोटा एक्स स्कैन लाइन का प्रारंभ बिंदु है और वाई-वैल्यू के भीतर सबसे बड़ा एक्स स्कैन लाइन का अंत बिंदु है। इसे "स्कैन कनवर्टिंग त्रिकोण" कहा जाता है। यदि आप Google हैं तो आप अधिक जानकारी प्राप्त कर सकते हैं।

+0

ऐसा लगता है कि स्कैन लाइन की एक सूची की आवश्यकता होती है, और यह निर्धारित करने के लिए कि कौन सी रेखा किसी दिए गए नंबर को दर्शाती है, उसे संरचना (संतुलित पेड़?) को सामान्य करने की कोशिश करना सामान्य रूप से नियंत्रण से बाहर निकलता है हालांकि –

+0

टी को मानचित्र करना है (x, y) के सेट को सही करने के लिए, इसलिए फ़ंक्शन के भीतर यह विंडोज प्रोग्रामर के दृष्टिकोण का उपयोग कर सकता है और आयताकार आयत से बिंदु उठा सकता है और त्रिकोण में नहीं होने पर "झूठा" वापस कर सकता है। –

+0

त्रिकोण के समीकरण को देखते हुए, (x, y) = f (t) के लिए कोई फ़ंक्शन कैसा दिखता है? –

0

एक विधि सभी पिक्सल को सरणी में रखना है और फिर सरणी को घुमाएं (यह ओ (एन) है), फिर शफल किए गए सरणी में क्रम में पिक्सल पर जाएं। यद्यपि यह काफी स्मृति की आवश्यकता हो सकती है।

0

यहां एक विधि है जो कुछ CPU समय को बर्बाद कर देती है लेकिन संभवतः जितना अधिक जटिल विधि उतनी बर्बाद नहीं होती है।

त्रिभुज को घेरने वाले आयताकार की गणना करें। आयत को "रैखिकरण" करना आसान होगा, प्रत्येक स्कैन लाइन अगले के बाद होगी। आयत के पिक्सेल को पार करने के लिए पहले से ही एल्गोरिदम का उपयोग करें जिसे आप पहले ही जानते हैं। जब आप प्रत्येक पिक्सेल को दबाते हैं, तो जांचें कि पिक्सेल त्रिभुज में है या नहीं, और यदि नहीं तो इसे छोड़ दें।

2

यहां Triangle Point Picking का समाधान है।

आपको अपने त्रिकोण के दो वैक्टर (पक्ष) चुनने के लिए क्या करना है, प्रत्येक को यादृच्छिक संख्या के साथ गुणा करें [0,1] और उन्हें जोड़ें। यह वैक्टर द्वारा परिभाषित चतुर्भुज में एक समान वितरण प्रदान करेगा। आपको यह जांचना होगा कि परिणाम मूल त्रिकोण के अंदर है या नहीं; अगर यह या तो इसे वापस नहीं बदलता है या बस इसे त्याग देता है और पुनः प्रयास करता है।

+0

वितरण फ्लोटिंग पॉइंट स्पेस में है, हालांकि - क्या यह अभी भी पूर्णांक पिक्सल पर लागू होता है? मैं नहीं देख सकता कि इसका पूरा कवरेज प्राप्त करने के लिए इसका उपयोग कैसे किया जा सकता है .. केवल संभवतः पूरा कवरेज? –

+1

आप सही हैं। मैंने इसे लिखने के बाद मुझे एहसास हुआ कि यह वह नहीं था जिसे आप पूछ रहे थे। मैं अपना जवाब हटाने जा रहा था, लेकिन शायद किसी और को यह उपयोगी लगेगा। : 0) – efotinis

0

मैं त्रिभुज की रेखाओं को एकल रेखा के रूप में मानता हूं, जो सेगमेंट में कटौती की जाती है। खंडों को एक सरणी में संग्रहीत किया जाएगा जहां सेगमेंट की लंबाई भी लाइनों की कुल लंबाई में ऑफसेट के साथ ही ऑफसेट भी संग्रहीत की जाएगी। फिर ओ के मान के आधार पर, आप चुन सकते हैं कि कौन सा सरणी तत्व उस पिक्सेल में है जिसे आप उस पल में उस पल में आकर्षित करना चाहते हैं और तत्व में मानों के आधार पर पिक्सेल पेंट करें।

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