एक नंबर को एक मिनट से अधिकतम कैसे सेट करें दूसरे मिनट में अधिकतम सेट करें? [बन्द है]


19

मैं इलाके की पीढ़ी कर रहा हूं और मेरे पास एक पेरेलिन लाइब्रेरी है जो मुझे -1 और +1 के बीच यादृच्छिक संख्या दे रही है। मैं इसे 0-255 के पैमाने पर बदलना चाहता हूं। ऐसा करने का उचित तरीका क्या है?

जवाबों:


23

आधार सूत्र है:

Result := ((Input - InputLow) / (InputHigh - InputLow))
          * (OutputHigh - OutputLow) + OutputLow;

आपका मुकदमा:

परिणाम: = (( इनपुट - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

यहां से आप रूपांतरण का अनुकूलन कर सकते हैं यदि आपके गुणांक स्थिर हैं, लेकिन संकलक संभवतः इसे स्वयं भी करेंगे।

परिणाम: = (( इनपुट - -1 ) / 2 ) * 255 + 0 ;

परिणाम: = इनपुट * 127.5 + 127.5 ;


2
इस जवाब ने मेरे प्रोग्रामर के दिमाग को सबसे ज्यादा प्रभावित किया। :) अपने महान जवाब के लिए बाकी सभी के लिए "धन्यवाद"।
थरका

10

रेंज -1के लिए 1की कुल सीमा है 2। इसलिए आपको इसे प्राप्त करने के लिए उचित पैमाने पर करने की आवश्यकता है255 । कुछ इस तरह:

(randomPerlin + 1.0) * 127.5

तो आप पहले जोड़ते हैं 1, 0..2फिर से गुणा करने के लिए127.5 एक श्रेणी प्राप्त करने के लिए करने के लिए0..255


3

स्केलिंग और पूर्वाग्रह की शक्ति के माध्यम से।

अपने मूल्य से, अपनी सीमा के न्यूनतम मूल्य को घटाएं। यह आपको [0..2] रेंज में एक मूल्य देगा।

विभाजित करें कि स्रोत रेंज की चौड़ाई से, आपको रेंज में एक मान दिया जाता है [0..1]।

गुणा करें कि लक्ष्य सीमा की चौड़ाई से, आपको सीमा में एक मान दिया जाता है [0..255]।

लक्ष्य श्रेणी में मान प्राप्त करने के लिए लक्ष्य श्रेणी के आधार को जोड़ें, जो इस स्थिति के लिए पिछले चरण के समान है।

संक्षेप में:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin

उम्मीद है की यह मदद करेगा।


2

इनपुट रेंज का अनुवाद करें ताकि हम 1 (मिनट इनपुट का ऋणात्मक मान) जोड़कर शून्य प्राप्त करें - 1 - 1 -> 0 .. 2

जैसा कि आउटपुट रेंज शून्य से शुरू होता है, उसके लिए कुछ भी न करें।

नई इनपुट रेंज को स्केल करें ताकि यह आउटपुट रेंज को फिट करे, यह आसान है क्योंकि अब वे दोनों शून्य से शुरू होते हैं: मान 255/2 0..2 * 2/255 -> 0..255 से गुणा करें

किया हुआ!

उदाहरण:

0.5 जाएगी: (0.5 + 1) * 127.5 = 191.25 -0.5 जाएगी: (-0.5 + 1) * 127.5 = 63.75


2

कहते हैं xकि मूल इनपुट है और yअपेक्षित आउटपुट है। हमारे पास कम से कम दो बिंदु हैं (x, y) (-1, 0) (1, 255)

चूँकि हम एक रेखीय प्रक्षेप करना चाहते हैं जो हम प्रपत्र के समीकरण में देख सकते हैं y = m*x + c

उपरोक्त दो बिंदुओं के साथ, हम हल कर सकते हैं mऔरc एक बार यह हो जाने पर, आपको परिवर्तन समीकरण मिल जाएगा।

ध्यान दें कि यह विधि अन्य प्रकार के समीकरणों के लिए भी काम करती है। उदाहरण के लिए यदि आप एक घातीय या द्विघात प्रक्षेप चाहते हैं।


हमारे क्षेत्र में, रैखिक प्रक्षेप का सामान्य अर्थ यह है कि आप इस तरह से सम्मिश्रण कारक के साथ दो मात्राओं के बीच रैखिक मिश्रण करते हैं v = (1-a)*x + (a)*y:। मैं यह नहीं देखता कि इस उत्तर में पूछे गए प्रश्न की कितनी प्रासंगिकता है क्योंकि वह जो चाहता है वह एक रेंज मैपिंग है।
लार्स विकलंड

विमान में दो बिंदु विशिष्ट रूप से एक रेखा को परिभाषित करते हैं। हम रेंज मैपिंग को सीधी रेखा के रूप में मान सकते हैं। और हम उस लाइन पर दो बिंदु जानते हैं। इसे हल करने से लाइन समीकरण मिलेगा। हो सकता है कि रेखीय प्रक्षेप यहाँ सही शब्द न हो, लेकिन मैं इस पंक्ति में उन दो बिंदुओं के बीच के आंतरिक बिंदुओं को सेट करना चाहता था।
अंकुश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.