/* 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); }
/* 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"); }
/* 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); }