Page 1 of 1

Quand Ndless rencontre Bézier ...

Unread postPosted: 22 Nov 2012, 19:34
by matref
Salut les gens !

Je sais pas vraiment pourquoi, mais j'ai eu l'idée de faire un programme permettant de contrôler l'affichage d'une courbe de Bézier. Pourquoi pas. :D

Image

La courbe de Bézier est tracée en fonction de 4 points de contrôle que vous pouvez déplacer en les sélectionnant avec [+] et [-] (le point de contrôle sélectionné devient alors visible et prend la forme d'un carré 3*3) puis en les mouvant avec les flèches.

Je pense que je pourrai tirer un jeu de ça ...

Re: Quand Ndless rencontre Bézier ...

Unread postPosted: 22 Nov 2012, 19:36
by Adriweb
Bravo, ca a l'air très bien fait :)

Le source est dispo bientôt ? C'est toujours intéressant ;)

Re: Quand Ndless rencontre Bézier ...

Unread postPosted: 22 Nov 2012, 19:45
by matref
Franchement, tu trouveras pas grand-chose dedans ... y'a 60 lignes à tout casser et c'est juste une courbe de Bézier avec un plotter fait à la va-vite :D

Code: Select all
/* Bezier curves program
Uses the formula for the Bezier curve with 4 control points A to D :

x = Xa * (1 - t)^3 + Xb * 3 * t * (1 - t)^2 + Xc * 3 * t^2 * (1 - t) + Xd * t^3
x = Ya * (1 - t)^3 + Yb * 3 * t * (1 - t)^2 + Yc * 3 * t^2 * (1 - t) + Yd * t^3
*/

#include <os.h>
#include "utils.h"

int main(void) {
   
   char *scrbuf;
   double t = 0.0;
   
   int coord[2], current = 0, i = 0;
   
   double controlPoints[4][2] = {
      {64.0,120.0},
      {128.0,120.0},
      {192.0,120.0},
      {256.0,120.0}
   };
   
   lcd_ingray();
   
   scrbuf = malloc(SCREEN_BYTES_SIZE * sizeof(char));
   if(!scrbuf)
   {
      exit(0);
   }
   
   while (!isKeyPressed(KEY_NSPIRE_ESC))
   {
      clearBuf(scrbuf);
      for (t = -6.28; t < 6.28; t += 0.003)
      {
         coord[0] = controlPoints[0][0] * cube(1 - t) + controlPoints[1][0] * 3 * t * square(1 - t) + controlPoints[2][0] * 3 * square(t) * (1 - t)
               + controlPoints[3][0] * cube(t);
         coord[1] = controlPoints[0][1] * cube(1 - t) + controlPoints[1][1] * 3 * t * square(1 - t) + controlPoints[2][1] * 3 * square(t) * (1 - t)
               + controlPoints[3][1] * cube(t);
         if(coord[0] >= 0 && coord[0] < 320 && coord[1] >= 0 && coord[1] < 240) setPixelBuf(scrbuf, coord[0], coord[1], 0x00);
      }
      
      for(i = 0; i < 9; i++)
      {
         setPixelBuf(scrbuf, (i % 3) + controlPoints[current][0], (int)(i/3) + controlPoints[current][1], 0x00);
      }
      
      refresh(scrbuf);
      controlPoints[current][0] += isKeyPressed(KEY_NSPIRE_RIGHT);
      controlPoints[current][0] -= isKeyPressed(KEY_NSPIRE_LEFT);
      controlPoints[current][1] += isKeyPressed(KEY_NSPIRE_DOWN);
      controlPoints[current][1] -= isKeyPressed(KEY_NSPIRE_UP);
      
      current += current < 3 ? isKeyPressed(KEY_NSPIRE_PLUS) : 0;
      current -= current > 0 ? isKeyPressed(KEY_NSPIRE_MINUS) : 0;
   }
   
   free(scrbuf);
   return 0;
}


Dans util.h c'est les fonctions de base : setPixelBuf, clearBuf, square, cube, refresh.

Re: Quand Ndless rencontre Bézier ...

Unread postPosted: 01 Jan 2013, 20:23
by mdr1
C'est toujours sympa d'avoir des exécutables ndless même inutiles, vu que y en a pas souvent. ;)