Membuat hiasan dengan objek Polar Grafika komputer

Membuat hiasan dengan objek Polar
clip_image002
Kali ini, saya membuat semacam hiasan dengan objek-objek polar. Hampir semua dari objek-objek yang ada pada gambar diatas dibuat dengan objek bulat yang menggunakan rumus-rumus aljabar matematika. Materi untuk membuatan objek-objek diatas dapat kalian lihat apda link berikut http://sayfudinblogz.blogspot.de/2015/06/tutorial-objek-bulat-2d-grafika-komputer.html. Semua objek yang dibuat ada di fungsi userdraw() karena didalam fungsi itu saya hanya memanggil fungsi-fungsi untuk membuat setiap objek .Berikut listing programnya.
//
// main.cpp
// DrawObyekPolar
//
// Created by Student on 3/31/15.
// Copyright (c) 2015 Student. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#ifndef M_PI
#define M_PI 3.141592653589793
#endif
typedef struct {
float x;
float y;
} point2D_t;
typedef struct {
float r;
float g;
float b;
} color_t;
typedef struct{
float v[3];
}vector2D_t;
////////////// OpenGL drawShape Functions ver 1 /////////////////
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 drawDot(float x,float y)
{
glBegin(GL_POINTS);
glColor3f(0,0,255);
glVertex2f(x, y);
glEnd();
}
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: number of points
void drawPolyline(point2D_t pnt[],int n)
{
int i;
glBegin(GL_LINE_STRIP);
for (i=0;i<n;i++) {
glVertex2f(pnt[i].x, pnt[i].y);
}
glEnd();
}
//n: number of vertices
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);
}
glEnd();
}
// The function fillPolygon can fills only convex polygons
//n: number of vertices
void fillPolygon(point2D_t pnt[],int n,color_t color)
{
int i;
setColor(color);
glBegin(GL_POLYGON);
for (i=0;i<n;i++) {
glVertex2f(pnt[i].x, pnt[i].y);
}
glEnd();
}
// The function gradatePolygon can fills only convex polygons
// The vertices will be painted with corresponding given colors.
// The points inside the polygon will be painted with the mixed color.
//n: number of vertices
void gradatePolygon(point2D_t pnt[],color_t col[],int num)
{
int i;
glBegin(GL_POLYGON);
for (i=0;i<num;i++) {
setColor(col[i]);
glVertex2f(pnt[i].x, pnt[i].y);
}
glEnd();
}
void centerPolygon(point2D_t pnt[],point2D_t pc,int num, color_t col1,color_t col2)
{
int i;
glBegin(GL_LINES);
for (i=0;i<num;i++) {
setColor(col1);
glVertex2f(pnt[i].x, pnt[i].y);
setColor(col2);
glVertex2f(pc.x, pc.y);
}
glEnd();
}
//////////// End of OpenGL drawShape Functions ver 1 ////////////
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,300,-5);
drawcharX(300,-20);
drawLine(0,-230,0,230);drawLine(0,230,5,220);drawLine(0,230,-5,220);
drawcharY(-20,220);
}
///////////////////////////////////////////////////////////////////
/** POLA GAMBAR **/
void drawPolaButterfly(int geser_X,int geser_Y,int kali, color_t col1, color_t col2, int n, int sudutMiring){
int i;
point2D_t lingkaran[n];
double teta,r;
point2D_t pc={geser_X,geser_Y};
setColor(1,1,1);
for (i=0;i<n;i++) {
teta=(double)(i+sudutMiring)*M_PI/180;
r= kali* (8-sin(teta)+2*sin(3*teta)+2*sin(5*teta)-sin(7*teta)+3*cos(2*teta)-2*cos(4*teta) );
lingkaran[i].x=geser_X+(float)r*cos((i)/57.3);
lingkaran[i].y=geser_Y+(float)r*sin((i)/57.3);
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,col1,col2);
}
void drawPola2(int xp,int yp,int kali, color_t col1, color_t col2, int sudutMiring, int n){
int i;
point2D_t lingkaran[n];
double teta,r;
setColor(1,1,1);
point2D_t pc={xp,yp};
for (i=0;i<n;i++) {
teta= (double)(i+sudutMiring)*M_PI/180;
/**lingkaran[i].x= 60 *(sin(teta)*(exp(cos(teta))-2*cos(4*teta)-pow(sin(teta/12),5)) );
lingkaran[i].y= 60 *(cos(teta)*(exp(cos(teta))-2*cos(4*teta)-pow(sin(teta/12),5)) );*/
/**lingkaran[i].x= 60 *(sin(teta)*(exp(cos(teta))-2*cos(4*teta)-pow(sin(teta/12),5)) );
lingkaran[i].y= 60 *(cos(teta)*(exp(cos(teta))-2*cos(3*teta)-pow(sin(teta/12),5)) );*/
/**lingkaran[i].x= 60 *(sin(teta)*(exp(cos(teta))-2*cos(3*teta)-pow(sin(teta/12),5)) );
lingkaran[i].y= 60 *(cos(teta)*(exp(cos(teta))-2*cos(4*teta)-pow(sin(teta/12),5)) );*/
lingkaran[i].x=(float)xp+kali*sin(teta)*(exp(cos(teta))-2*cos(4*teta)-pow(sin(teta/12),5));
lingkaran[i].y=(float)yp+kali*cos(teta)*(exp(cos(teta))-2*cos(4*teta)-pow(sin(teta/12),5));
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,col1,col2);
//tick+=(0.50); // NORMAL USEAGE
}
void drawPolaHearth(float xp,float yp,int kali,int n)
{
int i;
point2D_t lingkaran[n];
double teta,r;
color_t putih={1.,1.,1.};
color_t pink={0.8,0.,0.2};
color_t kuning ={1, 0.961, 0.376};
point2D_t pc={xp,yp};
for (i=0;i<n;i++) {
teta=(double)i*M_PI/180;
r=(double)kali*(2-2.3*sin(teta)+0.4*cos(2*teta)+
((1.3*sin(teta)*sqrt(pow(fabs(cos(teta)),1.3)))/
(sin(teta)+1.7)));
lingkaran[i].x=(float)xp+r*cos((i)/57.3);
lingkaran[i].y=(float)yp+r*sin((i)/57.3);
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,putih,pink);
}
void drawPolaBunga(float xp,float yp,int kali,int n, color_t col1, color_t col2, int tipe, int sudutMiring)
{
int i;
point2D_t lingkaran[n];
double teta,r;
point2D_t pc={xp,yp};
for (i=0;i<n;i++) {
teta=(double)(i+sudutMiring)*M_PI/180;
r=(double)kali*sin(tipe*teta) ;
lingkaran[i].x=(float)xp+r*cos((i)/57.3);
lingkaran[i].y=(float)yp+r*sin((i)/57.3);
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,col1,col2);
}
void drawSpiral (float xp,float yp,int kali, color_t col1, color_t col2,int sudutMiring, int n)
{
int i;
point2D_t lingkaran[n];
double teta,r;
point2D_t pc={xp,yp};
for (i=0;i<n;i++) {
teta=(double)(i+sudutMiring)*M_PI/180;
r=teta*kali ;
lingkaran[i].x=(float)xp+r*cos((i)/57.3);
lingkaran[i].y=(float)yp+r*sin((i)/57.3);
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,col1,col2);
}
void drawKadiodata (float xp,float yp,int kali, color_t col1, color_t col2,int sudutMiring, int n)
{
int i;
point2D_t lingkaran[n];
double teta,r;
point2D_t pc={xp,yp};
for (i=0;i<n;i++) {
teta=(double)(i+sudutMiring)*M_PI/180;
r=(1+cos(teta) )*kali ;
lingkaran[i].x=(float)xp+r*cos((i)/57.3);
lingkaran[i].y=(float)yp+r*sin((i)/57.3);
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,col1,col2);
}
void drawCircle (float xp,float yp,int kali, color_t col1, color_t col2, int n)
{
int i;
point2D_t lingkaran[n];
double teta,r;
point2D_t pc={xp,yp};
for (i=0;i<n;i++) {
teta=(double)(i)*M_PI/180;
r= i * kali ;
lingkaran[i].x=(float)xp+r*cos((i)/57.3);
lingkaran[i].y=(float)yp+r*sin((i)/57.3);
}
setColor(0,1,1);
centerPolygon(lingkaran,pc,n,col1,col2);
}
void userdraw(void)
{
color_t putih={1.,1.,1.};
color_t pink={0.8,0.,0.2};
color_t kuning ={1, 0.961, 0.376};
color_t kuningMuda {0.961, 0.984, 0.659};
color_t hijau1={0.867, 0.949, 0.631};
color_t NA={0.973, 0.525, 0.525};
color_t biru = {0.365, 0.824, 0.824};
color_t biruTua = {0.361, 0.541, 0.898};
color_t biruMuda ={0.749, 0.863, 0.929};
color_t ungu = {0.761, 0.345, 0.557};
int x,y,incMiring,j,i, xR,yR;
//lingkaran2
drawCircle(0,0,600,putih,biruMuda,600);
//gambar hearth yang ada ditengah-tengah
drawPolaHearth(0, 100, 50, 360);
//buat bunga disekitar hati // lapisan dalam 1
for (i=0,j=0;i<7;i++, j+=50)
{
int r=200 ;
x=(float)r*cos((j)/57.3);
y=(float)50+r*sin((j)/57.3);
drawPolaBunga(x,y,80,360,putih, pink,4,0);
}
//buat bunga lapisan dua
for (i=1, incMiring=0,j=0;i<8;i++, j+=50)
{
int r=400 ;
incMiring=j;
x=(float)r*cos((j)/57.3);
y=(float)50+r*sin((j)/57.3);
drawPolaBunga(x,y,80,360,putih, NA,6,incMiring);
}
//pola butterfly
for (i=0,j=0;i<7;i++, j+=50)
{
int r=600 ;
x=(float)r*cos((j)/57.3);
y=(float)50+r*sin((j)/57.3);
int tetaRadian=25;
xR = (x * cos((tetaRadian)/57.3)) - (y * sin((tetaRadian)/57.3));
yR = (x * sin((tetaRadian)/57.3)) + (y * cos((tetaRadian)/57.3));
if(i==0) incMiring=45;
else if (i==1) incMiring=20;
else if (i==2) incMiring=350;
else if (i==3) incMiring=300;
else if (i==4) incMiring=270;
else if (i==5) incMiring=210;
else if (i==6) incMiring=160;
if (i%2 == 0) drawPolaButterfly(xR,yR,10,putih,biru,360, incMiring);
else drawPolaButterfly(xR,yR,10,putih,pink,360, incMiring); // kali 30 --> bagus , ciamik
}
//spiral
for (i=0,j=0;i<7;i++, j+=50)
{
int r=550 ;
x=(float)r*cos((j)/57.3);
y=(float)50+r*sin((j)/57.3);
drawSpiral(x,y,10,putih,ungu,90,360);
}
//kadiodata
for (i=0,j=0;i<7;i++, j+=50)
{
int r=400 ;
x=(float)r*cos((j)/57.3);
y=(float)50+r*sin((j)/57.3);
int tetaRadian=25;
xR = (x * cos((tetaRadian)/57.3)) - (y * sin((tetaRadian)/57.3));
yR = (x * sin((tetaRadian)/57.3)) + (y * cos((tetaRadian)/57.3));
if(i==0) incMiring=45;
else if (i==1) incMiring=30;
else if (i==2) incMiring=0;
else if (i==3) incMiring=300;
else if (i==4) incMiring=270;
else if (i==5) incMiring=210;
else if (i==6) incMiring=180;
if (i%2 == 0) drawKadiodata(xR,yR,50,putih,pink, incMiring,360);
else drawKadiodata(xR,yR,50,putih,biruTua, incMiring,360); // kali 30 --> bagus , ciamik
}
drawPola2(600,600,30, putih,biruTua,0,360);
drawPola2(-600,600,30, putih,biruTua,0,360);
drawPola2(600,-600,30, putih,biruTua,0,360);
drawPola2(-600,-600,30, putih,biruTua,0,360);
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowPosition(0,0);
glutInitWindowSize(700,700);
glutCreateWindow ("2Dfigures");
glClearColor(1, 0.961, 0.376, 1);
gluOrtho2D(-700., 700., -700., 700.);
// Define the dimensions of the Orthographic Viewing Volume
//glutIdleFunc(display); // idle event call back
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
view raw HiasanPolar.cpp hosted with ❤ by GitHub


Dari listing program diatas terdapat tiga struct yaitu untuk menampung nilai titik atau koordinat dinamai point2D_t, menyimpan warna dinamai color_t, dan menampung vector yang dinamai vector2D_t. Method setColor digunakann untuk menset warna dari suatu objek. Terdapat dua method setColor namun berbeda parameterya, yang satu parameternya float red, float green, dan float blue, sedangkan yang satunya berparameter tipe struct color_t.
Kemudian terdapat berbagai method untuk menggambar objek-objek dari gambar, seperti drawPolyline untuk menggambar garis, drawPolygon untuk menggambar garis juga tapi dengan GL_LINE_LOOP, fillPolygon untuk menggambar objek dengan memberi warna pada dalam objek, gradatePolygon untuk menggambar objek dengan pewarnaan gradasi, centerPolygon untuk menggambar objek dengan pewarnaan terpusat (semua objek pada objek di projek ini menggunakan pewarnaan dengan method ini), drawPolaButterfly untuk menggambar objek dengan bentuk kupu-kupu, drawPola2 untuk memnggambar objek dengan bentuk pola, drawPolaHearth untuk menggambar objek dengan pola hati, drawPolaBunga untuk menggambar objek dengan pola bunga, drawSpiral untuk menggambar objek berbentuk spiral layaknya seperti cangkang keong drawKadiodata untuk menggambar objek dengan bentuk seperti kacang atau kidney, drawCircle untuk menggambar objek dengan pola lingkaran (pada kodingan diatas method ini hanya digunakan untuk mengatur letak dari objek sehingga posisinya dari objek-objeknya melingkar). Semua objek pembentuk objek menggunaka rumusan matematika untuk membentuk objek.
Semua objek yang digambar dipanggil di dalam method userdraw(). Didalam method ini dideklarasi warna dan memanggil method-method yang telah disebutkan diatas.
Penulis Ilham A.H