Vous êtes sur la page 1sur 5

#include <stdio.

h>
#include <math.h>
#include <GL/glut.h>
//------------------------------------//Struktur Data Untuk Keperluan Grafis
//------------------------------------typedef struct {
float m[3][3];
} matrix2D_t;
typedef struct {
float v[3];
} vector2D_t;
typedef struct {
float x;
float y;
} point2D_t;
typedef struct {
float r;
float g;
float b;
} color_t;
//Operasi Matrik dan Vektor 2D
matrix2D_t createIdentity(void)
{
matrix2D_t u;
int i,j;
for (i=0; i<3; i++){
for (j=0; j<3; j++) u.m[i][j]=0.;
u.m[i][i]=1.;
}return u;
}
matrix2D_t multiply(matrix2D_t a, matrix2D_t b)
{
matrix2D_t c;//c=a*b
int i,j,k;
for (i=0; i<3; i++) for (j=0; j<3; j++) {
c.m[i][j]=0;
for (k=0; k<3; k++) c.m[i][j] +=a.m[i][k]*b.m[k][j];
}
return c;
}
vector2D_t multiply(matrix2D_t a, vector2D_t b)
{
vector2D_t c;//c=a*b
int i,j;
for (i=0; i<3; i++) {
c.v[i]=0;
for(j=0; j<3; j++) c.v[i]+=a.m[i][j]*b.v[j];
}
return c;
}
matrix2D_t translationMTX(float dx, float dy)
{
matrix2D_t trans=createIdentity();
trans.m[0][2]=dx;
trans.m[1][2]=dy;
return trans;
}
matrix2D_t rotationMTX(float theta)

