IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Conversion algo C++->C


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut Conversion algo C++->C
    Bonjour,

    J'ouvre ce post, parce que depuis hier je cherche en vain un code source du bruit de perlin en C compilable sans succés, les seules versions trouvées sont en C++ et je ne connais pas du tout ce langage.
    Au pire quelqu'un pourrait'il me convertir ce code C++ vers du C ce serait vraiment sympa.... c'est pas trés long ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    struct perlin
    {
        int p[512];
        perlin(void);
        static perlin & getInstance(){static perlin instance; return instance;}
    };
     
    static int permutation[] = { 151,160,137,91,90,15,
       131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
       190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
       88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
       77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
       102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
       135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
       5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
       223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
       129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
       251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
       49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
       138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
       };
     
    static double fade(double t)
    {
        return t * t * t * (t * (t * 6 - 15) + 10);
    }
    static double lerp(double t, double a, double b) {
        return a + t * (b - a);
    }
    static double grad(int hash, double x, double y, double z) {
        int h = hash & 15;                      // CONVERT LO 4 BITS OF HASH CODE
        double u = h<8||h==12||h==13 ? x : y,   // INTO 12 GRADIENT DIRECTIONS.
                v = h<4||h==12||h==13 ? y : z;
        return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);
    }
     
    double noise(double x, double y, double z) {
     
        perlin & myPerlin = perlin::getInstance();
        int X = (int)floor(x) & 255,                  // FIND UNIT CUBE THAT
            Y = (int)floor(y) & 255,                  // CONTAINS POINT.
            Z = (int)floor(z) & 255;
        x -= floor(x);                                // FIND RELATIVE X,Y,Z
        y -= floor(y);                                // OF POINT IN CUBE.
        z -= floor(z);
        double u = fade(x),                                // COMPUTE FADE CURVES
                v = fade(y),                                // FOR EACH OF X,Y,Z.
                w = fade(z);
        int A = myPerlin.p[X  ]+Y, AA = myPerlin.p[A]+Z, AB = myPerlin.p[A+1]+Z,      // HASH COORDINATES OF
            B = myPerlin.p[X+1]+Y, BA = myPerlin.p[B]+Z, BB = myPerlin.p[B+1]+Z;      // THE 8 CUBE CORNERS,
     
        return lerp(w, lerp(v, lerp(u, grad(myPerlin.p[AA  ], x  , y  , z   ),  // AND ADD
                                        grad(myPerlin.p[BA  ], x-1, y  , z   )), // BLENDED
                                lerp(u, grad(myPerlin.p[AB  ], x  , y-1, z   ),  // RESULTS
                                        grad(myPerlin.p[BB  ], x-1, y-1, z   ))),// FROM  8
                        lerp(v, lerp(u, grad(myPerlin.p[AA+1], x  , y  , z-1 ),  // CORNERS
                                        grad(myPerlin.p[BA+1], x-1, y  , z-1 )), // OF CUBE
                                lerp(u, grad(myPerlin.p[AB+1], x  , y-1, z-1 ),
                                        grad(myPerlin.p[BB+1], x-1, y-1, z-1 ))));
    }
     
    perlin::perlin (void)
    {
        for (int i=0; i < 256 ; i++) {
            p[256+i] = p[i] = permutation[i];
        }
    }
    merci beaucoup pour votre aide..

    ps: il s'agit d'un poste en C ce post concerne une traduction de code donc merci de ne pas deplacer ce post ailleurs :-)

  2. #2
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    il y a quelques temps j'avais fait mon generateur de bruit de Perlin en C a l'aide de ce site :
    http://freespace.virgin.net/hugo.eli...s/m_perlin.htm
    il explique clairement le principe et fourni un code tres facilement traductible en C

    desole je peux pas poster mon code, je suis au taf et il est chez moi (ce soir si j'y pense )

    a+

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut Conversion algo C++->C
    Merci beaucoup vais lire tout ca, mais effectivement si tu pense à poster ton code directement en C ce serait mieux ^^.

    Merci à toi.

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut ok
    j'ai du mal avec l'anglais , vraiment personne voudrait faire un effort pour m'aider vous en serez vraiment reconnaissant.

  5. #5
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    ben voila j'ai oublie d'envoyer mon code hier soir
    promis cette fois je m'envoie un mail pour y penser (en esperant que ca soit pas trop presse pour toi)

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut ok
    c'est super syma merci! urgent un peu j'avoue mais j'attendrai! ;-0

  7. #7
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    et voila le code tant attendu
    y a quasiment pas de commentaires (en plus j'ai fait ca il y a tres longtemps et je suis plus tres sur de l'intervalle donne en commentaire au debut du .h)
    y a surement des trucs a redire pour les puristes
    mais j'ai quand meme pu avoir de jolies textures grace a ces fonctions

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par aimad41
    J'ouvre ce post, parce que depuis hier je cherche en vain un code source du bruit de perlin en C compilable sans succés, les seules versions trouvées sont en C++ et je ne connais pas du tout ce langage.
    Au pire quelqu'un pourrait'il me convertir ce code C++ vers du C ce serait vraiment sympa.... c'est pas trés long ^^
    Je dirais ceci, mais je ne suis pas expert en C++... (il y avait une faute de frappe : b au lieu de B)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #include <stdio.h>
    #include <math.h>
     
    struct perlin
    {
       int p[512];
    };
     
    static const int s_permutation[] = { 151, 160, 137, 91, 90, 15,
       131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
       99, 37, 240, 21, 10, 23,
       190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
       11, 32, 57, 177, 33,
       88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
       134, 139, 48, 27, 166,
       77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
       55, 46, 245, 40, 244,
       102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
       18, 169, 200, 196,
       135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
       226, 250, 124, 123,
       5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
       17, 182, 189, 28, 42,
       223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
       167, 43, 172, 9,
       129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
       218, 246, 97, 228,
       251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
       249, 14, 239, 107,
       49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
       127, 4, 150, 254,
       138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
       215, 61, 156, 180
    };
     
    static double fade (double t)
    {
       return t * t * t * (t * (t * 6 - 15) + 10);
    }
    static double lerp (double t, double a, double b)
    {
       return a + t * (b - a);
    }
    static double grad (int hash, double x, double y, double z)
    {
       int h = hash & 15;           // CONVERT LO 4 BITS OF HASH CODE
       double u = h < 8 || h == 12 || h == 13 ? x : y, // INTO 12 GRADIENT DIRECTIONS.
         v = h < 4 || h == 12 || h == 13 ? y : z;
       return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
    }
     
    double perlin_noise (struct perlin *this, double x, double y, double z)
    {
     
       int X = (int) floor (x) & 255, // FIND UNIT CUBE THAT
         Y = (int) floor (y) & 255, // CONTAINS POINT.
         Z = (int) floor (z) & 255;
       x -= floor (x);              // FIND RELATIVE X,Y,Z
       y -= floor (y);              // OF POINT IN CUBE.
       z -= floor (z);
       double u = fade (x),         // COMPUTE FADE CURVES
         v = fade (y),              // FOR EACH OF X,Y,Z.
         w = fade (z);
       int A = this->p[X] + Y, AA = this->p[A] + Z, AB = this->p[A + 1] + Z, // HASH COORDINATES OF
         B = this->p[X + 1] + Y, BA = this->p[B] + Z, BB = this->p[B + 1] + Z; // THE 8 CUBE CORNERS,
     
       return lerp (w, lerp (v, lerp (u, grad (this->p[AA], x, y, z), // AND ADD
                                      grad (this->p[BA], x - 1, y, z)), // BLENDED
                             lerp (u, grad (this->p[AB], x, y - 1, z), // RESULTS
                                   grad (this->p[BB], x - 1, y - 1, z))), // FROM  8
                    lerp (v, lerp (u, grad (this->p[AA + 1], x, y, z - 1), // CORNERS
                                   grad (this->p[BA + 1], x - 1, y, z - 1)), // OF CUBE
                          lerp (u, grad (this->p[AB + 1], x, y - 1, z - 1),
                                grad (this->p[BB + 1], x - 1, y - 1, z - 1))));
    }
     
    void perlin_init (struct perlin *this)
    {
       int i;
       for (i = 0; i < 256; i++)
       {
          this->p[256 + i] = this->p[i] = s_permutation[i];
       }
    }
     
    /* exemple certainement faux ou inutile, car je sais pas de quoi il s'agit... */
    int main (void)
    {
       struct perlin myperlin = { {0} };
       perlin_init (&myperlin);
     
       {
          int i;
          for (i = 0; i < 10; i++)
          {
             double val = perlin_noise (&myperlin, 12.34, 56.78, 90.12);
             printf ("val = %f\n", val);
          }
       }
     
       return 0;
    }

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut
    Merci pour cette traduction, pour l'exemple il s'agit la d'une generation à la fois aléatoire mais cohérente aussi d'un nombre tout en se referrant par rapport aux paramétres transmis, si on as x = 1 y = 1 z = 1 il doit generer le même nombre autant de fois que ces paramétres seront identique.
    je peut pas tester le code, demain matin à la 1er heure ce sera fait.

    Donc le result quand avec le printf ce devrait etre ceci
    pr x = 1 y = 1 z = 1
    nombre alétoire1
    pr x = 1 y = 1 z = 0
    nombre aléatoire2
    pr x = 1 y = 1 z = 1
    nombre alétoire1
    ect.....

    Merci en tout ca pour ta particpation!

  10. #10
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    C'est plus trop un nombre aléatoire alors

  11. #11
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    C'est le principe de Perlin : c'est aleatoire mais pas trop

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut
    vi

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut ok
    bon j'ai teste, il m'affiche que des 0...............

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut ok
    Merci bcp !! vais voir tout ca....

    en effet l'intervalle est compris entre -1 et 1, j'ai une question lorsque tu retourne la valeur aleatoire, comment calculer la couleur a retournee? faut'il decomposer la couleur de sorte a pouvoir calculer la nouvelle composante rouge, bleu et vert ou d'une passe directement?

    Citation Envoyé par straasha
    et voila le code tant attendu
    y a quasiment pas de commentaires (en plus j'ai fait ca il y a tres longtemps et je suis plus tres sur de l'intervalle donne en commentaire au debut du .h)
    y a surement des trucs a redire pour les puristes
    mais j'ai quand meme pu avoir de jolies textures grace a ces fonctions

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Par défaut
    Citation Envoyé par aimad41
    Merci bcp !! vais voir tout ca....

    en effet l'intervalle est compris entre -1 et 1, j'ai une question lorsque tu retourne la valeur aleatoire, comment calculer la couleur a retournee? faut'il decomposer la couleur de sorte a pouvoir calculer la nouvelle composante rouge, bleu et vert ou d'une passe directement?
    bon j'ai bien reflechit aprés correction ta traduction c++ vers le c est plus que correct une petit erreur de variable c'est tout, sinon pour les couleurs je confirme recupérer chaque composante et les modifier par interpolation lineaire ou par seuil au choix.
    Topic resolu

Discussions similaires

  1. Algo conversion Base10 -> Binaire
    Par badboykiller dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/10/2009, 16h41
  2. Réponses: 11
    Dernier message: 26/05/2008, 22h10
  3. Algo conversion couleur -> hexa
    Par lejert dans le forum 4D
    Réponses: 1
    Dernier message: 09/04/2008, 20h33
  4. Réponses: 7
    Dernier message: 10/05/2007, 16h24
  5. Algo Conversion Décimal -> Binaire
    Par MisterTee dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 23/02/2006, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo