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);
}"Pyöriteltävä" siis :DD ja sit tos voi samanlail(ehkä) suurentaa ja pienentää sitä eli "+" ja "-".....
entäs windows binayr? ;)
no kappas, olihan se windowski siellä :)
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 :/
aijaa mä testasin tota vnc:n yli faijan työkoneel ni kyl se siin toimi ku purki ton .zip paketin vaan...
voit tietysti kokeilla kopioida ne dll:ät c:\windows\system:iin...
no eikö sitä nyt edes palautetta tule :((
No mää pistin sinne windowsin system hakemistoon ja silti valitti :\
EI....ei toimi Dev-cpp:llä...vanha cpp. ei löydä riveillä 3 ja 4 olevia kirjastoja :(
Ainaki mulla sillee "lagaa" et ei oo portaaton se pyöritys, ja siksi näyttää rumalta. =(
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
Toimii aivan vallan mainiosti..
http://mielikuvitus.be/kuutio.jpg
Noh jos tuota kuutioksi haluat sanoa :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.