मैथेमेटिका में मेरे आकाश के रंग की गणना गलत क्यों है?


17

मैं इस पेपर (पेरेस 'मॉडल) के आधार पर आकाश के रंग की गणना करने के लिए एक एल्गोरिथ्म को लागू करने की कोशिश कर रहा हूं । इससे पहले कि मैं shader की प्रोग्रामिंग शुरू करूँ मैं Mathematica में अवधारणा का परीक्षण करना चाहता था। पहले से ही कुछ समस्याएँ हैं जिन्हें मैं दूर नहीं कर सकता। हो सकता है कि किसी ने पहले ही एल्गोरिथम लागू कर दिया हो।

मैंने पूर्ण आंचलिक प्रकाश के लिए समीकरणों के साथ शुरुआत की Yz, xzऔर yzजैसा कि कागज में प्रस्तावित है (पृष्ठ 22)। मान Yzउचित प्रतीत होते हैं। निम्न आरेख 5 Yzकी अशांति के लिए सूर्य के जन्मजात दूरी के एक कार्य के रूप में दिखाता है T:

YZ (z)

फ़ंक्शन गामा (ज़ेनिथ, एज़िमुथ, सोलरज़ेनथ, सोलरज़िमुथ) दिए गए स्थान पर दिए गए ज़ेनिटल दूरी और एज़िमथ और सूरज के साथ एक बिंदु के बीच के कोण की गणना करता है। यह कार्य भी लगता है। निम्न आरेख इस कोण को दिखाता है solarzenith=0.5और solarazimuth=0zenithऊपर से नीचे बढ़ता है (0 से पाई / 2), azimuthबाएं से दाएं बढ़ता है (-पी से पाई)। आप स्पष्ट रूप से सूर्य की स्थिति (उज्ज्वल स्थान, कोण शून्य हो जाता है) देख सकते हैं:

गामा (चरम पर, दिगंश, 0.5,0)

पेपर में दिए गए पेरेस फ़ंक्शन (एफ) और गुणांक को लागू किया गया है। तब रंग मान Yxy होना चाहिए absolute value * F(z, gamma) / F(0, solarzenith)। मैं उन मूल्यों की सीमा [0,1] के भीतर होने की उम्मीद करता हूं। हालाँकि, यह Y घटक के लिए मामला नहीं है (विवरण के लिए नीचे अद्यतन देखें)। यहाँ कुछ नमूना मान दिए गए हैं:

{Y, x, y}
{19.1548, 0.25984, 0.270379}
{10.1932, 0.248629, 0.267739]
{20.0393, 0.268119, 0.280024}

यहाँ वर्तमान परिणाम है:

RGB इमेज

सभी गणनाओं के साथ गणित नोटबुक यहाँ और पीडीएफ संस्करण यहाँ पाया जा सकता है

क्या किसी को इस बात का अंदाजा है कि पेपर के समान परिणाम प्राप्त करने के लिए मुझे क्या बदलना होगा?

C कोड की तरह

// this function returns the zenital Y component for 
// a given solar zenital distance z and turbidity T
float Yz(float z, float T)
{
    return (4.0453 * T - 4.9710)*tan( (4.0f/9-T/120)*(Pi-2*z) ) - 0.2155 * T + 2.4192
}

// returns zenital x component
float xz(float z, float T)
{
    return //matrix calculation, see paper
}

// returns zenital y component
float yz(float z, float T)
{
    return //matrix calculation, see paper
}

// returns the rgb color of a Yxy color
Color RGB(float Y, float x, float y)
{
    Matrix m; //this is a CIE XYZ -> RGB conversion matrix
    Vector v;
    v.x = x/y*Y;
    v.y = Y;
    v.z = (1-x-y)/y*Y;
    v = M * v; //matrix-vector multiplication;
    return Color ( v.x, v.y, v.z );        
}

// returns the 5 coefficients (A-E) for the given turbidity T
float[5] CoeffY(float T)
{
    float[5] result;
    result[0] = 0.1787 * T - 1.4630;
    result[1] = -0.3554 * T + 0.4275;
    ...
    return result;
}

//same for Coeffx and Coeffy

// returns the angle between an observed point and the sun
float PerezGamma(float zenith, float azimuth, float solarzenith, float solarazimuth)
{
    return acos(sin(solarzenith)*sin(zenith)*cos(azimuth-solarazimuth)+cos(solarzenith)*cos(zenith));
}

// evalutes Perez' function F
// the last parameter is a function
float Perez(float zenith, float gamma, float T, t->float[5] coeffs)
{
    return (1+coeffs(T)[0] * exp(coeffs(T)[1]/cos(zenith)) *
           (1+coeffs(T)[2] * exp(coeffs(T)[3]*gamma) + 
            coeffs(T)[4]*pow(cos(gamma),2))
}

// calculates the color for a given point
YxyColor calculateColor(float zenith, float azimuth, float solarzenith, float solarazimuth, float T)
{
    YxyColor c;
    float gamma = PerezGamma(zenith, azimuth, solarzenith, solarazimuth);
    c.Y = Yz(solarzenith, T) * Perez(zenith, gamma, T, CoeffY) / Perez(0, solarzenith, T, CoeffY);
    c.x = xz(solarzenith, T) * Perez(zenith, gamma, T, Coeffx) / Perez(0, solarzenith, T, Coeffx);
    c.y = yz(solarzenith, T) * Perez(zenith, gamma, T, Coeffy) / Perez(0, solarzenith, T, Coeffy); 
    return c;
}

// draws an image of the sky
void DrawImage()
{
    for(float z from 0 to Pi/2) //zenithal distance
    {
        for(float a from -Pi to Pi) //azimuth
        {
            YxyColor c = calculateColor(zenith, azimuth, 1, 0, 5);
            Color rgb = RGB(c.Y, c.x, c.y);
            setNextColor(rgb);
        }
        newline();
    }
}

समाधान

जैसा कि वादा किया गया था कि मैंने आकाश को प्रस्तुत करने के बारे में एक ब्लॉग लेख लिखा था। आप इसे यहाँ पा सकते हैं ।


मुझे संदेह है कि अगर आप गणितज्ञ के बजाय वास्तविक कोड (shader या अन्यथा) में एल्गोरिथ्म को लागू करने का प्रयास करने के लिए यहां अधिक लोग आपकी मदद करने में सक्षम होंगे।
तेतराड

2
वहाँ एक गणितज्ञ एसई है , हालांकि आपको यह देखने के लिए कि क्या आपका प्रश्न वहां पर विषय पर है, यह देखने के लिए उनके अक्सर पूछे जाने वाले प्रश्नों की जांच करनी होगी।
MichaelHouse

खैर, सवाल वास्तव में गणितज्ञ के बारे में नहीं है, लेकिन एल्गोरिथ्म के बारे में है। मैंने नोटबुक का पीडीएफ संस्करण जोड़ा, ताकि हर कोई इसे पढ़ सके। मुझे यकीन है कि वाक्य रचना एक आम प्रोग्रामर के लिए समझ से बाहर है और शायद shader कोड की तुलना में अधिक समझ में आता है।
निको Schertler

@NicoSchertler: समस्या यह है कि मुझे नहीं लगता कि यहां के कई लोग गणितज्ञ वाक्य रचना को समझते हैं। आपके पास शायद अधिक भाग्य होगा यदि आप अपने कोड को सी-लाइक या पायथन जैसी भाषा में लिखते हैं, कम से कम इस प्रश्न के प्रयोजनों के लिए।
पांडा पाजामा

2
प्रश्न वास्तव में बहुत स्थानीय है और बंद हो सकता है, लेकिन पेपर लिंक के लिए धन्यवाद, यह दिलचस्प है।
सैम होसेवर

जवाबों:


4

मैट्रिक्स में दो त्रुटियां हैं जिनका उपयोग किया जाता है xz: 1.00166 0.00166, और 0.6052 0.06052 होनी चाहिए।


सुधारों के लिए धन्यवाद। परिणाम अब बेहतर दिखता है, लेकिन सही नहीं हो सकता। यदि आप अद्यतन प्रश्न पर विचार करेंगे तो मैं सराहना करूंगा।
निको Schertler

-2

ऐसा लगता है कि यह रंग मूल्य स्केलिंग मुद्दा हो सकता है?


2
हालांकि आपकी धारणा सही हो सकती है लेकिन अतिरिक्त स्पष्टीकरण प्रदान करने के लिए यह अधिक उपयोगी होगा। चूँकि आप पूरे प्रश्न का उत्तर नहीं दे सकते हैं, जो आपने लिखा है वह प्रश्न के तहत एक टिप्पणी होना चाहिए।
दनिजर

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

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