{
matrix2D_t rotate=createIdentity();
float cs=cos(theta);
float sn=sin(theta);
rotate.m[0][0]=cs; rotate.m[0][1]=-sn;
rotate.m[1][0]=sn; rotate.m[1][1]=cs;
return rotate;
}
matrix2D_t scalingMTX(float factorx, float factory)
{
matrix2D_t scale=createIdentity();
scale.m[0][0]=factorx;
scale.m[1][1]=factory;
return scale;
}
//------------------------//Pemindahan Structur Data
//------------------------point2D_t Vector2Point(vector2D_t vec)
{
point2D_t pnt;
pnt.x=vec.v[ 0];
pnt.y=vec.v[ 1];
return pnt;
}
vector2D_t Point2Vector(point2D_t pnt)
{
vector2D_t vec;
vec.v[0]=pnt.x;
vec.v[1]=pnt.y;
vec.v[2]=1.;
return vec;
}
//Fungsi=fungsi OpenGL untuk menggambar
void setColor(float red, float green, float blue)
{
glColor3f(red, green, blue);
}
void setColor(color_t col)
{
glColor3f(col.r, col.g, col.b);
}
void drawLine(float x1, float y1, float x2, float y2)
{
glBegin(GL_LINES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
}
void drawLine(point2D_t p1,point2D_t p2)
{
drawLine(p1.x,p1.y,p2.x,p2.y);
}
//n: jumlah vertek
void drawPolygon(point2D_t pnt[], int n)
{
int i;
glBegin(GL_LINE_LOOP);
for(i=0; i<n; i++) {
glVertex2f(pnt[i].x, pnt[i].y);
}

void gradatePolygon(Point2D_t pnt[],int n, color_t color[])


{
int i;
glBegin(GL_POLYGON);
for (i=0;i<n;i++) {
setColor(color[i]);
glVertex2f(pnt[i].x, pnt[i].y);
}
glEnd();
}
void userdraw(void);
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
userdraw();
glutSwapBuffers();
}
void drawcharX(float x, float y)
{
drawLine(x,y,x+10,y+12);drawLine(x,y+12,x+10,y);
}
void drawcharY(float x, float y)
{
drawLine(x+5,y,x+5,y+7);drawLine(x,y+12,x+5,y+7);
drawLine(x+10,y+12,x+5,y+7);
}
void drawAxes(void)
{
drawLine(310,0,-310,0);drawLine(310,0,300,5);
drawLine(310,0,310,-5);drawcharX(300,-20);
drawLine(0,-230,0,230);drawLine(0,230,5,220);
drawLine(0,230,-5,220);drawcharY(-20,220);
}
void userdraw(void)
{
static int tick=0;
int disp=(tick/1000)%6;
int tickindisp=tick%1000;
point2D_t ef[12]={
{30,40},{40,40},{40,30},{50,30},{50,40}, {60,40},//digan
ti
{60,50},{50,50},{50,60},{40,60},{40,50}, {30,50}
};
matrix2D_t mat,trans1,rot1,trans2,rot2,scale;
vector2D_t vec[12];
int i;
float factor;//untk parameter scalling
setColor(1,1,1);drawAxes();
setColor(0,1,1);//gambar f asal
switch(disp) {
case 0://translation->rotataion
glutSetWindowTitle("Komposisi-translasi->rotasi case 0");
trans1=translationMTX(-40,-50);
rot1=rotationMTX(tickindisp*0.01);
mat=multiply(rot1,trans1);
for(i=0;i<12;i++){
vec[i]=Point2Vector(ef[i]);
vec[i]=multiply(mat,vec[i]);
ef[i]=Vector2Point(vec[i]);

}
drawPolygon(ef,12);
break;
case 1://translation->rotation->translation
glutSetWindowTitle("Komposisi-translasi->rotasi->transla
si case 1");
trans1=translationMTX(-40,-50);
rot1=rotationMTX(tickindisp*0.01);
trans2=translationMTX(160,0);
mat=multiply(rot1,trans1);
mat=multiply(trans2,mat);
for(i=0;i<12;i++){
vec[i]=Point2Vector(ef[i]);
vec[i]=multiply(mat,vec[i]);
ef[i]=Vector2Point(vec[i]);
}
drawPolygon(ef,12);
break;
case 2://translation->rotasi
glutSetWindowTitle("Komposisi-translasi->Rotasi case 2");
trans1=translationMTX(120,-50);
rot1=rotationMTX(tickindisp*0.01);
mat=multiply(rot1,trans1);
for(i=0;i<12;i++){
vec[i]=Point2Vector(ef[i]);
vec[i]=multiply(mat,vec[i]);
ef[i]=Vector2Point(vec[i]);
}
drawPolygon(ef,12);
break;
case 3://translation->rotations->translation->rotation
glutSetWindowTitle("Komposisi-translasi->rotasi->translasi->rota
si case 3");
trans1=translationMTX(-40,-50);
rot1=rotationMTX(tickindisp*0.02);
trans2=translationMTX(160,0);
rot2=rotationMTX(tickindisp*0.01);
mat=multiply(rot1,trans1);
mat=multiply(trans2,mat);
mat=multiply(rot2,mat);
for(i=0;i<12;i++){
vec[i]=Point2Vector(ef[i]);
vec[i]=multiply(mat,vec[i]);
ef[i]=Vector2Point(vec[i]);
}
drawPolygon(ef,12);
break;
case 4:
//translation->rotation->translation->rotation
glutSetWindowTitle("Komposisi-translasi->rotasi->translasi->rota
si case 4");
trans1=translationMTX(-40,-50);
rot1=rotationMTX(tickindisp*0.01);
trans2=translationMTX(160,0);
rot2=rotationMTX(tickindisp*0.01);
mat=multiply(rot1,trans1);
mat=multiply(trans2,mat);
mat=multiply(rot2,mat);
for(i=0;i<12;i++){
vec[i]=Point2Vector(ef[i]);

vec[i]=multiply(mat,vec[i]);
ef[i]=Vector2Point(vec[i]);
}
drawPolygon(ef,12);
break;
case 5://trans->scaling->rot->trans->rot
glutSetWindowTitle("Komposisi-trans->scaling->rot->trans->rot ca
se 5");
factor=0.3+0.35*(sin(tickindisp*0.1)+1);
trans1=translationMTX(-40,-50);
scale=scalingMTX(factor,factor);
rot1=rotationMTX(-tickindisp*0.02);
trans2=translationMTX(160,0);
rot2=rotationMTX(tickindisp*0.01);
mat=multiply(scale,trans1);
mat=multiply(rot1,mat);
mat=multiply(trans2,mat);
mat=multiply(rot2,mat);
for(i=0;i<12;i++){
vec[i]=Point2Vector(ef[i]);
vec[i]=multiply(mat,vec[i]);
ef[i]=Vector2Point(vec[i]);
}
drawPolygon(ef,12);
break;
default:
break;
}
tick++;
color_t gradasi1[4]={{0,0,0},{1,1,1},{0,0,0},{1,1,1}};
gradatePolygon(ef,4, gradasi1);
}

int main(int argc, char**argv)


{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB );
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("Translasi");
glClearColor(0.0,0.0,0.0,0.0);
gluOrtho2D(-320.,320.,-240.0, 240.0);
glutIdleFunc(display);//idle event call back
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

Vous aimerez peut-être aussi