Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Thread

Sunday, July 24, 2016 Add Comment
Thread
Thread merupakan sebuah intruksi yang dapat berjalan sendiri. Thread mempunyai siklus dari awal sampai akhir. Pada umumnya, thread digunakan untuk multitasking, networking, ataupun yang melibatkan proses secara konkuren.

Multithreading adalah suatu kemampuan yang memungkinkan beberapa kumpulan instruksi dapat dijalankan secara bersamaan dalam sebuah program. Untuk membuat thread baru yang terpisah dari thread utama, maka harus membuat class baru yang merupakan turunan dari kelas thread atau mengimplementasikan interface runnable

Contoh program :
Buat kelas dengan nama HalloThread.java
public class HalloThread extends Thread{
	String s;
	
	public HalloThread(String s) {
		// TODO Auto-generated constructor stub
		this.s = s;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			System.out.println(s+" "+i+" : Hallo");
			try {
				sleep(300);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}
Buat kelas lagi dengan nama TesHallo.java
public class TesHallo {
	public static void main(String[]args){
		HalloThread h1 = new HalloThread("TH 1");
		HalloThread h2 = new HalloThread("TH 2");
		HalloThread h3 = new HalloThread("TH 3");
		h1.start();
		h2.start();
		h3.start();
	}
}

Output :

TH 1 0 : Hallo
TH 3 0 : Hallo
TH 2 0 : Hallo
TH 3 1 : Hallo
TH 1 1 : Hallo
TH 2 1 : Hallo
TH 2 2 : Hallo
TH 3 2 : Hallo
TH 1 2 : Hallo
TH 3 3 : Hallo
TH 1 3 : Hallo
TH 2 3 : Hallo
TH 2 4 : Hallo
TH 3 4 : Hallo
TH 1 4 : Hallo
TH 2 5 : Hallo
TH 3 5 : Hallo
TH 1 5 : Hallo
TH 2 6 : Hallo
TH 1 6 : Hallo
TH 3 6 : Hallo
TH 2 7 : Hallo
TH 3 7 : Hallo
TH 1 7 : Hallo
TH 3 8 : Hallo
TH 1 8 : Hallo
TH 2 8 : Hallo
TH 2 9 : Hallo
TH 3 9 : Hallo
TH 1 9 : Hallo

Input dan Output File di Java

Sunday, June 19, 2016 1 Comment
File merupakan urutan data yang digunakan untuk melakukan encode informasi digital untuk urusan penyimpanan dan pertukaran data. Di Java, terdapat kelas FileInputStream dan FileOutputStream yang digunakan untuk menangani proses input-output. FileInputStream digunakan untuk membaca data dari file yang merupakan turunan langsung dari class InputStream, sedangkan FileOutputStream untuk menuliskan data ke file merupakan turunan langsung dari class OutputStream.

FileInputStream input = new FileInputStream("path..."); 
FileOutputStream output = new FileOutputStream("path...");

Berikut adalah contoh program sederhana untuk membaca, menulis dan mencopy file.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class IOFile {
    
    FileOutputStream out = null;
    FileInputStream input = null;
    int data;
    String copy ="";
    
    public void tulisFile(String data){
        try {
            out =  new FileOutputStream("C:/Users/Wim/juno/PraktikumSister/wim_asli.txt");
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        }
        
        //menulis
        try {
            for (int i = 0; i < data.length(); i++) {
                //konversi data
                out.write((int)data.charAt(i));
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        //tutup
        try {
            out.close();
        } catch (Exception e) {
        }
    }
    
    public void bacaFile(String namaFile){
        //membuka file
        try {
            input = new FileInputStream("C:/Users/Wim/juno/PraktikumSister/"+namaFile+".txt");
        } catch (FileNotFoundException e) {
            System.out.println("File tidak ditemukan !");
        }
        
        try {
            while ((data = input.read())!= -1) {                
                System.out.print((char)data);
                copy += String.valueOf((char)data);
            }
            System.out.println("");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        //tutup
        try {
            out.close();
        } catch (Exception e) {
        }
    }
    
    public void copyFile(){
        try {
            out =  new FileOutputStream("C:/Users/Wim/juno/PraktikumSister/wim_tiruan.txt");
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        }
        
        //menulis
        try {
            for (int i = 0; i < copy.length(); i++) {
                //konversi data
                out.write((int)copy.charAt(i));
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        //tutup
        try {
            out.close();
        } catch (Exception e) {
        }
    }
    
    public static void main(String[] args) {
     InputStreamReader in = new InputStreamReader(System.in);
 BufferedReader br = new BufferedReader(in);
  
 IOFile iofile = new IOFile();
       String data = "";
        
        System.out.println("--------------------------------");
        System.out.println("-----I/O File------");
        System.out.println("--------------------------------\n");
        
  try {
   System.out.print("Input data : ");
   data = br.readLine();
   iofile.tulisFile(data);
   System.out.print("Isi file asli : ");
   iofile.bacaFile("wim_asli");
   
   System.out.print("Copy data? (y/t) : ");
   String pilih = br.readLine();
   
   if(pilih.equalsIgnoreCase("y")){
    iofile.copyFile();
    System.out.print("Isi file tiruan : ");
    iofile.bacaFile("wim_tiruan");
   }else{
    System.exit(0);
   }
   
  } catch (Exception e) {
   // TODO: handle exception
  }
    }
}


Output :

Membuat Animasi 3D dengan Java 3D

Saturday, May 21, 2016 Add Comment
Kali ini saya ingin sharing project akhir di mata kuliah grafika komputer. Beberapa waktu lalu di beberapa postingan saya sempat membahas tentang 3D, dan ini mungkin postingan yang terakhir tentang Java3D. Karena sudah memasuki tahap akhir atau final jadi saya share aja project akhir saya, sifatnya open source jadi siapa saja boleh mengutak-atik source codenya.

Ini beberapa screenshot mengenai project akhir tentang grafika komputer. Jadi ceritanya ada orang berjalan, kemudian dari arah berlawanan datang mobil melaju. Mobil tersebut menabrak orang, kemudian orang itu mati lalu terkubur menjadi tanah. Dan pada akhirnya tumbuh menjadi pohon. Cerita dan ilustrasi ini hanyalah rekayasa atau imajinasi saya sendiri heheh…




Source codenya bisa dilihat disini https://gist.github.com/wimsonevel/d324f7786374de5c01b63d6b7cc3e1b1

Semoga bermanfaat.

Membuat Animasi Mobil 3D dengan Java 3D

Thursday, May 19, 2016 Add Comment
Halo guys, kali ini saya mau share project kuliah saya dulu. Masih di grafika komputer, saya membuat kerangka mobil 3D dengan Java 3D dan ini lumayan sulit. Sulitnya itu karena kita harus menggambar manual mulai dari bentuk shape dan pola-polanya. Kalau di Java 3D kita bisa menggunakan Point3f. Dengan Point3f kita bisa membuat kerangka bentuk 3D dengan menyatukan titik-titik atau koordinat x, y, z, maka terbentuklah bidang geometrinya.

Kemudian untuk mengatur animasinya menggunakan kelas Alpha dan PositionInterpolator.

Oke meluncur ke TKP gan.
/**
 *
 * @author Wim Sonevel
 */
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.geometry.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.universe.*;
import java.awt.*;
import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.*;
public class Mobil3D extends JApplet{

    TransformGroup mobil, badan, tban1, tban2, roda1, roda2, roda3, roda4;
    TransformGroup rot;
    TransformGroup kaca;

    Transform3D trans = new Transform3D();
    Vector3f vector = new Vector3f();

    Box box;
    Cylinder silinder;
    
    public Mobil3D(){
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        add("Center",canvas);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        SimpleUniverse simU = new SimpleUniverse(canvas);
        simU.getViewingPlatform().setNominalViewingTransform();
        simU.addBranchGraph(scene);
    }

    Appearance apr(float r, float g, float b){
        Color3f red = new Color3f(r,g,b);
        Color3f black = new Color3f(0.0f,0.0f,0.0f);
        Color3f white = new Color3f(1.0f,1.0f,1.0f);
        //mix warna
        Material material = new Material(red, black, red, white, 100);
        Appearance appearance = new Appearance();
        appearance.setMaterial(material);
        return appearance;
    }

    Transform3D transform(float x, float y, float z) {
        vector.set(x, y, z);
        trans.set(vector);
        return trans;
    }

    TransformGroup putarz (double d1, double d2){
        Transform3D rotate = new Transform3D();
        Transform3D temprotate = new Transform3D();
        rotate.rotZ(Math.PI/d1);
        temprotate.rotX(Math.PI/d2);
        rotate.mul(temprotate);
        TransformGroup objRotate = new TransformGroup(rotate);
        return objRotate;
    }
    
    void mobil(){
        mobil = new TransformGroup();
        mobil.setTransform(transform(0.0f, 0.0f, 0.0f));

        badan = new TransformGroup();
        
        Point3f [] pointMobil = {
            new Point3f(-2.8f, -0.2f, 0.0f),//0
            new Point3f(-0.8f, -0.2f, 0.0f),//1
            new Point3f(-2.4f, 0.8f, 0.0f),//2
            new Point3f(-1.2f, 1.0f, 0.0f),//3
            new Point3f(-0.5f, 0.5f, 0.0f),//4
            new Point3f(-0.7f, 2.0f, 0.0f),//5
            new Point3f(1.0f, 2.0f, 0.0f),//6
            new Point3f(0.2f, 0.5f, 0.0f),//7
            new Point3f(0.5f, -0.2f, 0.0f),//8
            new Point3f(2.3f, -0.2f, 0.0f),//9
            new Point3f(2.6f, 0.5f, 0.0f),//10
            new Point3f(3.4f, 2.0f, 0.0f),//11
            new Point3f(3.2f, 0.5f, 0.0f),//12
            new Point3f(3.9f, 1.0f, 0.0f),//13
            new Point3f(3.9f, -0.2f, 0.0f),//14
            new Point3f(3.5f, -0.2f, 0.0f),//15

            new Point3f(-2.8f, -0.2f, -2.0f),//16
            new Point3f(-0.8f, -0.2f, -2.0f),//17
            new Point3f(-2.4f, 0.8f, -2.0f),//18
            new Point3f(-1.2f, 1.0f, -2.0f),//19
            new Point3f(-0.5f, 0.5f, -2.0f),//20
            new Point3f(-0.7f, 2.0f, -2.0f),//21
            new Point3f(1.0f, 2.0f, -2.0f),//22
            new Point3f(0.2f, 0.5f, -2.0f),//23
            new Point3f(0.5f, -0.2f, -2.0f),//24
            new Point3f(2.3f, -0.2f, -2.0f),//25
            new Point3f(2.6f, 0.5f, -2.0f),//26
            new Point3f(3.4f, 2.0f, -2.0f),//27
            new Point3f(3.2f, 0.5f, -2.0f),//28
            new Point3f(3.9f, 1.0f, -2.0f),//29
            new Point3f(3.9f, -0.2f, -2.0f),//30
            new Point3f(3.5f, -0.2f, -2.0f),//31

            new Point3f(-0.8f, -0.2f, -1.5f),//32
            new Point3f(-0.8f, -0.2f, -0.5f),//33
            new Point3f(0.5f, -0.2f, -0.5f),//34
            new Point3f(0.5f, -0.2f, -1.5f),//35

            new Point3f(2.3f, -0.2f, -1.5f),//36
            new Point3f(2.3f, -0.2f, -0.5f),//37
            new Point3f(3.5f, -0.2f, -0.5f),//38
            new Point3f(3.5f, -0.2f, -1.5f)//39
        };

        int coordinate[] = {
            1, 2, 0,
            3, 2, 1,
            4, 3, 1,
            5, 3, 4,
            6, 5, 4,
            7, 6, 4,
            8, 6, 7,
            9, 6, 8,
            10, 6, 9,
            11, 6, 10,
            12, 11, 10,
            13, 11, 12,
            14, 13, 12,
            15, 14, 12,
            16, 18, 17,
            17, 18, 19,
            17, 19, 20,
            20, 19, 21,
            20, 21, 22,
            20, 22, 23,
            23, 22, 24,
            24, 22, 25,
            25, 22, 26,
            26, 22, 27,
            26, 27, 28,
            28, 27, 29,
            28, 29, 30,
            28, 30, 31,
            //atas
            0, 2, 16,
            2, 18, 16,
            2, 3, 18,
            3, 19, 18,
            3, 5, 19,
            5, 21, 19,
            5, 6, 21,
            6, 22, 21,
            6, 11, 22,
            11, 27, 22,
            11, 13, 27,
            13, 29, 27,
            13, 14, 29,
            14, 30, 29,
            //bawah
            16, 1, 0,
            16, 17, 1,
            31, 14, 15,
            31, 30, 14,
            24, 9, 8,
            24, 25, 9,
            //roda
            34, 33, 35,
            33, 32, 35,
            38, 37, 39,
            37, 36, 39
        };

        GeometryInfo gi = new GeometryInfo(GeometryInfo.TRIANGLE_ARRAY);
        gi.setCoordinates(pointMobil);
        gi.setCoordinateIndices(coordinate);
        NormalGenerator ng = new NormalGenerator();
        ng.generateNormals(gi);
        GeometryArray te = gi.getGeometryArray();

        Shape3D car = new Shape3D(te, apr(1.0f, 0.0f, 0.0f));
        badan.addChild(car);
        mobil.addChild(badan);

        tban1 = new TransformGroup();
        tban1.setTransform(transform(-0.15f, 0.0f, -1.0f));
        silinder = new Cylinder(0.1f, 2.25f, apr(1.0f, 1.0f, 1.0f));
        rot = putarz(1.0f, 2.0f);
        rot.addChild(silinder);
        tban1.addChild(rot);
        mobil.addChild(tban1);

        tban2 = new TransformGroup();
        tban2.setTransform(transform(2.9f, 0.0f, -1.0f));
        silinder = new Cylinder(0.1f, 2.25f, apr(1.0f, 1.0f, 1.0f));
        rot = putarz(1.0f, 2.0f);
        rot.addChild(silinder);
        tban2.addChild(rot);
        mobil.addChild(tban2);

        roda1 = new TransformGroup();
        roda1.setTransform(transform(-0.15f, 0.0f, -0.1f));
        silinder = new Cylinder(0.5f, 0.5f, apr(1.0f, 1.0f, 1.0f));
        rot = putarz(1.0f, 2.0f);
        rot.addChild(silinder);
        roda1.addChild(rot);
        mobil.addChild(roda1);
        
        roda2 = new TransformGroup();
        roda2.setTransform(transform(2.9f, 0.0f, -0.1f));
        silinder = new Cylinder(0.5f, 0.5f, apr(1.0f, 1.0f, 1.0f));
        rot = putarz(1.0f, 2.0f);
        rot.addChild(silinder);
        roda2.addChild(rot);
        mobil.addChild(roda2);

        roda3 = new TransformGroup();
        roda3.setTransform(transform(2.9f, 0.0f, -1.9f));
        silinder = new Cylinder(0.5f, 0.5f, apr(1.0f, 1.0f, 1.0f));
        rot = putarz(1.0f, 2.0f);
        rot.addChild(silinder);
        roda3.addChild(rot);
        mobil.addChild(roda3);

        roda4 = new TransformGroup();
        roda4.setTransform(transform(-0.15f, 0.0f, -1.9f));
        silinder = new Cylinder(0.5f, 0.5f, apr(1.0f, 1.0f, 1.0f));
        rot = putarz(1.0f, 2.0f);
        rot.addChild(silinder);
        roda4.addChild(rot);
        mobil.addChild(roda4);

        //kaca
        kaca = new TransformGroup();
        kaca.setTransform(transform(0.0f, 0.0f, 0.0f));

        Point3f[]pointkaca = {
            new Point3f(-1.25f, 0.95f, -0.1f),//0
            new Point3f(-0.75f, 1.9f, -0.1f),//1
            new Point3f(-0.75f, 1.9f, -1.9f),//2
            new Point3f(-1.25f, 0.95f, -1.9f),//3

            new Point3f(-1.15f, 0.95f, 0.05f),//4
            new Point3f(-0.7f, 1.85f, 0.05f),//5
            new Point3f(-0.7f, 0.95f, 0.05f),//6

            new Point3f(-1.15f, 0.95f, -2.05f),//7
            new Point3f(-0.7f, 1.85f, -2.05f),//8
            new Point3f(-0.7f, 0.95f, -2.05f),//9

            new Point3f(-0.5f, 0.95f, 0.05f),//10
            new Point3f(1.3f, 0.95f, 0.05f),//11
            new Point3f(1.3f, 1.85f, 0.05f),//12
            new Point3f(-0.5f, 1.85f, 0.05f),//13

            new Point3f(1.5f, 0.95f, 0.05f),//14
            new Point3f(3.3f, 0.95f, 0.05f),//15
            new Point3f(3.3f, 1.85f, 0.05f),//16
            new Point3f(1.5f, 1.85f, 0.05f),//17

            new Point3f(-0.5f, 0.95f, -2.05f),//18
            new Point3f(1.3f, 0.95f, -2.05f),//19
            new Point3f(1.3f, 1.85f, -2.05f),//20
            new Point3f(-0.5f, 1.85f, -2.05f),//21

            new Point3f(1.5f, 0.95f, -2.05f),//22
            new Point3f(3.3f, 0.95f, -2.05f),//23
            new Point3f(3.3f, 1.85f, -2.05f),//24
            new Point3f(1.5f, 1.85f, -2.05f),//25

            new Point3f(3.95f, 0.95f, -0.1f),//26
            new Point3f(3.45f, 1.9f, -0.1f),//27
            new Point3f(3.45f, 1.9f, -1.9f),//28
            new Point3f(3.95f, 0.95f, -1.9f),//29
        };

        int coor [] = {
            1, 2, 0,
            2, 3, 0,
            6, 5, 4,
            7, 8, 9,

            11, 12, 10,
            12, 13, 10,

            15, 16, 14,
            16, 17, 14,

            18, 20, 19,
            18, 21, 20,

            22, 24, 23,
            22, 25, 24,

            26, 28, 27,
            26, 29, 28
        };
        
        GeometryInfo gi2 = new GeometryInfo(GeometryInfo.TRIANGLE_ARRAY);
        gi2.setCoordinates(pointkaca);
        gi2.setCoordinateIndices(coor);
        NormalGenerator ng2 = new NormalGenerator();
        ng.generateNormals(gi2);
        GeometryArray te2 = gi2.getGeometryArray();

        Shape3D mirror = new Shape3D(te2, apr(0.0f, 1.0f, 1.0f));
        kaca.addChild(mirror);
        mobil.addChild(kaca);

        Transform3D mobilFlightAxis = new Transform3D();
        mobilFlightAxis.rotX(Math.PI/1);

        Alpha mobilAlpha = new Alpha(10,Alpha.INCREASING_ENABLE+Alpha.DECREASING_ENABLE,
                                      0,0,3000,30,
                                      0,3000,30,0);

        //The movement for the flight.
        PositionInterpolator posIPmobil = new PositionInterpolator(mobilAlpha,
                                                   mobil,mobilFlightAxis,
                                                   5.0f,0.0f);
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE);
        posIPmobil.setSchedulingBounds(bounds);

        mobil.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        mobil.addChild(posIPmobil);
    
    }
    public BranchGroup createSceneGraph() {
        BranchGroup root = new BranchGroup();
        TransformGroup objScale = new TransformGroup();
        //membuat transformasi
        Transform3D scaleTrans = new Transform3D();
        scaleTrans.set(1/6.0f);
        objScale.setTransform(scaleTrans);
        root.addChild(objScale);

        //objek transformasi
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objScale.addChild(objTrans);
        mobil();

        objTrans.addChild(mobil);

        BoundingSphere bounds = new BoundingSphere(new Point3d(), 100);
        Background bg = new Background(new Color3f(1.0f, 1.0f, 1.0f));
        bg.setApplicationBounds(bounds);
        objTrans.addChild(bg);

        //mengatur mouse
        MouseRotate mr = new MouseRotate();
        mr.setTransformGroup(objTrans);
        mr.setSchedulingBounds(bounds);
        mr.setFactor(0.007);
        objTrans.addChild(mr);

        //mengatur terang
        Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
        //penyebaran
        AmbientLight ambientLightNode = new AmbientLight(ambientColor);
        ambientLightNode.setInfluencingBounds(bounds);
        root.addChild(ambientLightNode);
        Color3f light1Color = new Color3f(1.0f, 1.0f, 1.0f);
        Vector3f light1Direction = new Vector3f(0.0f, -12.0f, -12.0f);
//        Vector3f light1Direction = new Vector3f(-0.2f, 0.0f, -0.8f);
        DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
        light1.setInfluencingBounds(bounds);
        root.addChild(light1);

        return root;
    }
    public static void main(String[] args) {
        Frame frame = new MainFrame(new Mobil3D(), 500,400);
        frame.setTitle("Mobil 3D");
        frame.setLocationRelativeTo(null);
    }
}

Outputnya :


Sekian dan semoga bermanfaat

Membuat Human 3D dengan Java 3D

Wednesday, May 18, 2016 Add Comment
Halo guys, kali ini saya mau share project kuliah saya dulu waktu semester tiga. Saya kepikiran daripada dibekam terus dilaptop mending di share aja, siapa tau berguna hehe. Disini saya membuat bentuk/kerangka human 3 dimensi. Bentuknya masih kasar banget, belum ada modelling, texture dan lainnya. Cuma berbentuk polosan saja, yakni sejumlah objek – objek yang digabungkan sehingga menyerupai bentuk human tiga dimensi.

Oke langsung ke TKP gan.
/**
 *
 * @author Wim Sonevel
 */
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.Sphere;
import java.awt.*;
import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.*;
public class Human3D extends JApplet{

    TransformGroup body;
    TransformGroup tgBola;
    TransformGroup tgBadan;
    TransformGroup tgBahu;
    TransformGroup tgLengan;
    TransformGroup tgTangan;
    TransformGroup tgKaki;

    Sphere bola;
    Cylinder silinder;

    Transform3D trans = new Transform3D();
    Vector3f vector = new Vector3f();

    public Human3D(){
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        add("Center",canvas);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        SimpleUniverse simU = new SimpleUniverse(canvas);
        simU.getViewingPlatform().setNominalViewingTransform();
        simU.addBranchGraph(scene);
    }

    Appearance apr(float r, float g, float b){
        Color3f red = new Color3f(r,g,b);
        Color3f black = new Color3f(0.0f,0.0f,0.0f);
        Color3f white = new Color3f(1.0f,1.0f,1.0f);
        //mix warna
        Material material = new Material(red, black, red, white, 100);
        Appearance appearance = new Appearance();
        appearance.setMaterial(material);
        return appearance;
    }

    Transform3D transform(float x, float y, float z) {
        vector.set(x, y, z);
        trans.set(vector);
        return trans;
    }

    void draw(){
     
        body = new TransformGroup();
        body.setTransform(transform(0.0f, 0.0f, 0.0f));

        tgBola = new TransformGroup();
        tgBola.setTransform(transform(0.0f, 3.0f, 0.0f));
        bola = new Sphere(1.0f, apr(1.0f, 0.0f, 0.0f));
        tgBola.addChild(bola);
        body.addChild(tgBola);

        tgBadan = new TransformGroup();
        tgBadan.setTransform(transform(0.0f, 0.2f, 0.0f));
        silinder = new Cylinder(1.5f, 3.5f, apr(1.0f, 0.0f, 0.0f));
        tgBadan.addChild(silinder);
        body.addChild(tgBadan);

        tgBahu = new TransformGroup();
        tgBahu.setTransform(transform(-1.95f, 1.5f, 0.0f));
        bola = new Sphere(0.45f, apr(1.0f, 0.0f, 0.0f));
        tgBahu.addChild(bola);
        body.addChild(tgBahu);

        tgBahu = new TransformGroup();
        tgBahu.setTransform(transform(1.95f, 1.5f, 0.0f));
        bola = new Sphere(0.45f, apr(1.0f, 0.0f, 0.0f));
        tgBahu.addChild(bola);
        body.addChild(tgBahu);

        tgLengan = new TransformGroup();
        tgLengan.setTransform(transform(-1.95f, 0.1f, 0.0f));
        silinder = new Cylinder(0.4f, 2.5f, apr(1.0f, 0.0f, 0.0f));
        tgLengan.addChild(silinder);
        body.addChild(tgLengan);

        tgLengan = new TransformGroup();
        tgLengan.setTransform(transform(1.95f, 0.1f, 0.0f));
        silinder = new Cylinder(0.4f, 2.5f, apr(1.0f, 0.0f, 0.0f));
        tgLengan.addChild(silinder);
        body.addChild(tgLengan);

        tgTangan = new TransformGroup();
        tgTangan.setTransform(transform(1.95f, -1.2f, 0.0f));
        bola = new Sphere(0.4f, apr(1.0f, 0.0f, 0.0f));
        tgTangan.addChild(bola);
        body.addChild(tgTangan);

        tgTangan = new TransformGroup();
        tgTangan.setTransform(transform(-1.95f, -1.2f, 0.0f));
        bola = new Sphere(0.4f, apr(1.0f, 0.0f, 0.0f));
        tgTangan.addChild(bola);
        body.addChild(tgTangan);

        tgKaki = new TransformGroup();
        tgKaki.setTransform(transform(0.7f, -3.0f, 0.0f));
        silinder = new Cylinder(0.5f, 3.0f, apr(1.0f, 0.0f, 0.0f));
        tgKaki.addChild(silinder);
        body.addChild(tgKaki);

        tgKaki = new TransformGroup();
        tgKaki.setTransform(transform(-0.7f, -3.0f, 0.0f));
        silinder = new Cylinder(0.5f, 3.0f, apr(1.0f, 0.0f, 0.0f));
        tgKaki.addChild(silinder);
        body.addChild(tgKaki);
    }
    BranchGroup createSceneGraph(){
        BranchGroup root = new BranchGroup();

        TransformGroup objScale = new TransformGroup();
        //membuat transformasi
        Transform3D scaleTrans = new Transform3D();
        scaleTrans.set(1/6.0f);
        objScale.setTransform(scaleTrans);
        root.addChild(objScale);

        //objek transformasi
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objScale.addChild(objTrans);

        draw();
        objTrans.addChild(body);

        BoundingSphere bounds = new BoundingSphere(new Point3d(), 100);
        Background bg = new Background(new Color3f(1.0f, 1.0f, 1.0f));
        bg.setApplicationBounds(bounds);
        objTrans.addChild(bg);

        //mengatur mouse
        MouseRotate mr = new MouseRotate();
        mr.setTransformGroup(objTrans);
        mr.setSchedulingBounds(bounds);
        mr.setFactor(0.007);
        objTrans.addChild(mr);

        //mengatur terang
        Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
        //penyebaran
        AmbientLight ambientLightNode = new AmbientLight(ambientColor);
        ambientLightNode.setInfluencingBounds(bounds);
        root.addChild(ambientLightNode);
        Color3f light1Color = new Color3f(1.0f, 1.0f, 1.0f);
        Vector3f light1Direction = new Vector3f(-0.2f, 0.0f, -0.8f);
        DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
        light1.setInfluencingBounds(bounds);
        root.addChild(light1);

        return root;
    }
    public static void main(String[] args) {
        Frame frame = new MainFrame(new Human3D(), 500,400);
        frame.setTitle("Human 3D");
        frame.setLocationRelativeTo(null);
    }
}


Outputnya :


Sekian dan semoga bermanfaat

Membuat Bangunan 3D dengan Java 3D

Tuesday, May 17, 2016 2 Comments
Halo guys, ini adalah project saya dulu waktu masih kuliah semester 4. Ceritanya dikasih tugas untuk membuat objek 3D menggunakan Java 3D. Ide langsung muncul dipikiran saya untuk membuat bangunan masjid berbentuk 3D. Sebenarnya sih tugasnya disuruh buat objek sederhana saja, tapi entah kenapa saya selalu ingin membuatnya lebih sulit dan berbeda dari yang lainnya… :v. Alhamdulillah berkat kerja keras sehari semalam selesai nih tugas.

Tapi yang bikin repot itu adalah ketika tugasnya disuruh tulis tangan semua source codenya. Bayangkan aja apa gag pegel tangan ini menulis source code sekitar 600an baris … :’v *sory TS curhat

Oke langsung saja, berhubung saya mau sharing source codenya daripada dibekam terus di laptop. Silahkan bagi agan-agan boleh untuk memodifikasi/mengutak-atik source codenya.
/**
 *
 * @author Wim Sonevel
 */
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.geometry.Cone;
import java.awt.*;
import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.*;
public class tigaD extends JApplet{

    //membuat objek transform group
    TransformGroup kotak;
    TransformGroup lantai;
    TransformGroup lantai2;
    TransformGroup lantai3;
    TransformGroup lantaibelakang3;
    TransformGroup lantaidepan3;

    TransformGroup dinding1;//didalam
    TransformGroup dinding2;
    TransformGroup dinding3;
    TransformGroup dinding4;
    TransformGroup dinding5;
    TransformGroup dinding6;
    
    TransformGroup tangga1;
    TransformGroup tangga2;
    TransformGroup tanggakiri1;

    TransformGroup tanggakanan1;
    TransformGroup tanggakanan2;
    TransformGroup tanggakanan3;
    TransformGroup tanggakanan4;
    TransformGroup tanggakanan5;
    TransformGroup tanggakanan6;

    TransformGroup tanggatengah1;
    TransformGroup tanggatengah2;
    TransformGroup tanggatengah3;
    TransformGroup tanggatengah4;
    TransformGroup tanggatengah5;
    TransformGroup tanggatengah6;
    TransformGroup tanggatengah7;
    TransformGroup tanggatengah8;

    TransformGroup tiang1;
    TransformGroup tiang2;
    TransformGroup tiangkiri1;
    TransformGroup tiangkiri2;
    TransformGroup tiangkiri3;
    TransformGroup tiangkiri4;
    TransformGroup tiangkiri5;

    TransformGroup tiangkanan1;
    TransformGroup tiangkanan2;

    TransformGroup tiangSilinder1;
    TransformGroup tiangSilinder2;
    TransformGroup tiangSilinder3;
    TransformGroup tiangSilinder4;
    TransformGroup tiangSilinder5;
    TransformGroup tiangSilinder6;
    TransformGroup tiangSilinderkiri1;
    TransformGroup tiangSilinderkiri2;

    TransformGroup tiangSilinderbelakang1;
    TransformGroup tiangSilinderbelakang2;
    TransformGroup tiangSilinderbelakang3;
    TransformGroup tiangSilinderbelakang4;
    TransformGroup tiangSilinderbelakang5;
    TransformGroup tiangSilinderbelakang6;

    TransformGroup tiangkanan3;
    TransformGroup tiangkanan4;
   
    TransformGroup tanggaSilinder1;
    TransformGroup tanggaSilinder2;

    TransformGroup atap1;
    TransformGroup atap2;
    TransformGroup atap3;
    TransformGroup atap4;
    TransformGroup atap5;

    TransformGroup atap;

    //objek transformasi
    Transform3D trans = new Transform3D();
    //vektor
    Vector3f vector = new Vector3f();

    public tigaD(){
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        //membuat canvas
        Canvas3D canvas = new Canvas3D(config);
        add("Center",canvas);
        //menginisialisasi scene graph
        BranchGroup scene = buatScene();
        //membuat universe
        SimpleUniverse simUniverse = new SimpleUniverse(canvas);
        simUniverse.getViewingPlatform().setNominalViewingTransform();
        //mengambil scene objek
        simUniverse.addBranchGraph(scene);
    }

    Appearance apr(float r, float g, float b){
        Color3f red = new Color3f(r,g,b);
        Color3f black = new Color3f(0.0f,0.0f,0.0f);
        Color3f white = new Color3f(0.0f,0.0f,0.0f);
        //mix warna
        Material material = new Material(red, black, red, white, 64);
        Appearance appearance = new Appearance();
        appearance.setMaterial(material);
        return appearance;
    }

    //method untuk membuat objek
    void kotak(){
        kotak = new TransformGroup();
        //menentukan letak/posisi
        vector.set(0.0f, -3.0f, 0.0f);
        trans.set(vector);
        //ditransformasikan
        kotak.setTransform(trans);
        //membuat box
        Box kotak1 = new Box(5.0f,0.1f,5.0f,apr(0.0f, 0.5f, 0.0f));
        //menambahkan child
        kotak.addChild(kotak1);

        lantai = new TransformGroup();
        vector.set(0.0f, -2.5f, 0.0f);
        trans.set(vector);
        lantai.setTransform(trans);
        Box lt = new Box(3.5f, 0.4f, 3.5f, apr(3.0f, 1.0f, 0.0f));
        lantai.addChild(lt);

        lantai2 = new TransformGroup();
        vector.set(0.0f, 0.2f, 0.0f);
        trans.set(vector);
        lantai2.setTransform(trans);
        Box lt2 = new Box(3.5f, 0.8f, 3.5f, apr(3.0f, 1.0f, 0.0f));
        lantai2.addChild(lt2);

        lantai3 = new TransformGroup();
        vector.set(0.0f, 0.4f, 3.8f);
        trans.set(vector);
        lantai3.setTransform(trans);
        Box lt3 = new Box(1.0f, 1.0f, 0.8f, apr(3.0f, 1.0f, 0.0f));
        lantai3.addChild(lt3);

        lantaibelakang3 = new TransformGroup();
        vector.set(0.0f, 0.4f, -3.8f);
        trans.set(vector);
        lantaibelakang3.setTransform(trans);
        Box ltbe3 = new Box(1.0f, 1.0f, 0.8f, apr(3.0f, 1.0f, 0.0f));
        lantaibelakang3.addChild(ltbe3);

        lantaidepan3 = new TransformGroup();
        vector.set(4.0f, 0.4f, 0.0f);
        trans.set(vector);
        lantaidepan3.setTransform(trans);
        Box ltde3 = new Box(1.0f, 1.0f, 0.8f, apr(3.0f, 1.0f, 0.0f));
        lantaidepan3.addChild(ltde3);

        dinding1 = new TransformGroup();
        vector.set(-2.0f, -1.0f, 2.5f);
        trans.set(vector);
        dinding1.setTransform(trans);
        Box d1 = new Box(1.3f, 1.5f, 0.05f, apr(2.0f, 1.0f, 1.0f));
        dinding1.addChild(d1);

        dinding2 = new TransformGroup();
        vector.set(-2.0f, -1.0f, -2.5f);
        trans.set(vector);
        dinding2.setTransform(trans);
        Box d2 = new Box(1.3f, 1.5f, 0.05f, apr(2.0f, 1.0f, 1.0f));
        dinding2.addChild(d2);

        dinding3 = new TransformGroup();
        vector.set(1.2f, -1.0f, 2.5f);
        trans.set(vector);
        dinding3.setTransform(trans);
        Box d3 = new Box(0.5f, 1.5f, 0.05f, apr(2.0f, 1.0f, 1.0f));
        dinding3.addChild(d3);

        dinding4 = new TransformGroup();
        vector.set(1.2f, -1.0f, -2.5f);
        trans.set(vector);
        dinding4.setTransform(trans);
        Box d4 = new Box(0.5f, 1.5f, 0.05f, apr(2.0f, 1.0f, 1.0f));
        dinding4.addChild(d4);

        dinding5 = new TransformGroup();
        vector.set(1.65f, -1.2f, 1.6f);
        trans.set(vector);
        dinding5.setTransform(trans);
        Box d5 = new Box(0.05f, 1.0f, 0.9f, apr(2.0f, 1.0f, 1.0f));
        dinding5.addChild(d5);

        dinding6 = new TransformGroup();
        vector.set(1.65f, -1.2f, -1.6f);
        trans.set(vector);
        dinding6.setTransform(trans);
        Box d6 = new Box(0.05f, 1.0f, 0.9f, apr(2.0f, 1.0f, 1.0f));
        dinding6.addChild(d6);

        tangga1 = new TransformGroup();
        vector.set(0.0f, -2.7f, 4.0f);
        trans.set(vector);
        tangga1.setTransform(trans);
        Box tg1 = new Box(0.8f, 0.3f, 0.5f, apr(5.0f, 1.0f, 0.0f));
        tangga1.addChild(tg1);

        tanggakiri1 = new TransformGroup();
        vector.set(-4.0f, -2.5f, 0.0f);
        trans.set(vector);
        tanggakiri1.setTransform(trans);
        Box tgk1 = new Box(0.5f, 0.4f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakiri1.addChild(tgk1);

        tangga2 = new TransformGroup();
        vector.set(0.0f, -2.75f, 4.7f);
        trans.set(vector);
        tangga2.setTransform(trans);
        Box tg2 = new Box(0.5f, 0.14f, 0.2f, apr(5.0f, 1.0f, 0.0f));
        tangga2.addChild(tg2);

        tiang1 = new TransformGroup();
        vector.set(0.7f, -1.5f, 3.7f);
        trans.set(vector);
        tiang1.setTransform(trans);
        Box ti1 = new Box(0.1f, 0.9f, 0.5f, apr(5.0f, 1.0f, 0.0f));
        tiang1.addChild(ti1);

        tiang2 = new TransformGroup();
        vector.set(-0.7f, -1.5f, 3.7f);
        trans.set(vector);
        tiang2.setTransform(trans);
        Box ti2 = new Box(0.1f, 0.9f, 0.5f, apr(5.0f, 1.0f, 0.0f));
        tiang2.addChild(ti2);

        tiangkiri1 = new TransformGroup();
        vector.set(-3.4f, -1.0f, 2.2f);
        trans.set(vector);
        tiangkiri1.setTransform(trans);
        Box tik1 = new Box(0.1f, 2.0f, 1.5f, apr(5.0f, 1.0f, 0.0f));
        tiangkiri1.addChild(tik1);

        tiangkiri2 = new TransformGroup();
        vector.set(-3.4f, -1.0f, -2.2f);
        trans.set(vector);
        tiangkiri2.setTransform(trans);
        Box tik2 = new Box(0.1f, 2.0f, 1.5f, apr(5.0f, 1.0f, 0.0f));
        tiangkiri2.addChild(tik2);

        tiangkiri3 = new TransformGroup();
        vector.set(-3.5f, -0.8f, -0.8f);
        trans.set(vector);
        tiangkiri3.setTransform(trans);
        Box tik3 = new Box(1.0f, 2.2f, 0.1f, apr(5.0f, 1.0f, 0.0f));
        tiangkiri3.addChild(tik3);

        tiangkiri4 = new TransformGroup();
        vector.set(-3.5f, -0.8f, 0.8f);
        trans.set(vector);
        tiangkiri4.setTransform(trans);
        Box tik4 = new Box(1.0f, 2.2f, 0.1f, apr(5.0f, 1.0f, 0.0f));
        tiangkiri4.addChild(tik4);

        tiangkiri5 = new TransformGroup();
        vector.set(-4.5f, -0.8f, 0.0f);
        trans.set(vector);
        tiangkiri5.setTransform(trans);
        Box tik5 = new Box(0.1f, 2.2f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tiangkiri5.addChild(tik5);

        tiangkanan1 = new TransformGroup();
        vector.set(4.0f, -1.7f, 1.0f);
        trans.set(vector);
        tiangkanan1.setTransform(trans);
        Box tika1 = new Box(1.0f, 1.2f, 0.1f, apr(5.0f, 1.0f, 0.0f));
        tiangkanan1.addChild(tika1);

        tiangkanan2 = new TransformGroup();
        vector.set(4.0f, -1.7f, -1.0f);
        trans.set(vector);
        tiangkanan2.setTransform(trans);
        Box tika2 = new Box(1.0f, 1.2f, 0.1f, apr(5.0f, 1.0f, 0.0f));
        tiangkanan2.addChild(tika2);

        tiangkanan3 = new TransformGroup();
        vector.set(3.4f, -1.7f, 3.2f);
        trans.set(vector);
        tiangkanan3.setTransform(trans);
        Box tika3 = new Box(0.1f, 1.2f, 0.3f, apr(5.0f, 1.0f, 0.0f));
        tiangkanan3.addChild(tika3);

        tiangkanan4 = new TransformGroup();
        vector.set(3.4f, -1.7f, -3.2f);
        trans.set(vector);
        tiangkanan4.setTransform(trans);
        Box tika4 = new Box(0.1f, 1.2f, 0.3f, apr(5.0f, 1.0f, 0.0f));
        tiangkanan4.addChild(tika4);

        tanggakanan1 = new TransformGroup();
        vector.set(3.65f, -2.6f, 2.5f);
        trans.set(vector);
        tanggakanan1.setTransform(trans);
        Box tgkanan1 = new Box(0.15f, 0.3f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakanan1.addChild(tgkanan1);

        tanggakanan2 = new TransformGroup();
        vector.set(3.95f, -2.7f, 2.5f);
        trans.set(vector);
        tanggakanan2.setTransform(trans);
        Box tgkanan2 = new Box(0.15f, 0.3f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakanan2.addChild(tgkanan2);
        
        tanggakanan3 = new TransformGroup();
        vector.set(4.22f, -2.75f, 2.5f);
        trans.set(vector);
        tanggakanan3.setTransform(trans);
        Box tgkanan3 = new Box(0.15f, 0.18f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakanan3.addChild(tgkanan3);

        tanggakanan4 = new TransformGroup();
        vector.set(3.65f, -2.6f, -2.5f);
        trans.set(vector);
        tanggakanan4.setTransform(trans);
        Box tgkanan4 = new Box(0.15f, 0.3f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakanan4.addChild(tgkanan4);

        tanggakanan5 = new TransformGroup();
        vector.set(3.95f, -2.7f, -2.5f);
        trans.set(vector);
        tanggakanan5.setTransform(trans);
        Box tgkanan5 = new Box(0.15f, 0.3f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakanan5.addChild(tgkanan5);

        tanggakanan6 = new TransformGroup();
        vector.set(4.22f, -2.75f, -2.5f);
        trans.set(vector);
        tanggakanan6.setTransform(trans);
        Box tgkanan6 = new Box(0.15f, 0.18f, 0.8f, apr(5.0f, 1.0f, 0.0f));
        tanggakanan6.addChild(tgkanan6);

        tanggatengah1 = new TransformGroup();
        vector.set(4.3f, -2.75f, 0.0f);
        trans.set(vector);
        tanggatengah1.setTransform(trans);
        Box tgtengah1 = new Box(0.8f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah1.addChild(tgtengah1);

        tanggatengah2 = new TransformGroup();
        vector.set(4.0f, -2.5f, 0.0f);
        trans.set(vector);
        tanggatengah2.setTransform(trans);
        Box tgtengah2 = new Box(0.8f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah2.addChild(tgtengah2);

        tanggatengah3 = new TransformGroup();
        vector.set(3.7f, -2.25f, 0.0f);
        trans.set(vector);
        tanggatengah3.setTransform(trans);
        Box tgtengah3 = new Box(0.8f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah3.addChild(tgtengah3);

        tanggatengah4 = new TransformGroup();
        vector.set(3.4f, -2.0f, 0.0f);
        trans.set(vector);
        tanggatengah4.setTransform(trans);
        Box tgtengah4 = new Box(0.8f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah4.addChild(tgtengah4);

        tanggatengah5 = new TransformGroup();
        vector.set(3.2f, -1.75f, 0.0f);
        trans.set(vector);
        tanggatengah5.setTransform(trans);
        Box tgtengah5 = new Box(0.6f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah5.addChild(tgtengah5);

        tanggatengah6 = new TransformGroup();
        vector.set(3.0f, -1.5f, 0.0f);
        trans.set(vector);
        tanggatengah6.setTransform(trans);
        Box tgtengah6 = new Box(0.4f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah6.addChild(tgtengah6);

        tanggatengah7 = new TransformGroup();
        vector.set(2.8f, -1.25f, 0.0f);
        trans.set(vector);
        tanggatengah7.setTransform(trans);
        Box tgtengah7 = new Box(0.2f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah7.addChild(tgtengah7);

        tanggatengah8 = new TransformGroup();
        vector.set(2.7f, -1.0f, 0.0f);
        trans.set(vector);
        tanggatengah8.setTransform(trans);
        Box tgtengah8 = new Box(0.1f, 0.18f, 0.9f, apr(5.0f, 1.0f, 0.0f));
        tanggatengah8.addChild(tgtengah8);

        tiangSilinder1 = new TransformGroup();
        vector.set(2.7f, -1.35f, 3.4f);
        trans.set(vector);
        tiangSilinder1.setTransform(trans);
        Cylinder ts1 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinder1.addChild(ts1);

        tiangSilinder2 = new TransformGroup();
        vector.set(2.0f, -1.35f, 3.4f);
        trans.set(vector);
        tiangSilinder2.setTransform(trans);
        Cylinder ts2 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinder2.addChild(ts2);

        tiangSilinder3 = new TransformGroup();
        vector.set(1.3f, -1.35f, 3.4f);
        trans.set(vector);
        tiangSilinder3.setTransform(trans);
        Cylinder ts3 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinder3.addChild(ts3);

        tiangSilinder4 = new TransformGroup();
        vector.set(-2.7f, -1.35f, 3.4f);
        trans.set(vector);
        tiangSilinder4.setTransform(trans);
        Cylinder ts4 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinder4.addChild(ts4);

        tiangSilinder5 = new TransformGroup();
        vector.set(-2.0f, -1.35f, 3.4f);
        trans.set(vector);
        tiangSilinder5.setTransform(trans);
        Cylinder ts5 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinder5.addChild(ts5);

        tiangSilinder6 = new TransformGroup();
        vector.set(-1.3f, -1.35f, 3.4f);
        trans.set(vector);
        tiangSilinder6.setTransform(trans);
        Cylinder ts6 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinder6.addChild(ts6);

        tiangSilinderkiri1 = new TransformGroup();
        vector.set(3.4f, -1.35f, 2.0f);
        trans.set(vector);
        tiangSilinderkiri1.setTransform(trans);
        Cylinder tski1 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderkiri1.addChild(tski1);

        tiangSilinderkiri2 = new TransformGroup();
        vector.set(3.4f, -1.35f, -2.0f);
        trans.set(vector);
        tiangSilinderkiri2.setTransform(trans);
        Cylinder tski2 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderkiri2.addChild(tski2);


        tiangSilinderbelakang1 = new TransformGroup();
        vector.set(2.7f, -1.35f, -3.4f);
        trans.set(vector);
        tiangSilinderbelakang1.setTransform(trans);
        Cylinder tsb1 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderbelakang1.addChild(tsb1);

        tiangSilinderbelakang2 = new TransformGroup();
        vector.set(2.0f, -1.35f, -3.4f);
        trans.set(vector);
        tiangSilinderbelakang2.setTransform(trans);
        Cylinder tsb2 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderbelakang2.addChild(tsb2);

        tiangSilinderbelakang3 = new TransformGroup();
        vector.set(1.3f, -1.35f, -3.4f);
        trans.set(vector);
        tiangSilinderbelakang3.setTransform(trans);
        Cylinder tsb3 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderbelakang3.addChild(tsb3);

        tiangSilinderbelakang4 = new TransformGroup();
        vector.set(-2.7f, -1.35f, -3.4f);
        trans.set(vector);
        tiangSilinderbelakang4.setTransform(trans);
        Cylinder tsb4 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderbelakang4.addChild(tsb4);

        tiangSilinderbelakang5 = new TransformGroup();
        vector.set(-2.0f, -1.35f, -3.4f);
        trans.set(vector);
        tiangSilinderbelakang5.setTransform(trans);
        Cylinder tsb5 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderbelakang5.addChild(tsb5);

        tiangSilinderbelakang6 = new TransformGroup();
        vector.set(-1.3f, -1.35f, -3.4f);
        trans.set(vector);
        tiangSilinderbelakang6.setTransform(trans);
        Cylinder tsb6 = new Cylinder(0.15f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        tiangSilinderbelakang6.addChild(tsb6);

        tanggaSilinder1 = new TransformGroup();
        vector.set(2.4f, -1.35f, 1.8f);
        trans.set(vector);
        tanggaSilinder1.setTransform(trans);
        Cylinder tas1 = new Cylinder(0.45f, 1.5f, apr(0.0f, 1.0f, 1.0f));
        tanggaSilinder1.addChild(tas1);

        tanggaSilinder2 = new TransformGroup();
        vector.set(2.4f, -1.35f, -1.8f);
        trans.set(vector);
        tanggaSilinder2.setTransform(trans);
        Cylinder tas2 = new Cylinder(0.45f, 1.5f, apr(0.0f, 1.0f, 1.0f));
        tanggaSilinder2.addChild(tas2);

        atap1 = new TransformGroup();
        vector.set(0.0f, 1.7f, 0.0f);
        trans.set(vector);
        atap1.setTransform(trans);
        Cylinder atp1 = new Cylinder(1.7f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        atap1.addChild(atp1);

        atap = new TransformGroup();
        vector.set(0.0f, 2.7f, 0.0f);
        trans.set(vector);
        atap.setTransform(trans);
        Sphere atp = new Sphere(1.7f, apr(5.0f, 1.0f, 0.0f));
        atap.addChild(atp);

        atap2 = new TransformGroup();
        vector.set(0.0f, 2.1f, 3.8f);
        trans.set(vector);
        atap2.setTransform(trans);
        Cone atp2 = new Cone(1.7f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        atap2.addChild(atp2);

        atap3 = new TransformGroup();
        vector.set(-3.5f, 2.1f, 0.0f);
        trans.set(vector);
        atap3.setTransform(trans);
        Cone atp3 = new Cone(1.7f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        atap3.addChild(atp3);

        atap4 = new TransformGroup();
        vector.set(0.0f, 2.1f, -3.8f);
        trans.set(vector);
        atap4.setTransform(trans);
        Cone atp4 = new Cone(1.7f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        atap4.addChild(atp4);

        atap5 = new TransformGroup();
        vector.set(4.0f, 2.1f, 0.0f);
        trans.set(vector);
        atap5.setTransform(trans);
        Cone atp5 = new Cone(1.7f, 1.5f, apr(6.0f, 0.0f, 0.0f));
        atap5.addChild(atp5);
    }

    //membuat scene graph
    BranchGroup buatScene(){
        //sebagai root
        BranchGroup objRoot = new BranchGroup();

        //membuat transform group untuk transformasi
        TransformGroup objScale = new TransformGroup();
        //membuat transformasi
        Transform3D scaleTrans = new Transform3D();
        scaleTrans.set(1/6.0f);
        objScale.setTransform(scaleTrans);
        objRoot.addChild(objScale);

        //objek transformasi
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objScale.addChild(objTrans);
        kotak();

        //meletakkan objek-objek sebagai child
        objTrans.addChild(kotak);
        objTrans.addChild(lantai);
        objTrans.addChild(lantai2);
        objTrans.addChild(lantai3);
        objTrans.addChild(lantaibelakang3);
        objTrans.addChild(lantaidepan3);

        objTrans.addChild(dinding1);
        objTrans.addChild(dinding2);
        objTrans.addChild(dinding3);
        objTrans.addChild(dinding4);
        objTrans.addChild(dinding5);
        objTrans.addChild(dinding6);
        
        objTrans.addChild(tangga1);
        objTrans.addChild(tanggakiri1);
        objTrans.addChild(tangga2);
        objTrans.addChild(tiang1);
        objTrans.addChild(tiang2);
        objTrans.addChild(tiangkiri1);
        objTrans.addChild(tiangkiri2);
        objTrans.addChild(tiangkiri3);
        objTrans.addChild(tiangkiri4);
        objTrans.addChild(tiangkiri5);
        objTrans.addChild(tiangkanan1);
        objTrans.addChild(tiangkanan2);
        objTrans.addChild(tiangkanan3);
        objTrans.addChild(tiangkanan4);
        objTrans.addChild(tanggakanan1);
        objTrans.addChild(tanggakanan2);
        objTrans.addChild(tanggakanan3);
        objTrans.addChild(tanggakanan4);
        objTrans.addChild(tanggakanan5);
        objTrans.addChild(tanggakanan6);
        objTrans.addChild(tanggatengah1);
        objTrans.addChild(tanggatengah2);
        objTrans.addChild(tanggatengah3);
        objTrans.addChild(tanggatengah4);
        objTrans.addChild(tanggatengah5);
        objTrans.addChild(tanggatengah6);
        objTrans.addChild(tanggatengah7);
        objTrans.addChild(tanggatengah8);
        
        objTrans.addChild(tiangSilinder1);
        objTrans.addChild(tiangSilinder2);
        objTrans.addChild(tiangSilinder3);
        objTrans.addChild(tiangSilinder4);
        objTrans.addChild(tiangSilinder5);
        objTrans.addChild(tiangSilinder6);

        objTrans.addChild(tiangSilinderkiri1);
        objTrans.addChild(tiangSilinderkiri2);

        objTrans.addChild(tiangSilinderbelakang1);
        objTrans.addChild(tiangSilinderbelakang2);
        objTrans.addChild(tiangSilinderbelakang3);
        objTrans.addChild(tiangSilinderbelakang4);
        objTrans.addChild(tiangSilinderbelakang5);
        objTrans.addChild(tiangSilinderbelakang6);

        objTrans.addChild(tanggaSilinder1);
        objTrans.addChild(tanggaSilinder2);

        objTrans.addChild(atap1);
        objTrans.addChild(atap);
        objTrans.addChild(atap2);
        objTrans.addChild(atap3);
        objTrans.addChild(atap4);
        objTrans.addChild(atap5);

        BoundingSphere bounds = new BoundingSphere(new Point3d(), 50);
        Background bg = new Background(new Color3f(9.0f, 9.0f, 8.0f));
        bg.setApplicationBounds(bounds);
        objTrans.addChild(bg);

        //mengatur mouse
        MouseRotate mr = new MouseRotate();
        mr.setTransformGroup(objTrans);
        mr.setSchedulingBounds(bounds);
        mr.setFactor(0.007);
        objTrans.addChild(mr);

        //mengatur terang
        Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
        //penyebaran 
        AmbientLight ambientLightNode = new AmbientLight(ambientColor);
        ambientLightNode.setInfluencingBounds(bounds);
        objRoot.addChild(ambientLightNode);
        Color3f light1Color = new Color3f(1.0f, 1.0f, 1.0f);
        Vector3f light1Direction = new Vector3f(-0.2f, -0.5f, -0.5f);
        DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
        light1.setInfluencingBounds(bounds);
        objRoot.addChild(light1);

        return objRoot;
    }
    public static void main(String[]args){
        Frame frame = new MainFrame(new tigaD(), 700,600);
        frame.setLocationRelativeTo(null);
    }
}


Hasilnya :


Sekian dan semoga bermanfaat.

Pengenalan Java 3D

Tuesday, May 17, 2016 Add Comment
Dalam grafika komputer, 3D adalah bentuk representasi dari data geometri tiga dimensi. Java3D merupakan API 3D yang dikembangkan oleh sun microsystems untuk merendering grafik 3D interaktif dengan pemrograman Java. Di dalam API Java3D terdapat sejumlah interface yang digunakan untuk manipulasi objek 3D.

Scene graph merupakan inti dari Java3D yang merepresentasikan geometri, material dan pencahayaan. Scene graph dimulai dari root dengan sebuah VirtualUniverse dan mencakup transformasi serta geometri untuk mendefinisikan objek 3D. Berikut adalah gambaran dari scene graph.

Source : Frank Klawonn, Introduction to Computer Graphics (Using Java 2D and 3D).

Secara garis besar, ada tiga tahap fundamental yang diperlukan untuk membuat objek 3D.
1. Menciptakan objek Canvas3D
2. Menciptakan sebuah scene graph
3. Menghubungkan object Canvas3D ke objek BranchGroup yang merujuk pada root dari scene graph.

Untuk memulai membuat objek 3D di Java, kita harus terlebih dahulu menginstall API Java3D.
API Java3D dapat di download di https://www.dropbox.com/s/844188j1vdnn4ag/j3d-1_5_2-windows-i586.zip?dl=0
Setelah itu install Java3D, kemudian import library j3dcore.jar, j3dutils.jar, vecmath.jar yang ada di folder cd:\c\Program Files\Java\jre6\lib\ext.

Java3D adalah materi waktu kuliah dulu, walaupun sudah agak lama jadi saya akan coba sharing aja sekedar nostalgia biar ndak lupa hehehe…

Berikut adalah contoh source code untuk membuat object 3D dengan Java.
/**
 *
 * @author Wim Sonevel
 */
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;
import java.awt.*;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.*;
import javax.vecmath.Vector3f;

public class HelloJava3D extends JApplet{

    public HelloJava3D(){
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(config);
        add("Center",canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        SimpleUniverse su = new SimpleUniverse(canvas3D);
        su.getViewingPlatform().setNominalViewingTransform();
        su.addBranchGraph(scene);
    }

    BranchGroup createSceneGraph(){
        BranchGroup objRoot = new BranchGroup();

        Transform3D translate = new Transform3D();
        translate.set(new Vector3f(0.0f, 0.0f, 0.0f));

        Transform3D rotate = new Transform3D();
        rotate.rotX(Math.PI / 4);
        
        TransformGroup kotak1 = new TransformGroup(rotate);
        ColorCube cube1 = new ColorCube(0.2f);

        kotak1.addChild(cube1);

        translate.set(new Vector3f(0.0f, 0.6f, 0.0f));
        TransformGroup kotak2 = new TransformGroup(translate);
        ColorCube cube2 = new ColorCube(0.2f);

        kotak2.addChild(cube2);

        translate.set(new Vector3f(0.5f, 0.0f, 0.0f));
        TransformGroup kotak3 = new TransformGroup(translate);
        ColorCube cube3 = new ColorCube(0.1f);

        kotak3.addChild(cube3);

        TransformGroup kotak = new TransformGroup();
        kotak.addChild(kotak1);
        kotak.addChild(kotak2);
        kotak.addChild(kotak3);

        objRoot.addChild(kotak);
        return objRoot;
    }

    public static void main(String[] args) {
        Frame frame = new MainFrame(new HelloJava3D(), 600,600);
        frame.setLocationRelativeTo(null);
    }
}


Kalau di jalankan maka hasilnya seperti berikut :


Sekian dan semoga bermanfaat.
Happy Coding :)

Membuat Animasi Orang Berjalan menggunakan Thread di Java 2D

Wednesday, May 11, 2016 8 Comments
Halo gan! Ini adalah project ane dulu waktu masih kuliah. Jadi tugasnya itu membuat animasi bergerak. Nah, dasar dari sebuah animasi itu adalah thread.

Apa itu thread? Nanti saya akan jelaskan di postingan yang akan datang.

Konsepnya sebenarnya sederhana, jadi ada sebuah thread yang mengatur jalannya animasi. Kita dapat mengatur millisecond ketika thread berjalan.

Inti dari project saya ini yaitu ada dua buat gambar/posisi orang, kemudian bergerak dan berubah posisi secara bergantian.

Oke langsung lihat saja source codenya, bebas untuk di utak-atik :
Buat kelas java dengan nama human2D.java
/**
 *
 * @author Wim Sonevel
 */
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
public class human2D extends JApplet{
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Human 2D");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet applet = new human2D();
        applet.init();
        frame.getContentPane().add(applet);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }
    @Override
    public void init(){
        JPanel panel = new PanelHuman();
        getContentPane().add(panel);
    }
}
class PanelHuman extends JPanel implements Runnable{

    //inisialisasi koordinat orang
    int xHuman = -500, yHuman = 100, vHuman = 1;
    //inisialisasi koordinat awan
    int mulai = 100;

    //memanggil kelas thread
    animasiOrang orang = new animasiOrang(this, xHuman, yHuman, vHuman);
    animasiAwan awan = new animasiAwan(this, mulai);

    PanelHuman(){
        setPreferredSize(new Dimension(1000, 600));
        setBackground(Color.white);
        //membuat thread
        Thread thread = new Thread(this);
        //memulai thread
        thread.start();
        orang.start();
        awan.start();
    }
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        drawLangit(g2, 0, 0);
        drawRumput(g2, 0, 300);
        drawJalan(g2, 0, 350);
        drawSemak(g2, 0, 300);
        drawSemak(g2, 300, 300);
        drawSemak(g2, 650, 300);
        //gettter koordinat orang
        xHuman = orang.getX();
        yHuman = orang.getY();
        vHuman = orang.getV();
        drawHuman(g2, xHuman, yHuman, vHuman);
        //getter koordinat awan
        mulai = awan.getOrdinat();
        drawMatahari(g2, 900, 20);
        drawAwan(g2, 880+mulai, 100);
        drawAwan(g2, 800+mulai, 50);
        drawAwan(g2, 500+mulai, 50);
        drawAwan(g2, 380+mulai, 70);
        drawTulisan(g2, 50, 570);
    }

    //method menggambar matahari
    public void drawMatahari(Graphics2D g2, int x, int y){
        Ellipse2D.Double matahari = new Ellipse2D.Double(x, y, 80, 80);
        GradientPaint warnaMatahari = new GradientPaint(870, 20, Color.white, 950, 0, Color.yellow);
        g2.setPaint(warnaMatahari);
        g2.fill(matahari);
    }
    //method menggambar awan
    public void drawAwan(Graphics2D g2, int x, int y){
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(2.0f));
        GeneralPath gp = new GeneralPath();
        gp.moveTo(x, y);
        gp.curveTo(x, y, x+20, y-30, x+40, y);
        gp.curveTo(x+40, y, x+60, y-30, x+80, y);
        gp.curveTo(x+80, y, x+130, y+20, x+80, y+40);
        gp.curveTo(x+80, y+40, x+60, y+60, x+40, y+40);
        gp.curveTo(x+40, y+40, x+20, y+60, x, y+40);
        gp.curveTo(x, y+40, x-50, y+20, x, y);
        g2.setColor(Color.white);
        g2.draw(gp);
        g2.fill(gp);

    }
    //method menggambar rumput
    public void drawRumput(Graphics2D g2, int x, int y){
        Rectangle2D.Double rumput = new Rectangle2D.Double(x, y, 1000, 300);
        g2.setColor(Color.green);
        g2.fill(rumput);
    }
    //method menggambar jalan
    public void drawJalan(Graphics2D g2, int x, int y){
        Rectangle2D.Double jalan = new Rectangle2D.Double(x, y, 1000, 150);
        g2.setColor(new Color(224, 147, 18));
        g2.fill(jalan);
    }
    //method menggambar langit
    public void drawLangit(Graphics2D g2, int x, int y){
        Rectangle2D.Double langit = new Rectangle2D.Double(x, y, 1000, 300);
        GradientPaint warna = new GradientPaint(0, 0, Color.cyan, 0, 250, Color.white);
        g2.setPaint(warna);
        g2.fill(langit);
    }
    //method menggambar orang
    public void drawHuman(Graphics2D g2, int x, int y, int v){
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(15, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        //gambar 1
        Ellipse2D.Double head = new Ellipse2D.Double(x+300, y+100, 50, 50);

        GeneralPath gp = new GeneralPath();
        gp.moveTo(x+325, y+150);
        gp.lineTo(x+325, y+170);
        gp.lineTo(x+300, y+200);
        gp.lineTo(x+305, y+230);
        gp.moveTo(x+325, y+170);
        gp.lineTo(x+345, y+210);
        gp.lineTo(x+365, y+225);
        gp.moveTo(x+325, y+170);
        gp.lineTo(x+325, y+240);
        gp.lineTo(x+315, y+280);
        gp.lineTo(x+295, y+310);
        gp.lineTo(x+305, y+310);
        gp.moveTo(x+325, y+240);
        gp.lineTo(x+360, y+310);
        gp.lineTo(x+370, y+310);

        //gambar 2
        Ellipse2D.Double head2 = new Ellipse2D.Double(x+300, y+100, 50, 50);

        GeneralPath gp2 = new GeneralPath();
        gp2.moveTo(x+325, y+150);
        gp2.lineTo(x+325, y+170);
        gp2.lineTo(x+310, y+200);
        gp2.lineTo(x+305, y+230);
        gp2.moveTo(x+325, y+170);
        gp2.lineTo(x+335, y+210);
        gp2.lineTo(x+345, y+230);
        //kaki kiri
        gp2.moveTo(x+325, y+170);
        gp2.lineTo(x+325, y+240);
        gp2.lineTo(x+350, y+270);
        gp2.lineTo(x+300, y+290);
        gp2.lineTo(x+300, y+300);
        //kaki kanan
        gp2.moveTo(x+325, y+240);
        gp2.lineTo(x+325, y+310);
        gp2.lineTo(x+335, y+310);

        g2.setColor(Color.white);
        if(v==1){
            g2.draw(head);
            g2.fill(head);
            g2.draw(gp);
        }else{
            g2.draw(head2);
            g2.fill(head2);
            g2.draw(gp2);
        }
    }
    //method menggambar semak
    public void drawSemak(Graphics2D g2, int x, int y){
        g2.setColor(new Color(44, 133, 55));
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(2.0f));
        GeneralPath gp = new GeneralPath();
        gp.moveTo(x, y);
        gp.quadTo(x+30, y-80, x+60, y-50);
        gp.quadTo(x+80, y-90, x+100, y-50);
        gp.quadTo(x+150, y-100, x+180, y-50);
        gp.quadTo(x+210, y-90, x+230, y-50);
        gp.quadTo(x+250, y-80, x+260, y-50);
        gp.quadTo(x+280, y-70, x+300, y-30);
        gp.quadTo(x+310, y-50, x+320, y);
        gp.lineTo(x, y);
        g2.draw(gp);
        g2.fill(gp);

    }
    //method menggambar tulisan
    public void drawTulisan(Graphics2D g2, int x, int y){
        Font font = new Font("Serif", Font.BOLD, 75);
        FontRenderContext frc = g2.getFontRenderContext();
        GlyphVector gv = font.createGlyphVector(frc, "Jalan-Jalan");
        Shape glyph = gv.getOutline(x,y);
        g2.setStroke(new BasicStroke(3.0f));
        g2.draw(glyph);
        g2.setColor(Color.ORANGE);
        g2.fill(glyph);
    }

    public void run() {
        while(true){
            try{
                Thread.sleep(20);
            }catch(Exception e){}
        }
    }
}

Buat kelas dengan nama animasiOrang.java
/**
 *
 * @author Wim Sonevel
 */
import javax.swing.*;
public class animasiOrang extends Thread implements Runnable{
    JPanel panel;
    int x, y, v;

    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public int getV(){
        return v;
    }

    public animasiOrang(JPanel panel, int x, int y, int v){
        this.panel = panel;
        this.x = x;
        this.y = y;
        this.v = v;
    }
    @Override
            public void run() {
                while (true) {
                    // 
                    if (x < 1000) {
                        if (v == 1) {
                            x = x + 15;
                            v = 2;
                        } else {
                            x = x + 15;
                            v = 1;
                        }
                    } else {
                        x = -400;
                    }
                    // 
                    try {
                        //untuk mengatur kecepatan thread, semakin kecil nilai semakin cepat
                        Thread.sleep(300);
                    } catch (Exception e) {
                    }
                    panel.repaint();
                }
            }
}



Buat kelas dengan nama animasiAwan.java
/**
 *
 * @author Wim Sonevel
 */
import javax.swing.*;
public class animasiAwan extends Thread implements Runnable{
    JPanel panel;
    int ordinat=800;

    public int getOrdinat(){
        return ordinat;
    }

    public final int mulai = 100;
    int kode;

    public animasiAwan(JPanel panel, int kode){
        this.panel = panel;
        this.kode = kode;
    }
    @Override
    public void run(){
        while(true){
            
               if(kode==mulai)
                    ordinat-=5;

                if(ordinat<=-500)
                    ordinat=kode;

            try{
                Thread.sleep(100);
            }catch(Exception e){
                e.printStackTrace();
            }
            panel.repaint();
        }
    }
}

Output :


Sekian dan semoga bermanfaat.
Thanks :)

Text dan Font di Java 2D

Wednesday, May 11, 2016 Add Comment
Java 2D menyediakan kumpulan font dan text yang dapat dimanipulasi sedemikian rupa. Text digambarkan dengan serangkaian karakter dengan pola pengkodean standar sepeti ASCII dan Unicode. Penggambaran bentuk dari karakter ditentukan oleh font standar. Geometri yang menggambarkan bentuk karakter dikenal dengan glyph. Jadi, font adalah kumpulan dari glyph untuk seluruh abjad.
Penggunaan font di Java 2D dapat dilakukan dengan memanggil method setFont dan drawstring di Graphics2D. Font yang tersedia di lingkungan tergantung pada platform. Di Java mendukung beberapa font diantaranya :

Serif
SanSerif
Monospaced
Dialog
DialogInput

Selain itu terdapat parameter style yang memungkinkan untuk memanipulasi bentuk font diantaranya :

PLAIN
ITALIC
BOLD


Berikut ini beberapa contoh source code untuk mendemonstrasikan penggunaan font.
/**
 *
 * @author Wim Sonevel
 */
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class FontFun1 extends JApplet{
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setTitle("Fonts");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet applet = new FontFun1();
        applet.init();
        frame.getContentPane().add(applet);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }
    @Override
    public void init(){
        JPanel panel = new FontPanel();
        getContentPane().add(panel);
    }
}
class FontPanel extends JPanel{
    FontPanel(){
        setPreferredSize(new Dimension(640, 480));
        setBackground(Color.white);
    }
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        //menentukan nama, bentuk dan ukuran font
        Font font = new Font("Serif", Font.BOLD, 75);
        //transformasi affine
        AffineTransform tx = new AffineTransform();
        tx.shear(0.5, 0.1);
        //font turunan hasil modifikasi dengan tranformasi affine
        g2.setFont(font.deriveFont(tx));
        g2.drawString("Wim Sonevel", 100, 225);
    }
}

Outputnya :

/**
 *
 * @author Wim Sonevel
 */
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.*;
import javax.swing.*;
public class FontFun2 extends JApplet{
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setTitle("Fonts");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet applet = new FontFun2();
        applet.init();
        frame.getContentPane().add(applet);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }
    @Override
    public void init(){
        JPanel panel = new FontPanel2();
        getContentPane().add(panel);
    }
}
class FontPanel2 extends JPanel{
    FontPanel2(){
        setPreferredSize(new Dimension(640, 480));
        setBackground(Color.white);
    }
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        Font font = new Font("Serif", Font.BOLD|Font.PLAIN|Font.ITALIC, 75);

        FontRenderContext frc = g2.getFontRenderContext();
        GlyphVector gv = font.createGlyphVector(frc, "Wim Sonevel");
        Shape glyph = gv.getOutline(100,100);
        g2.setStroke(new BasicStroke(3.0f));
        g2.rotate(Math.toRadians(45), 100, 100);
        g2.draw(glyph);
        g2.setColor(Color.blue);
        g2.fill(glyph);
    }
}

Output :

/**
 *
 * @author Wim Sonevel
 */
import javax.swing.*;
import java.awt.*;
import java.awt.font.*;
public class FontFun3 extends JApplet{
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Font Fun 3");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet applet = new FontFun3();
        applet.init();
        frame.getContentPane().add(applet);
        frame.pack();
        frame.setVisible(true);
    }
    @Override
    public void init(){
        JPanel panel = new FontPanel3();
        getContentPane().add(panel);
    }
}
class FontPanel3 extends JPanel{
    public FontPanel3(){
        setPreferredSize(new Dimension(600, 500));
        setBackground(Color.white);
    }
    @Override
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        Font font = new Font("Serif",Font.BOLD,50);
        //font render
        FontRenderContext fr = g2.getFontRenderContext();
        GlyphVector gv = font.createGlyphVector(fr, "Wim Sonevel");
        Shape text = gv.getOutline(100, 100);

        g2.setStroke(new BasicStroke(5.0f));
        g2.setColor(Color.red);
        g2.rotate(Math.toRadians(30),100,100);
        g2.draw(text);
   
    }
}

Outputnya :

Pewarnaan Objek Geometri di Java 2D

Tuesday, May 10, 2016 Add Comment
Pewarnaan (filling) dapat diterapkan ke dalam pembuatan objek geometri. Objek geometri dapat digambar dengan method fill atau draw. Untuk menambahkan warna pada objek geometri, kita dapat menambahkan method dari kelas Graphics.

void setColor(Color c) 

Objek Color didefinisikan sebagai sebuah warna. Kelas Color secara default menggunakan rentan warna RGB. Berikut ini adalah contoh penggunaan Color di Java 2D.

/**
 *
 * @author Wim Sonevel
 */
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class SegiPanjangWarna extends JApplet {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Persegi Panjang Warna");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet applet = new SegiPanjangWarna();
        applet.init();
        frame.getContentPane().add(applet);
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public void init() {
        JPanel panel = new Panel2D2();
        getContentPane().add(panel);
    }
}

class Panel2D2 extends JPanel {

    // variabel koordinat
    int x = 0;
    int y = 0;

    public Panel2D2() {
        setPreferredSize(new Dimension(500, 400));
        setBackground(Color.white);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        //panggil method
        gambar(g2, x, y);
    }

    //method dengan parameter x dan y
    public void gambar(Graphics2D g2, int x, int y) {
        //gambar persegi panjang
        Rectangle2D.Double persegipanjang = new Rectangle2D.Double(x + 100, y + 50, 200, 100);
        g2.setColor(Color.GREEN);
        g2.fill(persegipanjang);
        g2.setColor(Color.blue);
        g2.setStroke(new BasicStroke(3.0f));
        g2.draw(persegipanjang);
    }
}


Output :

Membuat Tipe-Tipe Garis di Java 2D

Monday, May 09, 2016 1 Comment
Dalam grafika komputer tidak pernah lepas dari geometri. Yang meliputi pemodelan garis-garis. Dengan garis maka dapat terbentuk sebuah objek geometri.

Di Java 2D tersedia interface stroke untuk menampilkan garis-garis. Implementasi interface diantaranya menggunakan BasicStroke. Kelas BasicStroke menyediakan pengaturan untuk bentuk garis, lebar, gabungan antar garis dan garis putus-putus.

Berikut adalah contoh implementasi BasicStroke.

strokePanel.java
/**
 *
 * @author Wim Sonevel
 */
import java.awt.*;
import javax.swing.JPanel;
public class strokePanel extends JPanel{

    public strokePanel(){
        setPreferredSize(new Dimension(500, 400));
        setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D)g;
        //menggambar sebuah garis dengan ketebalan 3 pixel
        BasicStroke bsGarisTebal=new BasicStroke(3.0f);
        g2.setStroke(bsGarisTebal);
        g2.drawLine(30, 50, 30, 250);

        //array untuk mendeskripsikan garis putus - putus
        float[]dashPattern;

        //offset dimana garis putus-putus harus dimulai
        float dashPhase=0.0f;

        //pola garis putus-putus
        dashPattern=new float[10];
        dashPattern[0]=4.0f;
        dashPattern[1]=5.0f;
        dashPattern[2]=8.0f;
        dashPattern[3]=5.0f;
        dashPattern[4]=12.0f;
        dashPattern[5]=5.0f;
        dashPattern[6]=16.0f;
        dashPattern[7]=5.0f;
        dashPattern[8]=20.0f;
        dashPattern[9]=5.0f;

        //pendefinisian dari Basic Stroke yang akan digunakan
        BasicStroke bsBerpola=new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 2.0f, dashPattern, dashPhase);
        g2.setStroke(bsBerpola);

        //menggambar sebuah garis dengan pola putus-putus
        g2.drawLine(60, 50, 60, 250);

        //sebuah pola putus-putus yang sederhana dengan panjang garis(dash) 20
        //dan lebar jarak 10
        dashPattern=new float[2];
        dashPattern[0]=20;
        dashPattern[1]=10;
        //pendefinisian BasicStroke yang akan digunakan
        BasicStroke bsDashed=new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 2.0f, dashPattern, dashPhase);
        g2.setStroke(bsDashed);

        //menggambar sebuah garis (vertikal) dengan pola yang telah
        //didefinisikan sebelumnya
        g2.drawLine(120, 50, 120, 250);

        //menggambar sebuah garis (diagonal) dengan pola yang
        //telah didefinisikan sebelumnya
        g2.drawLine(150, 50, 350, 250);

        //menggunakan pola garis putus-putus yang sama seperti sebelumnya
        //tetapi dengan offset 10
        dashPhase=10.0f;
        //pendefinisian BasicStroke yang akan digunakan
        BasicStroke bsDashedShifted=new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 2.0f, dashPattern, dashPhase);
        //menggambar sebuah garis (vertikal) dengan pola putus-putus yang telah
        //didefinisikan sebelumnya
        g2.setStroke(bsDashedShifted);
        g2.drawLine(90, 50, 90, 250);
    }
} 


Kemudian kelas panel diatas dipanggil di kelas TesStroke.java
/**
 *
 * @author Wim Sonevel
 */
import javax.swing.*;
public class TesStroke extends JApplet{

    @Override
    public void init(){
        JPanel panel=new strokePanel();
        getContentPane().add(panel);
    }

    public static void main(String[]args){
        JFrame frame=new JFrame();
        frame.setTitle("Garis");
        frame.setVisible(true);
        //frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JApplet applet=new TesStroke();
        applet.init();
        frame.getContentPane().add(applet);
        frame.pack();

    }
}


Outputnya :

Konsep OOP Interface

Friday, March 11, 2016 1 Comment

Interface adalah sekumpulan method yang dideklarasikan tanpa implementasi. Hampir sama dengan abstract class Cuma bedanya method yang dideklarasikan di Interface dapat digunakan oleh satu atau lebih kelas. Interface digunakan untuk mengatasi kemiripan-kemiripan pada kelas yang tidak berhubungan.

Ciri-ciri interface :
- Interface diawali dengan kata kunci interface, bukan class.
- Interface tidak mengandung constructor.
- Semua method berakses public secara otomatis.
- Menggunakan kata kunci implements untuk mengimplementasikan interface.
- Interface dapat diimplementasikan lebih dari satu interface pada kelas yang sama.

Selanjutnya kita akan coba membuat interface.

Buat interface dengan nama kontrorTV.
/**
 *
 * @author Wim Sonevel
 */
public interface kontrolTV {
    public void hidupkan(boolean hidup);
    public void pindahChannel(int channel);
    public int keraskanVolume(int tambah);
    public int pelankanVolume(int kurangi);
}

Buat kelas dengan nama televisi lalu implement interface kontrolTV
/**
 *
 * @author Wim Sonevel
 */
public class televisi implements kontrolTV{

    private String merek;
    private boolean hidup;
    private String[]saluran={"RCTI","SCTV","INDOSIAR","TPI","ANTV","TRANSTV","TRANS7"};

    public int volume=0;

    public televisi(){}
    public televisi(String merek){
        this.merek = merek;
    }
    public String getMerek(){
        return merek;
    }
    public void hidupkan(boolean hidup) {
        if(hidup){
            this.hidup = true;
            System.out.println("Televisi dihidupkan");
        }else{
            this.hidup = false;
            System.out.println("Televisi dimatikan");
        }
    }

    public void pindahChannel(int channel) {
        if(true){
            System.out.println("Saluran TV "+saluran[channel]);
        }else{
            System.out.println("Televisi Mati");
        }
    }

    public int keraskanVolume(int tambah) {
        if(hidup){
            if(volume < 10)
                volume += tambah;
                System.out.println("Volume ditambahkan menjadi "+volume);
            return volume;
        }else{
            System.out.println("Televisi Mati");
            return volume;
        }
    }

    public int pelankanVolume(int kurangi) {
        if(hidup){
            if(volume > 0)
                volume -= kurangi;
                System.out.println("Volume dikurangi menjadi "+volume);
            return volume;
        }else{
            System.out.println("Televisi Mati");
            return volume;
        }
    }

    public String [] getSaluran(){
        return saluran;
    }
}

Buat kelas main untuk menginstansiasi kelas televisi.
/**
 *
 * @author Wim Sonevel
 */
public class tesTV {
    public static void main(String[] args) {
        kontrolTV tvku = new televisi("SHARP");
        tvku.hidupkan(true);
        tvku.keraskanVolume(10);
        tvku.pelankanVolume(3);
        tvku.pindahChannel(5);
        tvku.hidupkan(false);
    }
}

Jika dijalankan maka hasilnya sebagai berikut :

Televisi dihidupkan
Volume ditambahkan menjadi 10
Volume dikurangi menjadi 7
Saluran TV TRANSTV
Televisi dimatikan

Sekian dan Terima Kasih
Happy Coding :)

Konsep OOP Abstract Class

Friday, March 11, 2016 4 Comments
Konsep OOP Abstract Class

Abstract Class adalah kelas yang tidak dapat diinstansiasi. Method dalam kelas abstract tidak berisi kode implementasi program namun hanya dideklarasikan saja. Nantinya, method-method tersebut di override oleh sub-class nya.
 Contohnya :

public abstract void iniMethod();

Deklarasi method ini disebut dengan prototype method.
Java memiliki aturan-aturan dalam penggunaan method abstract dan abstract class sebagai berikut :
- Class yang di dalamnya terdapat abstract method harus dideklarasikan sebagai abstract class.
- Abstract class tidak dapat diinstansi, tetapi harus di turunkan
- Abstract class tidak dapat diinstansi (menjadi objek dari class abstract), tetapi kita dapat mendeklarasikan suatu variable yang bertipe abstract class dan membuat instansi dari variabel tersebut yang bertipe class turunan dari abstract class tersebut (teknik polymorphism).
- Sebuah class dapat dideklarasikan sebagai abstract class meskipun class tersebut tidak memiliki abstract method.
- Abstract method tidak boleh mempunyai body method dan demikian juga sebaliknya bahwa method yang tidak ditulis body methodnya maka harus dideklarasikan sebagai abstract method.

Jadi, fungsi abstract class tak lain adalah untuk membuat prototype bagi class di tingkatan paling atas dalam hierarki class dan subclass-nya yang menyediakan detail implementasi dari abstract class tersebut.
Sekarang kita akan coba mengimplementasikan konsep abstract class. Misalkan kita punya soal sebagai berikut :

CV. Maju Mundur memiliki 40 orang pegawai, dimana ke-40 pegawainya tersebut terbagi menjadi 2 status kepegawaian, yaitu sebagian pegawai tetap dan sebagian yang lain (sisanya) adalah pegawai kontrak. Secara umum perbedaan antara keduanya adalah pegawai tetap selain mendapatkan gaji juga mendapatkan tunjangan yang besarnya 200 ribu, sedangkan pegawai kontrak hanya mendapatkan gaji saja. Dari kasus diatas, dapat digambarkan class-class pegawai sebagai berikut :

- Class PegawaiKontrak, dengan atribut :
NoPeg : no pegawai kontrak (diinputkan)
Nama : nama pegawai (diinputkan)
MasaKontrak : lama kontrak pegawai (diinputkan)
Kehadiran : jumlah hari masuk dalam 1 bulan (diinputkan)
UangMakan : besarnya 6 ribu dikali jumlah kehadiran(tidak diinputkan)
Gaji : besarnya gaji pokok yang diterima tiap bulan(diinputkan)

- Class PegawaiTetap, dengan atribut :
NoPeg : no pegawai kontrak (diinputkan)
Nama : nama pegawai (diinputkan)
Kehadiran : jumlah hari masuk dalam 1 bulan (diinputkan)
Tunjangan : besarnya 200 ribu (tidak diinputkan)
UangMakan : besarnya 6 ribu dikali jumlah kehadiran(tidak diinputkan)
Gaji : besarnya gaji pokok yang diterima tiap bulan(diinputkan)

Method-method yang harus ada :
- hitungGaji() : untuk menghitung gaji bersih pegawai, dimana untuk pegawai kontrak = Uang Makan + Gaji, pegawai tetap = Tunjangan + Uang Makan + Gaji
- lihatData() : untuk menampilkan data-data pegawai secara lengkap beserta total gaji yang diterima (gaji bersih)

Dari kedua class diatas, analisa dan desainlah superclass yang tepat untuk kasus tersebut. Setelah itu buatlah class utama yaitu class PegawaiMajuMundur (yang menggunakan class-class diatas). Tentukan pula modifier yang tepat untuk semua class diatas (termasuk superclass-nya, mana yg final class dan mana yang abstract class).

Pertama, buat abstract class dengan nama Pegawai.java. Di dalam kelas ini terdapat dua method abstract yaitu hitung gaji dan lihat data.

/**
 *
 * @author Wim Sonevel
 */
public abstract class Pegawai {
    abstract void hitungGaji();
    abstract void lihatData();
}

Buat kelas PegawaiKontrak.java lalu extends dari kelas Pegawai. Override dua method dari kelas Pegawai.
/**
 *
 * @author Wim Sonevel
 */
public class PegawaiKontrak extends Pegawai{
    int noPeg, kehadiran, gaji;
    String nama, masaKontrak;

    public PegawaiKontrak(int noPeg, String nama, String masaKontrak, int kehadiran, int gaji){
        this.noPeg = noPeg;
        this.nama = nama;
        this.masaKontrak = masaKontrak;
        this.kehadiran = kehadiran;
        this.gaji = gaji;
    }

    public int getUangMakan(){
        return 6000 * kehadiran;
    }
    //setter
    public void setNoPeg(int noPeg){
        this.noPeg = noPeg;
    }
    public void setNama(String nama){
        this.nama = nama;
    }
    public void setMasaKontrak(String masaKontrak){
        this.masaKontrak = masaKontrak;
    }
    public void setKehadiran(int kehadiran){
        this.kehadiran = kehadiran;
    }
    public void setGaji(int gaji){
        this.gaji = gaji;
    }

    public void lihatData(){
        System.out.println("No. Pegawai : "+noPeg);
        System.out.println("Nama Pegawai : "+nama);
        System.out.println("Masa Kontrak : "+masaKontrak);
        System.out.println("Kehadiran : "+kehadiran);
        System.out.println("Uang Makan : "+getUangMakan());
        System.out.println("Gaji : "+gaji);
    }
    public void hitungGaji(){
        int gajiBersih = getUangMakan() + gaji;
        System.out.println("Gaji Bersih : "+gajiBersih);
    }
}

Buat kelas PegawaTetap.java lalu extends kelas Pegawai. Sama halnya dengan kelas PegawaiKontrak.java
/**
 *
 * @author Wim Sonevel
 */
public class PegawaiTetap extends Pegawai{
    int noPeg, kehadiran, gaji;
    String nama;
    public final int tunjangan = 200000;

    public PegawaiTetap(int noPeg, String nama, int kehadiran, int gaji){
        this.noPeg = noPeg;
        this.nama = nama;
        this.kehadiran = kehadiran;
        this.gaji = gaji;
    }

    public int getUangMakan(){
        return 6000 * kehadiran;
    }
    //setter
    public void setNoPeg(int noPeg){
        this.noPeg = noPeg;
    }
    public void setNama(String nama){
        this.nama = nama;
    }
    public void setKehadiran(int kehadiran){
        this.kehadiran = kehadiran;
    }
    public void setGaji(int gaji){
        this.gaji = gaji;
    }

    public void lihatData(){
        System.out.println("No. Pegawai : "+noPeg);
        System.out.println("Nama Pegawai : "+nama);
        System.out.println("Kehadiran : "+kehadiran);
        System.out.println("Uang Makan : "+getUangMakan());
        System.out.println("Tunjangan : "+tunjangan);
        System.out.println("Gaji : "+gaji);
    }
    public void hitungGaji(){
        int gajiBersih = getUangMakan() + gaji;
        System.out.println("Gaji Bersih : "+gajiBersih);
    }
}

Kemudian kita akan menginstasiasi kelas PegawaiKontrak dan PegawaiTetap di KelasUtama.java
/**
 *
 * @author Wim Sonevel
 */
import java.io.*;
public class KelasUtama {
    public static void main(String[] args){
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        Pegawai pg;
        PegawaiKontrak pk = new PegawaiKontrak(0, "", "", 0, 0);
        PegawaiTetap pt = new PegawaiTetap(0, "", 0, 0);
        
        while(true){
            System.out.println("MENU UTAMA");
            System.out.println("=====================");
            System.out.println("1. Input Data Pegawai");
            System.out.println("2. Lihat Data Pegawai");
            System.out.println("3. Keluar");

            int pilih1 = 0;
            int pilih2 = 0;
            try{
                System.out.print("Masukkan pilihan [1]/[2]/[3] : ");
                pilih1 = Integer.parseInt(br.readLine());

                if(pilih1==1){
                    System.out.println("1. Pegawai Kontrak");
                    System.out.println("2. Pegawai Tetap");
                    System.out.print("Masukkan pilihan [1]/[2] : ");
                    pilih2 = Integer.parseInt(br.readLine());

                    if(pilih2==1){
                        System.out.print("Input no. pegawai kontrak : ");
                        int no = Integer.parseInt(br.readLine());
                        System.out.print("Input nama pegawai kontrak : ");
                        String nama = br.readLine();
                        System.out.print("Input masa kontrak : ");
                        String masa = br.readLine();
                        System.out.print("Input kehadiran : ");
                        int hadir = Integer.parseInt(br.readLine());
                        System.out.print("Input gaji : ");
                        int gaji = Integer.parseInt(br.readLine());
                        
                        pk = new PegawaiKontrak(no, nama, masa, hadir, gaji);
                        System.out.println("=====DATA TERSIMPAN=====\n");
                    }
                    System.out.print("Masukkan pilihan [1]/[2] : ");
                    pilih2 = Integer.parseInt(br.readLine());

                    if(pilih2==2){
                        System.out.print("Input no. pegawai tetap : ");
                        int no = Integer.parseInt(br.readLine());
                        System.out.print("Input nama pegawai tetap : ");
                        String nama = br.readLine();
                        System.out.print("Input kehadiran : ");
                        int hadir = Integer.parseInt(br.readLine());
                        System.out.print("Input gaji : ");
                        int gaji = Integer.parseInt(br.readLine());
                        
                        pt = new PegawaiTetap(no, nama, hadir, gaji);
                        System.out.println("=====DATA TERSIMPAN=====\n");
                    }
                }else if(pilih1==2){
                    System.out.println("===DATA PEGAWAI KONTRAK===");
                    pg = pk;
                    pg.lihatData();
                    pg.hitungGaji();
                    System.out.println("===DATA PEGAWAI TETAP===");
                    pg = pt;
                    pg.lihatData();
                    pg.hitungGaji();
                }else{
                    System.exit(0);
                }
            }catch(IOException e){
                System.out.println(e);
            }
        }
    }
}

Jika di jalankan maka outputnya sebagai berikut :
MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar Masukkan pilihan [1]/[2]/[3] : 1
1. Pegawai Kontrak
2. Pegawai Tetap Masukkan pilihan [1]/[2] : 1
Input no. pegawai kontrak : 12345
Input nama pegawai kontrak : Wim
Input masa kontrak : 5
Input kehadiran : 20
Input gaji : 3000000
 =====DATA TERSIMPAN=====

Masukkan pilihan [1]/[2] : 2
Input no. pegawai tetap : 54321
Input nama pegawai tetap : Sonevel
Input kehadiran : 20
Input gaji : 4000000
=====DATA TERSIMPAN=====

MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar Masukkan pilihan [1]/[2]/[3] : 2

===DATA PEGAWAI KONTRAK===
 No. Pegawai : 12345
Nama Pegawai : Wim
Masa Kontrak : 5
Kehadiran : 20
Uang Makan : 120000
Gaji : 3000000
Gaji Bersih : 3120000

===DATA PEGAWAI TETAP===
No. Pegawai : 54321
Nama Pegawai : Sonevel
Kehadiran : 20
Uang Makan : 120000
Tunjangan : 200000
Gaji : 4000000
Gaji Bersih : 4120000

MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar Masukkan pilihan [1]/[2]/[3] :

Sekian dan Terima Kasih
Happy Coding :)