예제 #1
0
        //Interpolation
        private static double fonctionsInterp(double x, TypeInterpolation Interp)
        {
            //Renvoie le coefficient d'interpolation k [0,1] en fonction du parcours x
            double result;

            switch (Interp)
            {
            case TypeInterpolation.Lineaire:
                result = x;
                break;

            case TypeInterpolation.Cosinus:
                result = 0.5 * (1.0 - Math.Cos(x * Math.PI));
                break;

            case TypeInterpolation.Hermite:
                result = 3.0 * x * x - 2.0 * x * x * x;
                break;

            case TypeInterpolation.C2:
                result = 6.0 * x * x * x * x * x - 15.0 * x * x * x * x + 10.0 * x * x * x;
                break;

            default:
                result = 0.0;
                break;
            }
            return(result);
        }
예제 #2
0
        public static double perlin(double[] Position, int seed, TypeInterpolation TI, int nbOctaves, double f0, double Attenuation, double Decalage, double puissance, int nbPlateaux, double k_plateaux)
        {
            //Renvoie un bruit de perlin a n dim pour l'interpolation specifiee, lissage par la puisssance "puissance"
            //nbPlateaux, nombre de plages de valeurs prises possibles. mettre à 0 pour toutes les valeurs possibles
            //k_plateaux est la pente des plateaux [0,1]
            double Resultat  = 0.0;
            double Amplitude = 1.0;
            double f         = f0;

            double[] shift    = new double[Position.Length];
            double[] Pos      = new double[Position.Length];
            double   sommeAmp = 0;

            for (int i = 0; i < nbOctaves; i++)
            {
                shift = vect_pseudo_Alea(i * 452237 + 700849, Position.Length, seed);
                multiplierVect(ref shift, Decalage * pseudo_Alea(i * 89746 + 6577, seed));
                Pos = copie(Position);
                shifter(ref Pos, ref shift);
                multiplierVect(ref Pos, f);
                Resultat  += perlinSimple(ref Pos, seed, TI) * Amplitude;
                sommeAmp  += Amplitude;
                Amplitude *= Attenuation;
                f         *= 2;
            }
            Resultat = Resultat / sommeAmp;
            Resultat = Math.Sign(Resultat) * Math.Pow(Math.Abs(Resultat), puissance);
            if (nbPlateaux > 0)
            {
                double s = 0;
                if (k_plateaux != 0)
                {
                    s = k_plateaux * (1.0 / (float)nbPlateaux) * ((float)nbPlateaux * Resultat - Math.Floor((float)nbPlateaux * Resultat));
                }
                Resultat  = (1.0 / (float)nbPlateaux) * Math.Floor((float)nbPlateaux * Resultat);
                Resultat += s;
            }
            return(Resultat);
        }
예제 #3
0
 public static double perlin(double[] Position, int seed, TypeInterpolation TI, int nbOctaves, double f0, double Attenuation, double Decalage)
 {
     //Renvoie un bruit de perlin a n dim pour l'interpolation specifiee
     return(perlin(Position, seed, TI, nbOctaves, f0, Attenuation, Decalage, 1.0, 0, 0));
 }
예제 #4
0
 public static double perlin(double[] Position, int seed, TypeInterpolation TI, int nbOctaves, double f0, double Attenuation, double Decalage, double puissance, int nbPlateaux)
 {
     //Renvoie un bruit de perlin a n dim pour l'interpolation specifiee, lissage par la puisssance "puissance"
     //nbPlateaux, nombre de valeurs prises possibles
     return(perlin(Position, seed, TI, nbOctaves, f0, Attenuation, Decalage, puissance, nbPlateaux, 0.0));
 }
예제 #5
0
 private static double perlinSimple(ref double[] Position, int seed, TypeInterpolation TI)
 {
     //Obtient un bruit de perlin itere une fois et de frequence 1
     return(Math.Min(Math.Max(interpolerEspace(Position, new int[Position.Length], Position.Length - 1, seed, TI), -1.0), 1.0));
 }
예제 #6
0
 private static double interpolerEspace(double[] Position, int[] PosGrille, int N0, int seed, TypeInterpolation TI)
 {
     //Permet d'obtenir une interpolation pour une sous dim, a partir d'une selection des coordonees du point de ref pour les dim superieures
     if (N0 < 0)
     {
         //La valeur voulue pour un point de la grille est le produit scalaire entre le gradient a la position de la grille voulue, et la distance a cette position
         double[] dist = recentrer(PosGrille, Position);
         return(produitScalaire(dist, vect_pseudo_Alea_Rn(PosGrille, seed)));
     }
     else
     {
         //On choisit la dim N0 (2 choix) et on interpole les deux options entre elles
         double x = Position[N0];
         //projection sur la dim N0 et recuperation du coeff d'interpolation
         double k  = fonctionsInterp(x - Math.Floor(x), TI);
         int[]  P1 = copie(PosGrille);
         int[]  P2 = copie(PosGrille);
         //fixer la valeur pour la dim N0
         P1[N0] = (int)Math.Floor(Position[N0]);
         P2[N0] = (int)Math.Floor(Position[N0]) + 1;
         //interpolation
         double b1    = interpolerEspace(Position, P1, N0 - 1, seed, TI);
         double b2    = interpolerEspace(Position, P2, N0 - 1, seed, TI);
         double inter = ((1.0 - k) * b1 + k * b2);
         return(inter);
     }
 }
예제 #7
0
 public static Application perlin(int seed, TypeInterpolation TI, int nbOctaves, double f0, double Attenuation, double Decalage, double puissance, int nbPlateaux, double k_plateaux)
 {
     return(x => (1.0 + perlin(x, seed, TI, nbOctaves, f0, Attenuation, Decalage, puissance, nbPlateaux, k_plateaux)) / 2.0);
 }
예제 #8
0
 public TypeInterpolationChangedEventArgs(TypeInterpolation oldType, TypeInterpolation newType)
 {
     _oldType = oldType;
     _newType = newType;
 }