Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Pyörivä 3D-kuutio

Sivun loppuun

AL_e [13.11.2003 20:48:59]

#

Setä oli väsäillyt pyörivän 3d kuution visualbasicilla...
tässä sama(ehkä) toteutettuna C:llä... kiitos sedälle :DD

binary(sekä windows että linux binary) + source löytyy osoitteesta : http://koti.mbnet.fi/al_e/programming/kuutio/

#include <stdio.h>

#include <SDL.h>
#include <SDL_gfxPrimitives.h>

#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 300


int main(int argc, char *argv[])
{
  SDL_Surface *screen = NULL;
  SDL_Event event;

  int px[7], py[7], pz[7];		/*	Kärkipisteiden koordinaatit */
  int xx, yy, zz;				/* Muunnoksen apuna */
  int mx[7], mz[7];				/* projektiot */
  float a, b; 					/* katselukulmat */
  float c; 						/* särmän puolisko */
  float d, k; 					/* perspektiivi */
  float sa, sb; 				/* sinit */
  float ca, cb; 				/* cosinit */
  int i;						/* Laskuri */
  int mousex, mousey;			/* Hiiren koordinaatit */
  int mouse = 0;				/* Hiiren nappi pohjassa? */
  int plus = 0, minus = 0;		/* Miinus tai plus pohjassa? */

  /* Initialisoidaan SDL */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
    exit(1);
  }
  atexit(SDL_Quit);

  /* Asetetaan caption */
  SDL_WM_SetCaption("Kuutio", 0);

  /* Asetetaan resoluutio */
  screen = SDL_SetVideoMode (WINDOW_WIDTH, WINDOW_HEIGHT, 16, SDL_SWSURFACE);

  /* ... */
  c = WINDOW_HEIGHT;
  if (c > WINDOW_WIDTH) c = WINDOW_WIDTH;
  c = c / 4; d = 10 * c;
  a = 0.4; b = 0.3;
  sa = sin(a); ca = cos(a);
  sb = sin(b); cb = cos(b);

  px[0] = -c; py[0] = -c; pz[0] = -c;
  px[1] = c; py[1] = -c; pz[1] = -c;
  px[2] = c; py[2] = c; pz[2] = -c;
  px[3] = c; py[3] = c; pz[3] = c;
  px[4] = c; py[4] = -c; pz[4] = c;
  px[5] = -c; py[5] = -c; pz[5] = c;
  px[6] = -c; py[6] = c; pz[6] = c;
  px[7] = -c; py[7] = c; pz[7] = -c;


  /* Main loop */
  while (SDL_PollEvent(&event) >= 0) {
    if (plus) d = d / 1.01;
    if (minus) d = d * 1.01;

    switch (event.type) {
      case SDL_KEYDOWN: {
        if (event.key.keysym.sym==SDLK_KP_PLUS)
          plus = 1;
        else if (event.key.keysym.sym==SDLK_KP_MINUS)
          minus = 1;
        break;
      }

      case SDL_KEYUP: {
        if (event.key.keysym.sym==SDLK_KP_PLUS)
          plus = 0;
        else if (event.key.keysym.sym==SDLK_KP_MINUS)
          minus = 0;
        break;
      }

      case SDL_MOUSEMOTION: { 		/* Kun hiirtä liikutetaan... */
        if (mouse) {			/* Ja hiiren nappi on pohjassa. */
          a += (mousex - event.motion.x) / 3;
          b += (mousey - event.motion.y) / 3;
          sa = sin(a); ca = cos(a);
          sb = sin(b); cb = cos(b);
          mousex = event.motion.x; mousey = event.motion.y;
        }
        break;
      }

      /* Kun nappia painetaan */
      case SDL_MOUSEBUTTONDOWN: {
        mousex = event.motion.x;
        mousey = event.motion.y;
        mouse = 1;
        break;
      }

      /* Kun nappi päästetään */
      case SDL_MOUSEBUTTONUP: {
        mouse = 0;
        break;
      }

      /* Kun ikkuna suljetaan */
      case SDL_QUIT: {
        printf("Quitting.\n"); exit(0);
      }
    }

    /* Tyhjennetään ikkuna */
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));

    /* Piiretään neliö */
    for (i=0; i <= 7; i++) {
      /* Lasketaan pisteiden projektiot */
      xx = (int)((float)px[i] * ca + (float)py[i] * sa);
      yy = (int)(((float)py[i] * ca - (float)px[i] * sa) * cb - (float)pz[i] * sb);
      zz = (int)(((float)py[i] * ca - (float)px[i] * sa) * sb + (float)pz[i] * cb);
      k = d / (d + yy);
      mx[i] = k * xx;
      mz[i] = k * zz;
    }

    lineRGBA(screen, WINDOW_WIDTH/2 + mx[0], WINDOW_HEIGHT/2 + mz[0], WINDOW_WIDTH/2 + mx[1], WINDOW_HEIGHT/2 + mz[1], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[1], WINDOW_HEIGHT/2 + mz[1], WINDOW_WIDTH/2 + mx[2], WINDOW_HEIGHT/2 + mz[2], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[2], WINDOW_HEIGHT/2 + mz[2], WINDOW_WIDTH/2 + mx[3], WINDOW_HEIGHT/2 + mz[3], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[3], WINDOW_HEIGHT/2 + mz[3], WINDOW_WIDTH/2 + mx[4], WINDOW_HEIGHT/2 + mz[4], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[4], WINDOW_HEIGHT/2 + mz[4], WINDOW_WIDTH/2 + mx[5], WINDOW_HEIGHT/2 + mz[5], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[5], WINDOW_HEIGHT/2 + mz[5], WINDOW_WIDTH/2 + mx[6], WINDOW_HEIGHT/2 + mz[6], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[6], WINDOW_HEIGHT/2 + mz[6], WINDOW_WIDTH/2 + mx[7], WINDOW_HEIGHT/2 + mz[7], 0, 255, 255, 255);

    lineRGBA(screen, WINDOW_WIDTH/2 + mx[7], WINDOW_HEIGHT/2 + mz[7], WINDOW_WIDTH/2 + mx[0], WINDOW_HEIGHT/2 + mz[0], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[0], WINDOW_HEIGHT/2 + mz[0], WINDOW_WIDTH/2 + mx[5], WINDOW_HEIGHT/2 + mz[5], 0, 255, 255, 255);

    lineRGBA(screen, WINDOW_WIDTH/2 + mx[4], WINDOW_HEIGHT/2 + mz[4], WINDOW_WIDTH/2 + mx[1], WINDOW_HEIGHT/2 + mz[1], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[2], WINDOW_HEIGHT/2 + mz[2], WINDOW_WIDTH/2 + mx[7], WINDOW_HEIGHT/2 + mz[7], 0, 255, 255, 255);
    lineRGBA(screen, WINDOW_WIDTH/2 + mx[6], WINDOW_HEIGHT/2 + mz[6], WINDOW_WIDTH/2 + mx[3],WINDOW_HEIGHT/2 + mz[3], 0, 255, 255, 255);

    /* Päivitetään ikkuna */
    SDL_Flip(screen);
  }
  return(0);
}

