19 using System.Collections.Generic;
20 using System.Diagnostics;
22 using System.Runtime.InteropServices.ComTypes;
23 using System.Security.Cryptography.X509Certificates;
42 Colour GetColour(Point3D point, NormalizedVector3D surfaceNormal, Camera camera, IList<ILightSource> lights, IList<double> obstructions);
65 public Colour GetColour(Point3D point, NormalizedVector3D surfaceNormal, Camera camera, IList<ILightSource> lights, IList<double> obstructions)
81 private (
double L,
double a,
double b) LabColour;
82 private (
double H,
double S,
double L) LabBlackHSL;
83 private (
double H,
double S,
double L) LabWhiteHSL;
84 private double IntensityExponent;
85 private double TotalLength;
114 this.LabColour = colour.ToLab();
115 this.LabBlackHSL =
Colour.
FromLab(0, LabColour.a, LabColour.b).ToHSL();
116 this.LabWhiteHSL =
Colour.
FromLab(1, LabColour.a, LabColour.b).ToHSL();
117 this.TotalLength = 1 + LabBlackHSL.L + (1 - LabWhiteHSL.L);
118 this.IntensityExponent = Math.Log((LabBlackHSL.L + LabColour.L) / TotalLength) / Math.Log(0.5);
121 private Colour GetScaledColour(
double intensity)
123 intensity = Math.Max(Math.Min(intensity, 1), 0);
125 double pos = Math.Pow(intensity, IntensityExponent) * TotalLength;
127 if (pos <= LabBlackHSL.L)
131 else if (pos >= 1 + LabBlackHSL.L)
142 public Colour GetColour(Point3D point, NormalizedVector3D surfaceNormal, Camera camera, IList<ILightSource> lights, IList<double> obstructions)
144 double intensity = 0;
146 for (
int i = 0; i < lights.Count; i++)
148 (
double lightIntensity, NormalizedVector3D lightDirection) = lights[i].GetLightAt(point);
149 lightIntensity *= 1 - obstructions[i];
151 if (
double.IsNaN(lightDirection.X))
157 double dotProd = lightDirection * surfaceNormal;
163 NormalizedVector3D mirroredDirection = (lightDirection - 2 * dotProd * surfaceNormal).Normalize();
165 NormalizedVector3D cameraDirection = (camera.ViewPoint - point).Normalize();
167 double dotProd2 = mirroredDirection * cameraDirection;
177 return GetScaledColour(intensity);