Ejemplo n.º 1
0
        public Vector CouleurReelle(InfoContact Contact, Vector Sortant)
        {
            Vector retour = getMateriau().CouleurReelle(getCoordonees2D(Contact.Position), Contact, Sortant);

            if (retour.isNan())
            {
                ;
            }
            return(retour);
        }
Ejemplo n.º 2
0
        public EnergieLumineuse GetLumiere(Rayon R, int bounceLeft, List <ObjetPhysique> ExclusionContact)
        {
            EnergieLumineuse E = Rayon.CalculerAtmosphere(this, R.tir);

            if (E.isNan())
            {
                ;
            }
            EnergieLumineuse Ei      = new EnergieLumineuse();
            InfoContact      contact = R.Tirer(this, ExclusionContact);

            if (!(contact.Objet is null))
            {
                Vector   Opacite = Rayon.CalculerOpacite(this, R.tir.depart, R.Position());
                Materiau mat     = contact.Objet.getMateriau();
                if (bounceLeft > 0)
                {
                    Tir              rebond    = contact.Rebond();
                    Tir              refrac    = contact.Refraction();
                    Rayon            Rebond    = new Rayon(rebond, 0, R.Pas, R.distMax);
                    Rayon            Refrac    = new Rayon(refrac, 0, R.Pas, R.distMax);
                    EnergieLumineuse LumRebond = GetLumiere(Rebond, bounceLeft - 1, new List <ObjetPhysique>()
                    {
                        contact.Objet
                    });
                    if (!mat.Opaque)
                    {
                        EnergieLumineuse LumRefrac = GetLumiere(Refrac, bounceLeft - 1, new List <ObjetPhysique>()
                        {
                            contact.Objet
                        });
                        Ei += LumRefrac * contact.coeffRefrac(refrac.direction);
                    }
                    Vector Couleur = contact.Objet.CouleurReelle(contact, rebond.direction);
                    Ei += LumRebond * Couleur * contact.coeffRebond(refrac.direction);
                }

                foreach (SourceLumineuse lu in sources)
                {
                    Vector           OpaciteLum   = Rayon.CalculerOpacite(this, lu.Position(), contact.Position);
                    Vector           Sortant      = (lu.Position() - contact.Position).Normer();
                    EnergieLumineuse ArriveeBrute = lu.GetEnergieLumineuse(contact.Position);
                    EnergieLumineuse Attenuee     = ArriveeBrute.Opacifier(OpaciteLum, facteurExtinction);
                    Vector           Couleur      = contact.Objet.CouleurReelle(contact, Sortant);
                    EnergieLumineuse PointContact = Attenuee * Couleur;
                    Ei += PointContact;
                }
                Ei.Opacifier(Opacite, facteurExtinction);
            }
            return(E + Ei);
        }
Ejemplo n.º 3
0
        public Vector CouleurReelle(Tuple <double, double> coord2D, InfoContact Contact, Vector Sortant)
        {
            double AngleSpeculaire = Contact.Rebond().direction.Angle(Sortant);
            double AngleIncidence  = (-Contact.VecteurIncident).Angle(Contact.VecteurNormal);
            Vector CouleurLocale   = Coloration(coord2D.Item1, coord2D.Item2);
            Vector FacteurRasant   = ColorationAngulaire(AngleIncidence);

            if (FacteurRasant.isNan())
            {
                ;
            }
            if (CouleurLocale.isNan())
            {
                ;
            }
            Vector retour = AttenuationReflexion(AngleSpeculaire) % (new Vector(1, 1, 1) % FacteurRasant + CouleurLocale % (1.0 - FacteurRasant));

            if (retour.isNan())
            {
                ;
            }
            return(retour);
        }