Exemple #1
0
        /* Calculate light scattering value at point */
        private CalculatedInscatter CalculateForPoint(Vector2 point)
        {
            Vector2 closestPoint = GetClosestColourNeighbour((int)point.x, (int)point.y);
            double  sigma_s      = GetSigmaFromClassified(point);

            HDRPixelFloat thisColour  = originalSkyImage.GetPixel((int)point.x, (int)point.y).AsFloat();
            HDRPixelFloat closeColour = originalSkyImage.GetPixel((int)closestPoint.x, (int)closestPoint.y).AsFloat();
            HDRPixelFloat thisBG      = backgroundSkyImage.GetPixel((int)point.x, (int)point.y).AsFloat();
            HDRPixelFloat closeBG     = backgroundSkyImage.GetPixel((int)closestPoint.x, (int)closestPoint.y).AsFloat();

            CalculatedInscatter toReturn = new CalculatedInscatter();

            double da_r = CalculateDaForColour(thisColour.R, closeColour.R, thisBG.R, closeBG.R, sigma_s);
            double da_g = CalculateDaForColour(thisColour.G, closeColour.G, thisBG.G, closeBG.G, sigma_s);
            double da_b = CalculateDaForColour(thisColour.B, closeColour.B, thisBG.B, closeBG.B, sigma_s);

            toReturn.da = (da_r + da_g + da_b) / 3;

            float Lia_r = (float)CalculateLiaForColour(thisColour.R, thisBG.R, toReturn.da, sigma_s);
            float Lia_g = (float)CalculateLiaForColour(thisColour.G, thisBG.G, toReturn.da, sigma_s);
            float Lia_b = (float)CalculateLiaForColour(thisColour.B, thisBG.B, toReturn.da, sigma_s);

            toReturn.Lia = new Vector3(Lia_r, Lia_g, Lia_b);

            return(toReturn);
        }
Exemple #2
0
        /* Run the calculations to calculate inscattering data */
        public void RunInscatteringFormula()
        {
            //todo: do we really want to do this for every pixel?
            Bitmap        outputDebug     = new Bitmap(originalSkyImage.Width, originalSkyImage.Height);
            List <string> outputDebugText = new List <string>();
            Bitmap        daDebugImg      = new Bitmap(originalSkyImage.Width, originalSkyImage.Height);
            List <string> daDebug         = new List <string>();

            for (int x = 0; x < originalSkyImage.Width; x++)
            {
                for (int y = 0; y < originalSkyImage.Height; y++)
                {
                    CalculatedInscatter returnedVal = CalculateForPoint(new Vector2(x, y));
                    outputDebugText.Add("Returned - da(" + returnedVal.da + "), Lia(R:" + returnedVal.Lia.R + ",G:" + returnedVal.Lia.G + ",B:" + returnedVal.Lia.B + ")");
                    if (returnedVal.da != 0)
                    {
                        daDebugImg.SetPixel(x, y, Color.White);
                        daDebug.Add("Value for da at (" + x + ", " + y + "): " + returnedVal.da);
                    }
                    else
                    {
                        daDebugImg.SetPixel(x, y, Color.Black);
                    }
                    outputDebug.SetPixel(x, y, Color.FromArgb(/*(int)(returnedVal.da * 255),*/ returnedVal.Lia.R, returnedVal.Lia.G, returnedVal.Lia.B));
                }
            }
            File.WriteAllLines("InscatteringCalcDebug.txt", outputDebugText);
            outputDebug.Save("InscatteringCalcDebug.png");
            File.WriteAllLines("daDebugOut.txt", daDebug);
            daDebugImg.Save("daDebugOut.png");
        }
Exemple #3
0
        /* Run the calculations to calculate inscattering data */
        public InscatteringResult RunInscatteringFormula()
        {
            InscatteringResult toReturn = new InscatteringResult();

            toReturn.CloudDepthLocationDebug      = new Bitmap(originalSkyImage.Width, originalSkyImage.Height);
            toReturn.CloudInscatteringColourDebug = new Bitmap(originalSkyImage.Width, originalSkyImage.Height);
            toReturn.CloudDepthValueDebug         = new List <string>();
            toReturn.CloudDepthValueDebugActual   = new List <float>();

            for (int x = 0; x < originalSkyImage.Width; x++)
            {
                for (int y = 0; y < originalSkyImage.Height; y++)
                {
                    CalculatedInscatter returnedVal = CalculateForPoint(new Vector2(x, y));

                    //Depth value debug output
                    toReturn.CloudDepthValueDebugActual.Add((float)returnedVal.da);
                    if (returnedVal.da != 0)
                    {
                        toReturn.CloudDepthLocationDebug.SetPixel(x, y, Color.White);
                        toReturn.CloudDepthValueDebug.Add("Value for da at (" + x + ", " + y + "): " + returnedVal.da);
                    }
                    else
                    {
                        toReturn.CloudDepthLocationDebug.SetPixel(x, y, Color.Black);
                    }

                    //Inscattering colour debug output
                    int final_r = (int)(255.0f * returnedVal.Lia.x);
                    if (final_r > 255)
                    {
                        final_r = 255;
                    }
                    int final_g = (int)(255.0f * returnedVal.Lia.y);
                    if (final_g > 255)
                    {
                        final_g = 255;
                    }
                    int final_b = (int)(255.0f * returnedVal.Lia.z);
                    if (final_b > 255)
                    {
                        final_b = 255;
                    }
                    toReturn.CloudInscatteringColourDebug.SetPixel(x, y, Color.FromArgb(/*(int)(returnedVal.da * 255),*/ final_r, final_g, final_b));
                }
            }

            return(toReturn);
        }