public static Color ColorInfo2Color(ColorInfo color) { return(Color.FromArgb((int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255))); }
public static Color PhongeIllumination(Vector <double> position, Vector <double> normal, ColorInfo colorInfo, SurfaceInfo surface, List <Light> lights) { ColorInfo outcome = new ColorInfo { R = 0, G = 0, B = 0 }; //ambient outcome.R += colorInfo.R * surface.Ka; outcome.G += colorInfo.G * surface.Ka; outcome.B += colorInfo.B * surface.Ka; foreach (var light in lights) { if (!light.IsOn) { continue; } double spotlightFactor = 1; var l = light.CalculateLVector(position); if (light.IsSpotLight) { var cos = (-light.ProcessedDirection).DotProduct(l); if (cos > 0) { spotlightFactor = Math.Pow(cos, light.P); } else { spotlightFactor = 0; } } //diffuse var lightNormalAngle = normal.DotProduct(l); var diffuseR = surface.Kd * lightNormalAngle * spotlightFactor; if (lightNormalAngle < 0) { continue; } outcome.R += colorInfo.R * diffuseR; outcome.G += colorInfo.G * diffuseR; outcome.B += colorInfo.B * diffuseR; //sepcular var v = (-position).Normalize(2); var r = 2 * lightNormalAngle * normal - l; r = r.Normalize(2); var cameraRAngle = r.DotProduct(v); if (cameraRAngle < 0) { continue; } var specularR = surface.Ks * Math.Pow(cameraRAngle, surface.N_shiny) * spotlightFactor; outcome.R += specularR; outcome.G += specularR; outcome.B += specularR; } if (outcome.R > 1) { outcome.R = 1; } if (outcome.G > 1) { outcome.G = 1; } if (outcome.B > 1) { outcome.B = 1; } return(ColorInfo2Color(outcome)); }