AL_e [13.11.2003 21:05:49]

#

"Pyöriteltävä" siis :DD ja sit tos voi samanlail(ehkä) suurentaa ja pienentää sitä eli "+" ja "-".....

Gwaur [14.11.2003 16:52:42]

#

entäs windows binayr? ;)

Gwaur [14.11.2003 16:53:05]

#

no kappas, olihan se windowski siellä :)

Gwaur [14.11.2003 17:00:34]

#

no jaa, jos toi "Tarvittavaa tiedosta SDL.dll ei löytynyt" on sun mielestä hieno 3d-kuutio niin... :D
no ei vaan, vaikka mää oon purkanu kaikki dll:t ja semmoset mitä siinä zipissä oli niin tää salittaa että ei löydy :/

AL_e [14.11.2003 17:43:55]

#

aijaa mä testasin tota vnc:n yli faijan työkoneel ni kyl se siin toimi ku purki ton .zip paketin vaan...

AL_e [14.11.2003 17:49:12]

#

voit tietysti kokeilla kopioida ne dll:ät c:\windows\system:iin...

AL_e [19.11.2003 20:31:20]

#

no eikö sitä nyt edes palautetta tule :((

Gwaur [05.12.2003 14:25:48]

#

No mää pistin sinne windowsin system hakemistoon ja silti valitti :\

mamaze [26.02.2004 11:10:28]

#

EI....ei toimi Dev-cpp:llä...vanha cpp. ei löydä riveillä 3 ja 4 olevia kirjastoja :(

msdos464 [20.04.2004 17:39:11]

#

Ainaki mulla sillee "lagaa" et ei oo portaaton se pyöritys, ja siksi näyttää rumalta. =(

tejeez [05.07.2004 09:33:41]

#

Höh. Mulla ei oo tota SDL_gfxPrimitives.h, SDL.h kyl on ja muutenki täs sdl mut toi puuttuu eikä toimi ilman sitäkään näköjään :I

TatuSalin [21.11.2005 13:00:03]

#

Toimii aivan vallan mainiosti..

tesmu [16.04.2006 23:41:20]

#

http://mielikuvitus.be/kuutio.jpg
Noh jos tuota kuutioksi haluat sanoa :D


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta