Pembuatan Animasi di Pemrograman C++

Kali ini saya "Achmad Akib" akan membahas pembuatan sebuah animasi dari Pemrograman C++.
Tak usah lama-lama,  saya akan menampilkan bagaimana cara membuat guci animasi memakai program dev C++


Screen Shotnya seperti ini, dalam 1 titik sumbu akan membentuk 1 gunci penuh



Coding nya ini :
#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>

typedef struct
{
int x;
int y;
}point2d;

typedef struct
{
int x;
int y;
int z;
}point3d;

point3d P3[4],P3R[4];
point2d P2[4],P2temp[4];

void pointData(){

P3[0].x=70; P3[0].y=110; P3[0].z=0; //menentukan koordinat titik-titik kontrol
P3[1].x=50; P3[1].y=75; P3[1].z=0;
P3[2].x=-10; P3[2].y=60; P3[2].z=0;
P3[3].x=200; P3[3].y=0; P3[3].z=0;
P3[4].x=60; P3[4].y=-180; P3[4].z=0;
}

void simpanTemp(int x, int y, int urutan){

P2temp[urutan].x = x;
P2temp[urutan].y = y;

}

void konversi_systoscreen(point2d *p)
{
int midx, midy;
midx = getmaxx()/2 + 1;
midy = getmaxy()/2 + 1;

p->x = midx + p->x;
p->y = midy - p->y;
}

point2d konversi_p3d_to_p2d(point3d p)
{
point2d temp;
temp.x = p.x;
temp.y = p.y;
//p.z tidak ikut
return(temp);
}

point3d rotasi_X(point3d p, int sudut)
{
float rad = 3.14 / 180;
point3d temp;
temp.x = p.x;
temp.y = (p.y * cos(sudut*rad) - p.z * sin(sudut*rad));
temp.z = (p.y * sin(sudut*rad) + p.z * cos(sudut*rad));
return(temp);
}

point3d rotasi_Y(point3d p, int sudut)
{
float rad = 3.14 / 180;
point3d temp;
temp.x = (p.x * cos(sudut*rad) - p.z * sin(sudut*rad));
temp.y = p.y;
temp.z = (p.x * sin(sudut*rad) + p.z * cos(sudut*rad));
return(temp);
}


long int faktor(int n) // fungsi faktorial
{ int i;
long int hsl = 1;
for(i=n; i>1; i--)
{
hsl = hsl * i;
}
return(hsl);
}

long int combinasi(int n, int k) // fungsi combinasi
{
long int comb, nf, kf,nkf;
nf = faktor(n);
kf = faktor(k);
nkf = faktor(n-k);
comb = nf /(kf * nkf);
return(comb);
}

void gambarKurva(int sudut)
{

float u, x, y, h;
int i, n, k, l=1;

setcolor(GREEN);
circle(P2[0].x, P2[0].y, 5); //menggambar titik kontrol P0

circle(P2[4].x, P2[4].y, 5); //menggambar titik kontrol P2

x = 0; // nilai awal titik kurva berikutnya
y = 0;
n = 5-1; //(n = jumlah titik kontrol - 1 sebab hitungan dimulai dari 0;
u = 0.00;
for(i=0; i<=200; i++) // u bergerak dari 0 .. 1 step 0.05 ( e[0,1] )
{
for(k=0; k<=n; k++) //Sigma, mengulang sebanyak titk kontrol
{
h = combinasi(n, k) * pow(u, k) * pow(1-u, n-k); // fungsi blending

x = x + P2[k].x * h; //hitung koordinat titik kurva berikutnya untuk x
y = y + P2[k].y * h; //hitung koordinat titik kurva berikutnya untuk y

}
setcolor(GREEN);
putpixel( x, y, l); //menggambar titik kurva

u = u + 0.005; // step
x=0.0; // x dan y di nol kan untuk akumulasi titik kurva berikutnya
y=0.0;
}

int midx, midy;
midx = getmaxx()/2 + 1;
midy = getmaxy()/2 + 1;
line(P2[4].x,P2[4].y,midx+0,P2[4].y);
for(i=0; i<=10; i++){
simpanTemp(P2[i].x, P2[i].y, i);
}

}


void prosesRotasi(int sudut){
int i;

//Rotasi pada sumbu Y sebesR SUDUT 10 derajat
for(i=0; i<=10; i++)
{
P3R[i] = rotasi_Y(P3[i], sudut );
}

//Rotasi pada sumbu X sebesR SUDUT 10 derajat
for(i=0; i<=10; i++)
{
P3R[i] = rotasi_X(P3R[i], 20 );
}

//konversi p3d ke p2d
for(i=0; i<=10; i++)
{
P2[i] = konversi_p3d_to_p2d(P3R[i]);
}

//konversi koordinat system to screen
for(i=0; i<=10; i++)
{
konversi_systoscreen(&P2[i]);
}



}
int main(){
int midx, midy, input, putar_x=0, putar_y=0;
initwindow(1000, 700, "Kurva Beizer");
setcolor(YELLOW);
outtextxy(400,40,"*************************************************");
setcolor(WHITE);
outtextxy(450,60,"ILMU KOMPUTER DAN TEKNOLOGI");
outtextxy(450,80,"http://adie-konoe.blogspot.com");
setcolor(YELLOW);
outtextxy(400,100,"************************************************");

setcolor(WHITE);
int i=0;
do{
pointData();
prosesRotasi(i);
gambarKurva(i);
i+=5;
delay(100);
}while(i!=360);
getch();
}

Comments

Popular posts from this blog

Driver Printer Canon PIXMA MP230, MP237 Terbaru Windows (xp, 7, 8, 10)

OSPF (Open Shortest Path First)

Makalah Keamanan Sistem Informasi