Membuat Lingkaran
Membuat Lingkaran - Primitives Object
===
2.6 Membuat Lingkaran
Lingkaran merupakan bangun 2D yang memiliki titik pusat (a,b) dan jari-jari (r). Bangun tersebut dapat dibentuk dengan cara merotasi titik pada koordinat (a+r,b) mulai dari sudut 0 sampai 360 derajat.
(a,b)
(a+r,b)
(0,0) x
Gambar 2.15 Ilustrasi membuat Lingkaran
Ilustrasi dalam membuat lingkaran dapat digunakan sebagai dasar untuk membuat objek visual bola. Bola secara teori sudah dapat dikatakan sebagai objek yang komplek, sehingga codenya tidak dimasukkan pada bab Primitive Object. Pada beberapa bab berikutnya akan diberikan source code Bola secara lengkap. Langkah pertama dalam membuat Bola dengan mengenerate titik-titik dari
sudut 0 o sampai 180 o secara vertikal , mulai dari ujung atas sampai ujung bawah (top-down) atau sebaliknya dengan step atau interval tertentu (latitude). Kemudian setiap titik tersebut akan menjadi titik awal untuk membentuk lingkaran, yang digerakkan secara horizontal,
0 mulai dari sudut o sampai 360 o dengan step atau interval tertentu (azimuth).
Gambar 2.16 Ilustrasi Membuat Bola
Kembali lagi pada lingkaran, rumus untuk merotasi titik (a+r,b) menggunakan konsep transformasi geometri dengan inisialisasi jari_jari = 1.0f; titik pusat lingkaran (a = 0.0f;, b = 0.0f;) dan titik awal (x,y) = (x = a + jari_jari;, y = b;) step = 3.0f;, yaitu sebagai berikut
“for (float teta = batas_sudut_lower; teta <= batas_sudut_upper+step; teta += step) { vertices_circle[loop] = (float) ((x - a)* getApproxValue((float)Math.cos(Math.toRadians(teta)))- ((y - b) *getApproxValue((float)Math.sin(Math.toRadians(teta))))
+ a); vertices_circle[loop + 1] = (float) ((x - a)* getApproxValue((float)Math.sin(Math.toRadians(teta)))-
((y - b)*getApproxValue((float)Math.cos(Math.toRadians(teta)))) + b); vertices_circle[loop + 2] = 0; loop += 3; }” Kode program untuk mewarnai bagian dalam lingkaran dapat
menggunakan inisialisasi loop_color = 0; “ …. vertices_circle_color[loop_color] = (float) ((x - a) * Math.cos(Math.toRadians(teta)) - ((y - b) * Math.sin(Math.toRadians(teta))) + a);
vertices_circle_color[loop_color + 1] = (float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) * Math.cos(Math.toRadians(teta))) + b);
vertices_circle_color[loop_color + 2] = 0.5f; vertices_circle_color[loop_color + 3] = 0.5f; loop_color += 4;
” Kedua potongan kode di atas menggunakan penghitungan
banyaknya titik dan juga warnanya untuk menentukan alokasi panjang array berdasarkan nilai sesilih batas sudut dan step-nya.
“ ….. byk_vertices=(((int)
Math.round((batas_sudut_upper- batas_sudut_lower)/ step))+1);
” Hasil running program menampilkan beberapa macam dari
lingkaran, mulai dari yang hanya satu warna di bagian tepiannya, bahkan sampai yang memiliki gradasi warna.
Gambar 2.17 Membuat Lingkaran Flat dan Gradasi
Gambar 2.18 Membuat Lingkaran Flat dan Gradasi dinamis Source Code 2.9 Code Membuat Lingkaran Gradasi & Dinamis
ESRender.java
package com.example.imacho.createcircle;
import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLU; import android.os.SystemClock;
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;
/** * Created by Imacho on 4/5/2015. */
public class ESRender implements Renderer { public class ESRender implements Renderer {
Clock.uptimeMillis(); private float sudut_max = 0.0f; private int runMode=1;
/** Constructor to set the handed over context */ public ESRender() {
this.circle = new Circle(); }
@Override public void onDrawFrame(GL10 gl) {
gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // set background with white color //gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // set background with black color
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // clear Screen and Depth Buffer
// display drawing polygon dinamis color long curtime = SystemClock.uptimeMillis(); if ((curtime - prevtime) > 1000.0f) {
prevtime = curtime; if (runMode==1) {
sudut_max += 10; if (sudut_max == 360.0f) {
runMode=0; } } else{
sudut_max -= 10; if (sudut_max == 0) {
runMode=1; } } }
// display drawing circle gl.glPushMatrix(); // start freeze
state/event to each object gl.glTranslatef(-3.5f, 1.5f, -7.0f); circle.draw_circle_fraction(gl);
gl.glPopMatrix(); // end freeze state/event to each object
// display drawing circle fraction with no fill function sudut_min dan sudut_max gl.glPushMatrix(); // start freeze state/event to each object gl.glTranslatef(-3.5f, -1.5f, -7.0f); cir-
cle.draw_circle_fraction_one_color_with_nofill_functi on(gl,0,sudut_max); cle.draw_circle_fraction_one_color_with_nofill_functi on(gl,0,sudut_max);
// display drawing circle one color gl.glPushMatrix(); // start freeze
state/event to each object gl.glTranslatef(-1.2f, 1.5f, -7.0f); circle.draw_circle_one_color(gl);
gl.glPopMatrix(); // end freeze state/event to each object
// display drawing circle with no fill func- tion sudut_min dan sudut_max gl.glPushMatrix(); // start freeze state/event to each object gl.glTranslatef(-1.2f, -1.5f, -7.0f); cir-
cle.draw_circle_one_color_with_nofill_function(gl,0,s udut_max);
gl.glPopMatrix(); // end freeze state/event to each object
// display drawing circle color gl.glPushMatrix(); // start freeze
state/event to each object gl.glTranslatef(1.2f, 1.5f, -7.0f); circle.draw_circle_color(gl);
gl.glPopMatrix(); // end freeze state/event to each object
// display drawing circle with no fill func- tion sudut_min dan sudut_max gl.glPushMatrix(); // start freeze state/event to each object
gl.glTranslatef(1.2f, -1.5f, -7.0f); cir-
cle.draw_circle_color_with_nofill_function(gl,0,sudut _max);
gl.glPopMatrix(); // end freeze state/event to each object
// display drawing circle color2 gl.glPushMatrix(); // start freeze
state/event to each object gl.glTranslatef(3.5f, 1.5f, -7.0f); cir-
cle.draw_circle_dinamic_color_fill(gl); gl.glPopMatrix(); // end freeze state/event to each object
// display drawing circle with function sudut_min dan sudut_max center gl.glPushMatrix(); // start freeze state/event to each object gl.glTranslatef(3.5f, -1.5f, -7.0f); cir-
cle.draw_circle_color_with_fill_function_center(gl,0, sudut_max);
gl.glPopMatrix(); // end freeze state/event gl.glPopMatrix(); // end freeze state/event
// display drawing circle with function sudut_min dan sudut_max
gl.glPushMatrix(); // start freeze state/event to each object gl.glTranslatef(0.0f, 0.0f, -7.0f); gl.glScalef(0.5f,0.5f,0.5f); cir-
cle.draw_circle_color_with_fill_function(gl,0,sudut_m ax);
gl.glPopMatrix(); // end freeze state/event to each object
@Override public void onSurfaceChanged(GL10 gl, int width,
int height) { if (height == 0) height = 1; // To prevent divide by zero float aspect = (float) width / height; // Set the viewport (display area) to cover
the entire window
gl.glViewport(0, 0, width, height); // Setup perspective projection, with aspect
ratio matches viewport gl.glMatrixMode(GL10.GL_PROJECTION); // Se- lect projection matrix gl.glLoadIdentity(); // Reset projection ma- trix // Use perspective projection GLU.gluPerspective(gl, 45, aspect, 0.1f,
100.f); gl.glMatrixMode(GL10.GL_MODELVIEW); // Select model-view matrix gl.glLoadIdentity(); // Reset }
@Override public void onSurfaceCreated(GL10 gl, EGLConfig
config) { circle = new Circle(); }
MainActivity.java
package com.example.imacho.createcircle;
import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.view.Menu; import android.view.Window; import android.view.WindowManager;
/** * Created by Imacho on 4/5/2015. */
public class MainActivity extends Activity {
/** The OpenGL view */ private GLSurfaceView glSurfaceView;
@Override protected void onCreate(Bundle savedInstanceS-
tate) { super.onCreate(savedInstanceState);
// requesting to turn the title OFF requestWindowFea- ture(Window.FEATURE_NO_TITLE);
// making it full screen getWin- dow().setFlags(WindowManager.LayoutParams.FLAG_FULLSC REEN,
WindowManag- er.LayoutParams.FLAG_FULLSCREEN);
// Initiate the Open GL view and create an instance with this activity glSurfaceView = new GLSurfaceView(this);
// set our renderer to be the main renderer with the current activity context glSurfaceView.setRenderer(new ESRender()); setContentView(glSurfaceView);
/** * Remember to resume the glSurface */
@Override protected void onResume() {
super.onResume(); glSurfaceView.onResume();
/** * Also pause the glSurface */
@Override protected void onPause() {
super.onPause(); glSurfaceView.onPause();
@Override public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflat- // Inflate the menu; this adds items to the action bar if it is present. getMenuInflat-
Circle.java
package com.example.imacho.createcircle;
import android.util.Log;
import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
/** * Created by Imacho on 4/12/2015. */
public class Circle { private float vertices[] = { -0.5f, -0.5f, 0.0f, // V1 - first vertex // (x,y,z) -0.5f, 0.5f, 0.0f, // V2 0.5f, 0.5f, 0.0f, // V3 0.5f, -0.5f, 0.0f, // V4 -0.5f, -0.5f, 0.0f // V5
private float[] vertices_quad = { // Vertices for the square -1.0f, -1.0f, 0.0f, // 0. left-bottom 1.0f, -1.0f, 0.0f, // 1. right-bottom -1.0f, 1.0f, 0.0f, // 2. left-top 1.0f, 1.0f, 0.0f // 3. right-top
private float vertices_color[] = { 1.0f, 0.0f, 0.0f, 1.0f, // CV1 - first // color // (red,green,blue) 0.0f, 1.0f, 0.0f, 1.0f, // CV2 0.0f, 0.0f, 1.0f, 1.0f, // CV3 0.0f, 1.0f, 0.0f, 1.0f, // CV4 1.0f, 0.0f, 0.0f, 1.0f // CV5
//private float vertices_circle[] = { 0.0f, 0.0f, 0.0f }; //private float vertices_circle_color[] = { 0.0f, 0.0f, 0.0f, 0.5f }; private float vertices_circle[] = null; private float vertices_circle_color[] = null; private float ba-
tas_sudut_lower=0.0f,batas_sudut_upper = 360.0f; tas_sudut_lower=0.0f,batas_sudut_upper = 360.0f;
banyaknya titik yang di-generate int realloop;
private float getApproxValue(float f) {
if (Math.abs(f) < 0.001) {
return 0; } return f;
public Circle() {
// ============ start to generate vertices to circle // ========================== // Inisialisasi jari_jari = 1.0f;
// Titik Pusat a = 0.0f; b = 0.0f;
x = a + jari_jari; y = b; //step = 1.0f; step = 3.0f; byk_vertices1=(int) (((batas_sudut_upper-
batas_sudut_lower)+step)/ step); //byk_vertices=(((int) Math.floor((batas_sudut_upper-batas_sudut_lower)/ step))+1); // 4.7/0.1 = 46.9999 ??
byk_vertices=(((int) Math.round((batas_sudut_upper-batas_sudut_lower)/ step))+1);
loop = 0; loop_color = 0; realloop=0; // menambah nilai +1 untuk byk_vertices untuk
menghindari pemesanan memori yang kurang vertices_circle = new float[(byk_vertices+1) * 3]; vertices_circle_color = new float[(byk_vertices+1) * 4];
// dengan menggunakan while /*float teta = batas_sudut_lower; while(teta <= batas_sudut_upper+step){ //
+step untuk batas_sudut_upper, untuk mengatasi loop- ing yang kurang pada while dikarenakan bug pada nilai +step untuk batas_sudut_upper, untuk mengatasi loop- ing yang kurang pada while dikarenakan bug pada nilai
vertices_circle[loop] = (float) ((x - a) * getApprox- Value((float)Math.cos(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.sin(Math.toRadians(teta)))) + a); vertices_circle[loop + 1] = (float) ((x - a) * getApprox- Value((float)Math.sin(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.cos(Math.toRadians(teta)))) + b);
vertices_circle[loop + 2] = 0; loop += 3; realloop=realloop+1;
// mengenerate warna untuk setiap vertex vertices_circle_color[loop_color] =
(float) ((x - a) * Math.cos(Math.toRadians(teta)) - ((y - b) *
Math.sin(Math.toRadians(teta))) + a); vertices_circle_color[loop_color + 1] = (float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) *
Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f; vertices_circle_color[loop_color + 3] = 0.5f; loop_color += 4;
teta += step;
// dengan for for (float teta = batas_sudut_lower; teta <=
batas_sudut_upper+step; teta += step) { vertices_circle[loop] = (float) ((x - a) * getApprox- Value((float)Math.cos(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.sin(Math.toRadians(teta)))) + a); vertices_circle[loop + 1] = (float) ((x - a) * getApprox- Value((float)Math.sin(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.cos(Math.toRadians(teta)))) + b);
vertices_circle[loop + 2] = 0; loop += 3; realloop=realloop+1;
// mengenerate warna untuk setiap vertex vertices_circle_color[loop_color] =
(float) ((x - a)
* Math.cos(Math.toRadians(teta)) - ((y - b) *
Math.sin(Math.toRadians(teta))) + a); vertices_circle_color[loop_color + 1] = (float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) *
Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f; vertices_circle_color[loop_color + 3] = 0.5f; loop_color += 4; }
// ============= end for generate vertices to circle // ==================== }
public float[] create_circle(float fnti- tik_pusat_x, float fntitik_pusat_y, float fnjari_jari, float fnbatas_sudut_lower,float fnbatas_sudut_upper, float fnstep)
// Titik Pusat dan titik awal float fna = fntitik_pusat_x; float fnb = fntitik_pusat_y; float fnx = fna + fnjari_jari; float fny = fnb;
//int byk_vertices1=(int) (((ba- tas_sudut_upper-batas_sudut_lower)+step)/ step); //byk_vertices=(((int) Math.floor((batas_sudut_upper-batas_sudut_lower)/ step))+1); // 4.7/0.1 = 46.9999 ??
int fnbyk_vertices=(((int) Math.round((fnbatas_sudut_upper-fnbatas_sudut_lower)/ fnstep))+1);
int fnloop = 0; int fnloop_color = 0; int fnrealloop=0; // menambah nilai +1 untuk byk_vertices untuk
menghindari pemesanan memori yang kurang float[] fnvertices_circle = new float[(fnbyk_vertices+1) * 3];
float[] fnvertices_circle_color = new float[(fnbyk_vertices+1) * 4];
// dengan menggunakan while /*float teta = batas_sudut_lower; while(teta <= batas_sudut_upper+step){ //
+step untuk batas_sudut_upper, untuk mengatasi loop- ing yang kurang pada while dikarenakan bug pada nilai update tetanya karena float dan double android studio tidak stabil
vertices_circle[loop] = (float) ((x - a)
* getApprox- Value((float)Math.cos(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.sin(Math.toRadians(teta)))) + a); vertices_circle[loop + 1] = (float) ((x - a) * getApprox- Value((float)Math.sin(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.cos(Math.toRadians(teta)))) + b);
vertices_circle[loop + 2] = 0; loop += 3; realloop=realloop+1;
// mengenerate warna untuk setiap vertex vertices_circle_color[loop_color] =
(float) ((x - a) * Math.cos(Math.toRadians(teta)) - ((y - b) *
Math.sin(Math.toRadians(teta))) + a); vertices_circle_color[loop_color + 1] = (float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) *
Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f; vertices_circle_color[loop_color + 3] = 0.5f; loop_color += 4;
teta += step;
// dengan for for (float fnteta = fnbatas_sudut_lower;
fnteta <= fnbatas_sudut_upper+fnstep; fnteta += fnstep) {
fnvertices_circle[fnloop] = (float) ((fnx - fna) * getApprox- Value((float)Math.cos(Math.toRadians(fnteta))) - ((fny - fnb) * getApprox- Value((float)Math.sin(Math.toRadians(fnteta)))) + fna);
fnvertices_circle[fnloop + 1] = (float) ((fnx - fna) * getApprox- Value((float)Math.sin(Math.toRadians(fnteta))) - ((fny - fnb) * getApprox- Value((float)Math.cos(Math.toRadians(fnteta)))) + fnb);
fnvertices_circle[fnloop + 2] = 0; fnloop += 3; fnrealloop=fnrealloop+1;
return fnvertices_circle; return fnvertices_circle;
// Titik Pusat dan titik awal float fna = fntitik_pusat_x; float fnb = fntitik_pusat_y; float fnx = fna + fnjari_jari; float fny = fnb;
//int byk_vertices1=(int) (((ba- tas_sudut_upper-batas_sudut_lower)+step)/ step); //byk_vertices=(((int) Math.floor((batas_sudut_upper-batas_sudut_lower)/ step))+1); // 4.7/0.1 = 46.9999 ??
int fnbyk_vertices=(((int) Math.round((fnbatas_sudut_upper-fnbatas_sudut_lower)/ fnstep))+1);
//int fnloop = 0; int fnloop_color = 0; //int fnrealloop=0; // menambah nilai +1 untuk byk_vertices untuk
menghindari pemesanan memori yang kurang //float[] fnvertices_circle = new float[(fnbyk_vertices+1) * 3];
float[] fnvertices_circle_color = new float[(fnbyk_vertices+1) * 4];
// dengan menggunakan while /*float teta = batas_sudut_lower; while(teta <= batas_sudut_upper+step){ //
+step untuk batas_sudut_upper, untuk mengatasi loop- ing yang kurang pada while dikarenakan bug pada nilai update tetanya karena float dan double android studio tidak stabil
vertices_circle[loop] = (float) ((x - a) * getApprox- Value((float)Math.cos(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.sin(Math.toRadians(teta)))) + a); vertices_circle[loop + 1] = (float) ((x - a) * getApprox- Value((float)Math.sin(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.cos(Math.toRadians(teta)))) + b);
vertices_circle[loop + 2] = 0; loop += 3; realloop=realloop+1;
// mengenerate warna untuk setiap vertex vertices_circle_color[loop_color] =
(float) ((x - a) * Math.cos(Math.toRadians(teta))
- ((y - b) * Math.sin(Math.toRadians(teta))) + a); vertices_circle_color[loop_color + 1] = (float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) *
Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f; vertices_circle_color[loop_color + 3] = 0.5f; loop_color += 4;
teta += step;
// dengan for for (float fnteta = fnbatas_sudut_lower;
fnteta <= fnbatas_sudut_upper+fnstep; fnteta += fnstep) {
// mengenerate warna untuk setiap vertex fnvertices_circle_color[fnloop_color] =
(float) ((fnx - fna) * Math.cos(Math.toRadians(fnteta))
- ((fny - fnb) *
Math.sin(Math.toRadians(fnteta))) + fna); fnvertices_circle_color[fnloop_color + 1] = (float) ((fnx - fna) * Math.sin(Math.toRadians(fnteta))
- ((fny - fnb) *
Math.cos(Math.toRadians(fnteta))) + fnb); fnvertices_circle_color[fnloop_color + 2] = 0.5f; fnvertices_circle_color[fnloop_color + 3] = 0.5f; fnloop_color += 4; }
return fnvertices_circle_color; }
public float[] create_circle_center(float fnti- tik_pusat_x, float fntitik_pusat_y, float fnjari_jari, float fnbatas_sudut_lower,float fnbatas_sudut_upper, float fnstep)
// Titik Pusat dan titik awal float fna = fntitik_pusat_x; float fnb = fntitik_pusat_y; float fnx = fna + fnjari_jari; float fny = fnb;
//int byk_vertices1=(int) (((ba- tas_sudut_upper-batas_sudut_lower)+step)/ step); //byk_vertices=(((int)
Math.floor((batas_sudut_upper-batas_sudut_lower)/ step))+1); // 4.7/0.1 = 46.9999 ??
int fnbyk_vertices=(((int) Math.round((fnbatas_sudut_upper-fnbatas_sudut_lower)/ fnstep))+1);
//int fnloop = 0; int fnloop = 3; // dimulai dengan 3, karena
terdapat inisialisasi vertex awal fnvertices_circle[] = {0.0f,0.0f,0.0f};
// yang membutuhkan 3 lokasi
// karena fnloop = 3, maka fnbyk_vertices=fnbyk_vertices+1; fnbyk_vertices=fnbyk_vertices+1;
//int fnloop_color = 0; int fnrealloop=0;
float fnvertices_circle[] = {0.0f,0.0f,0.0f};
// menambah nilai +1 untuk byk_vertices untuk menghindari pemesanan memori yang kurang //float[] fnvertices_circle = new float[(fnbyk_vertices+1) * 3]; fnvertices_circle = new float[(fnbyk_vertices+1) * 3];
// dengan menggunakan while /*float teta = batas_sudut_lower; while(teta <= batas_sudut_upper+step){ //
+step untuk batas_sudut_upper, untuk mengatasi loop- ing yang kurang pada while dikarenakan bug pada nilai update tetanya karena float dan double android studio tidak stabil
vertices_circle[loop] = (float) ((x - a) * getApprox- Value((float)Math.cos(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.sin(Math.toRadians(teta)))) + a); vertices_circle[loop + 1] = (float) ((x - a) * getApprox- Value((float)Math.sin(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.cos(Math.toRadians(teta)))) + b);
vertices_circle[loop + 2] = 0; loop += 3; realloop=realloop+1;
// mengenerate warna untuk setiap vertex vertices_circle_color[loop_color] =
(float) ((x - a) * Math.cos(Math.toRadians(teta)) - ((y - b) *
Math.sin(Math.toRadians(teta))) + a); vertices_circle_color[loop_color + 1] =
(float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) *
Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f; vertices_circle_color[loop_color + 3] = 0.5f; loop_color += 4;
teta += step;
// dengan for for (float fnteta = fnbatas_sudut_lower;
fnteta <= fnbatas_sudut_upper+fnstep; fnteta += fnstep) {
fnvertices_circle[fnloop] = (float) ((fnx - fna) * getApprox- Value((float)Math.cos(Math.toRadians(fnteta))) - ((fny - fnb) * getApprox- Value((float)Math.sin(Math.toRadians(fnteta)))) + fna);
fnvertices_circle[fnloop + 1] = (float) ((fnx - fna) * getApprox- Value((float)Math.sin(Math.toRadians(fnteta))) - ((fny - fnb) * getApprox- Value((float)Math.cos(Math.toRadians(fnteta)))) + fnb);
fnvertices_circle[fnloop + 2] = 0; fnloop += 3; fnrealloop=fnrealloop+1;
return fnvertices_circle; }
public float[] create_circle_color_center(float fntitik_pusat_x, float fntitik_pusat_y, float fnjari_jari, float fnbatas_sudut_lower,float fnbatas_sudut_upper, float fnstep)
// Titik Pusat dan titik awal float fna = fntitik_pusat_x; float fnb = fntitik_pusat_y; float fnx = fna + fnjari_jari; float fny = fnb;
//int byk_vertices1=(int) (((ba- tas_sudut_upper-batas_sudut_lower)+step)/ step); //byk_vertices=(((int) Math.floor((batas_sudut_upper-batas_sudut_lower)/ step))+1); // 4.7/0.1 = 46.9999 ??
int fnbyk_vertices=(((int) Math.round((fnbatas_sudut_upper-fnbatas_sudut_lower)/ int fnbyk_vertices=(((int) Math.round((fnbatas_sudut_upper-fnbatas_sudut_lower)/
int fnloop_color = 4; // dimulai dengan 4, karena terdapat inisialisasi color awal fnverti- ces_circle_color[] = {0.0f,0.0f,0.0f,0.0f};
// yang membutuhkan 4 lokasi, dengan warna dibuat transparan (alpha=0.0f)
// karena fnloop_color = 4, maka fnbyk_vertices=fnbyk_vertices+1; fnbyk_vertices=fnbyk_vertices+1;
float fnvertices_circle_color[] = {0.0f,0.0f,0.0f,0.0f};
// menambah nilai +1 untuk byk_vertices untuk menghindari pemesanan memori yang kurang
//float[] fnvertices_circle_color = new float[(fnbyk_vertices+1) * 4]; fnvertices_circle_color = new float[(fnbyk_vertices+1) * 4];
// dengan menggunakan while /*float teta = batas_sudut_lower; while(teta <= batas_sudut_upper+step){ //
+step untuk batas_sudut_upper, untuk mengatasi loop- ing yang kurang pada while dikarenakan bug pada nilai update tetanya karena float dan double android studio tidak stabil
vertices_circle[loop] = (float) ((x - a) * getApprox- Value((float)Math.cos(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.sin(Math.toRadians(teta)))) + a); vertices_circle[loop + 1] = (float) ((x - a) * getApprox- Value((float)Math.sin(Math.toRadians(teta))) - ((y - b) * getApprox- Value((float)Math.cos(Math.toRadians(teta)))) + b);
vertices_circle[loop + 2] = 0; loop += 3; realloop=realloop+1;
// mengenerate warna untuk setiap vertex vertices_circle_color[loop_color] =
(float) ((x - a) * Math.cos(Math.toRadians(teta)) - ((y - b) *
Math.sin(Math.toRadians(teta))) + a); vertices_circle_color[loop_color + 1] = (float) ((x - a) * Math.sin(Math.toRadians(teta)) - ((y - b) *
Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f; Math.cos(Math.toRadians(teta))) + b); vertices_circle_color[loop_color + 2] = 0.5f;
teta += step;
// dengan for for (float fnteta = fnbatas_sudut_lower;
fnteta <= fnbatas_sudut_upper+fnstep; fnteta += fnstep) {
// mengenerate warna untuk setiap vertex fnvertices_circle_color[fnloop_color] =
(float) ((fnx - fna) * Math.cos(Math.toRadians(fnteta))
- ((fny - fnb) *
Math.sin(Math.toRadians(fnteta))) + fna); fnvertices_circle_color[fnloop_color + 1] = (float) ((fnx - fna) * Math.sin(Math.toRadians(fnteta))
- ((fny - fnb) *
Math.cos(Math.toRadians(fnteta))) + fnb); fnvertices_circle_color[fnloop_color + 2] = 0.5f; fnvertices_circle_color[fnloop_color + 3] = 0.5f; fnloop_color += 4; }
return fnvertices_circle_color; }
// Point to our vertex buffer, return buffer holding the vertices public static FloatBuffer makeFloatBuffer(float[] arr) { ByteBuffer bb = ByteBuff- er.allocateDirect(arr.length * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer fb = bb.asFloatBuffer(); fb.put(arr); fb.position(0); return fb;
/** The draw method for the primitive object with the GL context */ public void draw_circle_fraction(GL10 gl) { gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// set the colour for the object circle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(vertices_circle));
// draw circle contours gl.glDrawArrays(GL10.GL_LINES, 0,
byk_vertices);
/*Log.v("value loop", "" + loop); Log.v("value realloop", "" + realloop); Log.v("value loop/3", "" + loop / 3); Log.v("value loop/3", "" + (int) (loop / 3)); Log.v("value byk_vertices1", "" +
byk_vertices1); Log.v("value byk_vertices", "" + byk_vertices);*/
//Log.v("value vertices_circle.length", "" + vertices_circle.length); //Log.v("value batas_sudut / step", "" + (int) Math.ceil(batas_sudut_upper /step)); //Log.v("value byk_vertices dgn Ceil", "" + (int) Math.ceil((((batas_sudut_upper- batas_sudut_lower)+step)/ step)));
/*Log.v("value byk_vertices dgn Floor", "" + (((int) Math.floor((batas_sudut_upper- batas_sudut_lower)/ step))+1) );
Log.v("value batas_sudut_upper- batas_sudut_lower", "" + (batas_sudut_upper- batas_sudut_lower));
Log.v("value batas_sudut_upper- batas_sudut_lower/ step", "" + (batas_sudut_upper- batas_sudut_lower)/ step);
Log.v("value batas_sudut_upper- batas_sudut_lower/ step ceil ", "" + Math.ceil((batas_sudut_upper- batas_sudut_lower)/step));
Log.v("value batas_sudut_upper- batas_sudut_lower/ step floor", "" + Math.ceil((batas_sudut_upper- batas_sudut_lower)/step));
Log.v("value batas_sudut_upper- batas_sudut_lower/ step round", "" + Math.round((batas_sudut_upper- batas_sudut_lower)/step));*/
/*if(0.9f<=1.0f){ //Log.v("value 0.9f<=1.0f", "" + "True"); }else{ //Log.v("value 0.9f<=1.0f", "" + "False"); }
float aa=0.1f; float bb=1.0f; float cc=0.1f; while(aa<=bb+cc){
Log.v("value "+aa+"<="+ bb +"", "" + aa); aa=aa+cc; Log.v("value -----------"+aa+"<="+ bb
+"", "" + aa);
} Log.v("value 0.6f+0.1f", "" + (0.6f+0.1f)); Log.v("value 0.6+0.1", "" + (0.6+0.1));*/
/*Log.v("value round 9.0", "" + Math.round(9.0f)); Log.v("value round 9.1", "" + Math.round(9.1f)); Log.v("value round 9.2", "" + Math.round(9.2f)); Log.v("value round 9.3", "" + Math.round(9.3f)); Log.v("value round 9.4", "" + Math.round(9.4f)); Log.v("value round 9.5", "" + Math.round(9.5f)); Log.v("value round 9.6", "" + Math.round(9.6f)); Log.v("value round 9.7", "" + Math.round(9.7f)); Log.v("value round 9.8", "" + Math.round(9.8f)); Log.v("value round 9.9", "" + Math.round(9.9f));*/ /*Log.v("value step", "" + step);*/
//Log.v("value (int) (batas_sudut / step) * 3", "" + (int) (batas_sudut_upper / step) * 3); /*Log.v("value ceil 2.5 ", "" + Math.ceil(2.5));
Log.v("value int ceil 2.5 ", "" + (int) Math.ceil(2.5)); Log.v("value floor ", "" + Math.floor(2.5)); Log.v("value int ", "" + (int) (2.5)); Log.v("value ceil 5.0 ", "" +
Math.ceil(5.0));
Log.v("value int ceil 2.5 ", "" + (int) Math.ceil(5.0)); Log.v("value floor ", "" + Math.floor(5.0)); Log.v("value int ", "" + (int) (5.0));*/
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
public void draw_circle_fraction_one_color_with_nofill_function(G L10 gl, float sudut_min, float sudut_max) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// set the colour edge for the object circle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(create_circle(0.0f, 0.0f, 1.0f,sudut_min,sudut_max, 3.0f)));
// draw circle as filled shape gl.glDrawArrays(GL10.GL_LINES,
0,(int)(create_circle(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 3.0f).length/3)-1);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
public void draw_circle_one_color(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// set the colour for the object circle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(vertices_circle));
// draw circle contours gl.glDrawArrays(GL10.GL_LINE_STRIP, 0,
byk_vertices);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
public void draw_circle_one_color_with_nofill_function(GL10 gl, float sudut_min, float sudut_max) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// set the colour edge for the object circle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(create_circle(0.0f, 0.0f, 1.0f,sudut_min,sudut_max, 0.1f)));
// draw circle as filled shape gl.glDrawArrays(GL10.GL_LINE_STRIP,
0,(int)(create_circle(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 0.1f).length/3)-1);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
public void draw_circle_color(GL10 gl) { gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// set the colour edge for the object circle gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(vertices_circle));
// memetakan warna untuk setiap vertex gl.glColorPointer(4, GL10.GL_FLOAT, 0,
makeFloatBuff- er(vertices_circle_color));
// draw circle as filled shape gl.glDrawArrays(GL10.GL_LINE_STRIP,
0,byk_vertices);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); }
public void draw_circle_color_with_nofill_function(GL10 gl, float sudut_min, float sudut_max) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(create_circle(0.0f, 0.0f, 1.0f,sudut_min,sudut_max, 0.1f)));
// memetakan warna untuk setiap vertex gl.glColorPointer(4, GL10.GL_FLOAT, 0,
makeFloatBuff- er(create_circle_color(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 0.1f)));
// draw circle as filled shape gl.glDrawArrays(GL10.GL_LINE_STRIP,
0,(int)(create_circle(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 0.1f).length/3)-1);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); }
public void draw_circle_dinamic_color_fill(GL10 gl) { gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// set the colour edge for the object circle gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(vertices_circle));
// memetakan warna untuk setiap vertex gl.glColorPointer(4, GL10.GL_FLOAT, 0,
makeFloatBuff- er(vertices_circle_color));
// draw circle as filled shape gl.glDrawArrays(GL10.GL_TRIANGLE_FAN,
0,byk_vertices);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); }
public void draw_circle_color_with_fill_function(GL10 gl, float sudut_min, float sudut_max) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuffer(create_circle(0.0f, 0.0f, 1.0f,sudut_min,sudut_max, 0.1f)));
// memetakan warna untuk setiap vertex gl.glColorPointer(4, GL10.GL_FLOAT, 0,
makeFloatBuff- er(create_circle_color(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 0.1f)));
// draw circle as filled shape gl.glDrawArrays(GL10.GL_TRIANGLE_FAN,
0,(int)(create_circle(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 0.1f).length/3)-1);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); }
public void draw_circle_color_with_fill_function_center(GL10 gl, float sudut_min, float sudut_max) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// create VBO from buffer with glBufferData() gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
makeFloatBuff- er(create_circle_center(0.0f, 0.0f, 1.0f,sudut_min,sudut_max, 0.1f)));
// memetakan warna untuk setiap vertex gl.glColorPointer(4, GL10.GL_FLOAT, 0,
makeFloatBuff- makeFloatBuff-
// draw circle as filled shape gl.glDrawArrays(GL10.GL_TRIANGLE_FAN,
0,(int)(create_circle_center(0.0f, 0.0f, 1.0f, sudut_min,sudut_max, 0.1f).length/3)-1);
// Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/androi d"
package="com.example.imacho.createcircle" >
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity
android:name=".MainActivity" android:label="@string/app_name" an-
droid:screenOrientation="landscape" an- droid:configChanges="orientation|screenSize" > <intent-filter> <action an- droid:name="android.intent.action.MAIN" />
<category an- droid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
</manifest>
Source Code 2.10 Code Lain Membuat Lingkaran Sederhana GlRenderer.java
package com.example.opengl_introduction;
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLU; import android.opengl.GLSurfaceView.Renderer;
public class GlRenderer implements Renderer {
private Object object; // the triangle to be drawn
/** Constructor to set the handed over context */ public GlRenderer() {
this.object = new Object();
@Override public void onDrawFrame(GL10 gl) {
// clear Screen and Depth Buffer gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
// set background dgn warna putih gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glPushMatrix(); gl.glEnable(GL10.GL_LINE_SMOOTH); gl.glTranslatef(0.0f, 0.0f, -
5.0f); object.draw_circle(gl); gl.glPopMatrix();
gl.glPushMatrix(); gl.glTranslatef(0.0f, 0.0f, - 5.0f);
@Override public void onSurfaceChanged(GL10 gl, int width,
int height) { if(height == 0) { //Prevent A Divide By Zero By height = 1; //Making Height Equal One
gl.glViewport(0, 0, width, height); //Reset The Current Viewport gl.glMatrixMode(GL10.GL_PROJECTION); //Select The Projection Matrix gl.glViewport(0, 0, width, height); //Reset The Current Viewport gl.glMatrixMode(GL10.GL_PROJECTION); //Select The Projection Matrix
//Calculate The Aspect Ratio Of The Win- dow GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW); //Select The Modelview Matrix gl.glLoadIdentity(); //Reset The Modelview Matrix
/*gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluOrtho2D(gl, -1.0f, 1.0f, -1.0f, 1.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity();*/
@Override public void onSurfaceCreated(GL10 gl, EGLConfig
config) { object = new Object(); }
MainActivity.java
package com.example.opengl_introduction;
import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.view.Window; import android.view.WindowManager;
public class MainActivity extends Activity {
/** The OpenGL view */ private GLSurfaceView glSurfaceView;
/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requesting to turn the title OFF requestWindowFea-
ture(Window.FEATURE_NO_TITLE); // making it full screen ture(Window.FEATURE_NO_TITLE); // making it full screen
WindowManag- er.LayoutParams.FLAG_FULLSCREEN);
// Initiate the Open GL view and // create an instance with this activity glSurfaceView = new GLSurfaceView(this);
// set our renderer to be the main renderer with // the current activity context glSurfaceView.setRenderer(new GlRenderer()); setContentView(glSurfaceView);
/** * Remember to resume the glSurface */
@Override protected void onResume() {
super.onResume(); glSurfaceView.onResume();
/** * Also pause the glSurface */
@Override protected void onPause() {
super.onPause(); glSurfaceView.onPause();
Object.java
package com.example.opengl_introduction;
import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10; import android.opengl.GLES20;
public class Object {
private FloatBuffer vertexBuff- er,vertexBuffer3,vertexBuffer4;
// buffer holding the vertices private float vertices3[] = new float[20 * 3];
private float vertices[] = {
-0.5f, -0.5f, 0.0f, // V1 - first vertex (x,y,z) -0.5f, 0.5f, 0.0f,
// V1 - first vertex (x,y,z) 0.5f, 0.5f, 0.0f,
// V1 - first vertex (x,y,z) 0.5f, -0.5f, 0.0f,
// V2 - second vertex -0.5f, -0.5f, 0.0f
// V1 - first vertex (x,y,z) };
private float v_segitiga[] = { 1.0f,0.0f,0.0f, // titik ke-1 0.0f,1.0f,0.0f, // titik ke-2 -1.0f,0.0f,0.0f, // titik ke-3
private float vertices_color[] = { 1.0f, 0.0f, 0.0f, 1.0f, // V1 - first vertex (x,y,z) 0.0f, 1.0f, 0.0f, 1.0f, // V1 - first vertex (x,y,z) 0.0f, 0.0f, 1.0f, 1.0f, // V1 - first vertex (x,y,z) 0.0f, 1.0f, 0.0f, 1.0f, // V2 - second vertex 1.0f, 0.0f, 0.0f, 1.0f // V1 - first vertex (x,y,z) };
float in_i; int x1 = -5, y1 = -5 ; int x2= 5, y2 = 5 ; int outerVertexCount;
private float vertices_circle[]={0.0f,0.0f,0.0f}; private int points=360; float step=0.1f; private int loop;
public Object() {
//initial; float jari_jari=1.0f;
// Titik Pusat float a = 0.0f, b = 0.0f ; float x=a+jari_jari, y=b;
loop=3; //step=3; vertices_circle=new
float[(int)(3*points/step)*3]; for(float teta=0;teta<=2*points;teta+=step){
vertices_circle[loop] = (float) ((x-a)*Math.cos((teta/180)*(22/7)) - ((y-
b)*Math.sin((teta/180)*(22/7))) + a); vertices_circle[loop+1] = (float)
((x-a)*Math.sin((teta/180)*(22/7)) - ((y- b)*Math.cos((teta/180)*(22/7))) + b); vertices_circle[loop+2]=0; loop+=3; }
public static FloatBuffer makeFloatBuffer(float[] arr){ ByteBuffer bb = ByteBuff- er.allocateDirect(arr.length * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer fb = bb.asFloatBuffer(); fb.put(arr); fb.position(0); return fb;
/** The draw method for the primitive object with the GL context */ public void draw_line(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// set the colour for the line (pemberian warna untuk garis) gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
// Point to our vertex buffer (mendata nilai lokasi/posisi titik yang menyusun garis) gl.glVertexPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(new float [] { 1.0f, 1.0f, 0.0f, // V1 - first vertex (x,y,z) -1.0f, -1.0f, 0.0f,
// V2 - second vertex }));
// Draw the vertices as lines (menggambar garis dari titik-titik) gl.glDrawArrays(GL10.GL_LINES, 0, 2);
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
public void draw_circle(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// set the colour for the triangle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
//create VBO from buffer with glBuffer- Data() gl.glVertexPointer(3, GL10.GL_FLOAT, 0, make- FloatBuffer(vertices_circle));
//draw circle contours gl.glDrawArrays(GL10.GL_LINE_STRIP, 1, (int)
((int) 2*points/step)); //gl.glDrawArrays(GL10.GL_POINTS, 1, (int) ((int) 2*points/step));
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glPopMatrix();
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
public void draw_triangle(GL10 gl){
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//warna untuk triangle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
// memanggil lokasi titik x, y, z yang sdh diset gl.glVertexPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(v_segitiga));
// drawing gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
public void draw_segitiga(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// set the colour for the triangle gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(new float [] { -0.5f, -0.5f, 0.0f,
// V1 - first vertex (x,y,z) 0.5f, -0.5f, 0.0f,
// V2 - second vertex 0.0f, 0.5f, 0.0f
// V3 - third vertex }));
gl.glColorPointer(4, GL10.GL_FLOAT, 0, makeFloatBuffer(vertices_color));
// Draw the vertices as square gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
Gambar 2.19 Membuat Lingkaran Sederhana