Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }