www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit e9a2a6d4a8fdc439024cdb54c1c1fc301b684e46
parent 2c1fadabc59b94f1072b8e83be7b24e723e369ee
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Fri, 30 Sep 2011 19:14:01 +0200

Interpolation linéaire et générateur de nombres aléatoires.

Diffstat:
Mdisplay.c | 14+++++++++++---
Mroam.c | 36+++++++++++++++++++++++++-----------
Mroam.h | 1+
3 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/display.c b/display.c @@ -93,9 +93,17 @@ void displayTree(Triangle *t) { } int main() { - initWindow(); - t = initDefaultExample(); + /* initWindow(); */ + /* t = initDefaultExample(); */ - mainLoop(); + /* mainLoop(); */ + int x; + int y; + printf("P5 %d %d 255\n", 256, 256); + for (y = 0; y < 256; y++) { + for (x = 0; x < 256; x++) { + printf("%c", interpolation(x, y, 0, 0, 256, 256, 0, 255, 255, 255)); + } + } return 0; } diff --git a/roam.c b/roam.c @@ -41,19 +41,33 @@ int getFirstTriangleSize(Triangle* t) { return sqrt(((t->vRight->x - t->vLeft->x)^2) + ((t->vRight->y - t->vLeft->y)^2)); } -// TODO Yoann : Générateur pseudo-aléatoire. -// Mettre la greaine au carré et récupérer simplement les nombres du centre. -int getValueForSeed(int seed) { - - return seed; +unsigned int getValueForSeed(unsigned int seed) { + unsigned int primeA = 65521; // Plus grand premier < 2^16 + unsigned int primeB = 4294967291U; // Plus grand premier < 2^32 + return ((seed * primeA) ^ ((seed+1) * primeB)) + seed; // + seed pour éviter d'avoir uniquement des nombres impairs. } -/* Interpolation cosinusoïdale entre deux points.*/ -// A optimisze par aproximation. -int interpolationCos(int x, int y) { - x = x; - y = y; - return 0; +/* Interpolation linéaire entre deux points. + * (x,y) est le point dont on veut connaître la valeur + * (x1,y1)--(x2,y2) est le carré dont on connaît les valeurs + * ne,se,so,no sont les valeurs aux coins nord/sud-est/ouest du carré. */ +// A optimiser par aproximation. +// Optimiser aussi le fait que la distance entre xy1 et xy2 est une puissance de 2, donc on peut faire un simple décalage. +// Peut être réalisé par une multiplication de matrice (donc sur le GPU) : http://en.wikipedia.org/wiki/Bilinear_interpolation +int interpolation(int x, int y, int x1, int y1, int x2, int y2, int ne, int se, int so, int no) { + int gaucheBas = so * -(x-x2) / (x2-x1); + int droiteBas = se * (x-x1) / (x2-x1); + int gaucheHaut = no * -(x-x2) / (x2-x1); + int droiteHaut = ne * (x-x1) / (x2-x1); + + int pointBas = gaucheBas + droiteBas; + int pointHaut = gaucheHaut + droiteHaut; + + int bas = pointBas * -(y-y1) / (y1-y2); + int haut = pointHaut * (y-y2) / (y1-y2); + int ret = bas+haut; + ret = ret; + return ret; } short** PerlinNoise(Triangle* t) { diff --git a/roam.h b/roam.h @@ -22,3 +22,4 @@ typedef struct Triangle { } Triangle; Triangle* initDefaultExample(); +int interpolation(int x, int y, int x1, int y1, int x2, int y2, int ne, int se, int so, int no);