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 :
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
Post a Comment