public static EnergieLumineuse CalculerAtmosphere(Univers univ, Tir tir) { Rayon r = new Rayon(tir, 0, univ.EpsilonContact, univ.distRayonMax); EnergieLumineuse E = new EnergieLumineuse(); Vector A = tir.depart; while (r.Longueur < r.distMax) { Vector X = r.Position(); foreach (SourceLumineuse sour in univ.sources) { Vector B = sour.Position(); EnergieLumineuse recueBrute = sour.GetEnergieLumineuse(X); Vector Opacite1 = Rayon.CalculerOpacite(univ, B, X); Vector Opacite2 = Rayon.CalculerOpacite(univ, X, A); Vector Opacite = Opacite1 + Opacite2; if (double.IsInfinity(Opacite2.x) && double.IsInfinity(Opacite2.y) && double.IsInfinity(Opacite2.z)) { return(E); } EnergieLumineuse Opacifiee = recueBrute.Opacifier(Opacite, univ.facteurExtinction); double angle = (X - B).Angle(A - X); double densite = univ.atmosphere(X).Norme(); Vector FacteurReorientation = univ.reorientationAtmosphere(angle, densite); E += (Opacifiee * FacteurReorientation) * r.Pas; } r.Avancer(false, univ, new List <ObjetPhysique>()); } return(E); }
Vector Opacite(Univers univ, double LongueurParcours) { //Calcule la somme d'opacite sur un parcours Vector retour = new Vector(0, 0, 0); ObjetPhysique contact; do { Avancer(false, univ, new List <ObjetPhysique>()); contact = Contact(univ, new List <ObjetPhysique>(), univ.EpsilonContact); if (contact is null) { retour += univ.atmosphere(Position()) * Pas; } else { if (contact.getMateriau().Opaque) { return(new Vector(double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity)); } else { retour += contact.getMateriau().FiltrationVolumetrique *Pas; } } } while (Longueur < LongueurParcours && Longueur < distMax); return(retour); }