Bab 2 Dasar-Dasar Grafik 2D: 2.1 Menggambar Objek Geometris Sederhana
Bab 2 Dasar-Dasar Grafik 2D: 2.1 Menggambar Objek Geometris Sederhana
BAB 2
DASAR-DASAR GRAFIK 2D
2.1 MENGGAMBAR OBJEK GEOMETRIS SEDERHANA
Java 2D API menyediakan beberapa kelas yang mendefinisikan objek geometris umum seperti titik,
garis, kurva, dan persegipanjang. Kelas geometri ini adalah bagian dari paket java.awt.geom.
Tabel 2.1. Kelas Geometri
No Objek
Kelas
Line2D
Subkelas
Format
Contoh
Line2D.Double
Line2D.Float
g2.draw(new
g2.drawLine(10
Line2D.Double(x1 0,100,200,200)
, y1, x2, y2));
;
Rectangle2D.Dou
ble
Rectangle2D.Flo
at
g2.draw(new
Rectangle2D.Doub
le(x, y,
rectwidth,
rectheight));
g2.draw(new
Rectangle2D.Do
uble(50, 25,
100, 50));
Garis
Persegipanjang Rectangle2D
Ellips
Ellipse2D
Ellipse2D.Doubl g2.draw(new
e
Ellipse2D.Double
Ellipse2D.Float (x, y,
rectwidth,
rectheight));
g2.draw(new
Ellipse2D.Doub
le(200,50,100,
50));
Busur
Arc2D
Arc2D.Double
Arc2D.Float
g2.draw(new
Arc2D.Double(x,
y, rectwidth,
rectheight, 90,
135,
Arc2D.OPEN));
g2.draw(new
Arc2D.Double(2
00, 125, 100,
50, 90, 135,
Arc2D.OPEN));
Kurva kuadrat
QuadCurve2D
QuadCurve2D.Dou
ble
QuadCurve2D.Flo
at
g2.draw(new
QuadCurve2D.Doub
le(x1, y1,
ctrlx, ctrly,
x2, y2));
g2.draw(new
QuadCurve2D.Do
uble(100,250,1
75,175,300,250
));
Kurva kubik
CubicCurve2D CubicCurve2D.Do
uble
CubicCurve2D.Fl
oat
g2.draw(c.setCur
ve(x1, y1,
ctrlx1, ctrly1,
ctrlx2, ctrly2,
x2, y2));
g2.draw(new
CubicCurve2D.D
ouble(50,300,1
50,
200,200,400,30
0,300));
Catatan:
Kelas Arc2D mendefinisikan 3 (tiga) tipe busur, ditunjukkan dengan konstanta yang menyertai dalam
kelas ini: OPEN, PIE, dan CHORD.
2
Berikut adalah contoh penerapan kelas geometris dalam sebuah program Java.
Listing 2.1 KelasGeometri.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.font.*;
import java.awt.geom.*;
public class KelasGeometri extends JApplet {
public static void main(String s[]) {
JFrame frame = new JFrame();
frame.setTitle("Kelas Geometri");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new KelasGeometri();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new Panel2D();
getContentPane().add(panel);
}
}
class Panel2D extends JPanel{
public Panel2D() {
setPreferredSize(new Dimension(500, 400));
setBackground(Color.white);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
//gambar garis;
g2.drawLine(100,100,200,200);
//gambar persegipanjang
g2.draw(new Rectangle2D.Double(50, 25, 100, 50));
//gambar elips
g2.draw(new Ellipse2D.Double(200,50,100,50));
//gambar busur
g2.draw(new Arc2D.Double(200, 125, 100, 50, 90, 135, Arc2D.OPEN));
//gambar kurva kuadrat
3
g2.draw(new QuadCurve2D.Double(100,250,175,175,300,250));
//gambar kurva kubik
g2.draw(new CubicCurve2D.Double(50,300,150, 200,200,400,300,300));
}
}
Latihan:
Ketiklah kode program diatas. Kemudian compile dan jalankan. Apa yang dihasilkan oleh program
tersebut? Jelaskan!
Jawab:
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
4
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new AddArea();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new AreaPanel();
getContentPane().add(panel);
}
}
class AreaPanel extends JPanel {
public AreaPanel() {
setPreferredSize(new Dimension(760, 400));
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
//lingkaran pertama.
Shape s1 = new Ellipse2D.Double(0, 0, 100, 100);
//lingkaran kedua.
Shape s2 = new Ellipse2D.Double(60, 0, 100, 100);
//area geometri pertama.
Area a1 = new Area(s1);
//area geometri kedua.
Area a2 = new Area(s2);
//geser posisi kedua kedua lingkaran dengan x=20 y=50.
g2.translate(20, 50);
//penentuan ketebalan dan warna garis.
BasicStroke bsThickLine = new BasicStroke(5.0f);
g2.setStroke(bsThickLine);
g2.setPaint(Color.blue);
//gambar lingkaran pertama.
g2.draw(s1);
//gambar lingkaran kedua.
g2.draw(s2);
//operasi "add".
a2.add(a1);
//penentuan warna untuk mengisi hasil operasi "add".
g2.setPaint(Color.green);
5
//pewarnaan area hasil operasi "add".
g2.fill(a2);
}
}
Listing 2.3 IntersectArea.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
public class IntersectArea extends JApplet {
public static void main(String s[]) {
JFrame frame = new JFrame();
frame.setTitle("Geometri Bidang Konstruktif");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new IntersectArea();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new AreaPanel();
getContentPane().add(panel);
}
}
class AreaPanel extends JPanel {
public AreaPanel() {
setPreferredSize(new Dimension(760, 400));
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
//lingkaran pertama
Shape s1 = new Ellipse2D.Double(0, 0, 100, 100);
//lingkaran kedua
Shape s2 = new Ellipse2D.Double(60, 0, 100, 100);
//area geometri pertama
Area a2 = new Area(s2);
//pindah posisi kedua kedua lingkaran dengan x=20 y=50
g2.translate(20, 50);
6
//gambar lingkaran pertama
g2.draw(s1);
//gambar lingkaran kedua
g2.draw(s2);
//area geometri kedua
Area a1 = new Area(s1);
//operasi "intersect"
a1.intersect(a2);
//penentuan ketebalan dan warna garis
BasicStroke bsThickLine = new BasicStroke(5.0f);
g2.setStroke(bsThickLine);
g2.setPaint(Color.blue);
//gambar bidang hasil operasi "intersect"
g2.draw(a1);
//penentuan warna untuk mengisi bidang hasil operasi "intersect".
g2.setPaint(Color.green);
//pewarnaan bidang hasil operasi "intersect".
g2.fill(a1);
}
}
Listing 2.4 Subtract.Area.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
public class SubtractArea extends JApplet {
public static void main(String s[]) {
JFrame frame = new JFrame();
frame.setTitle("Geometri Bidang Konstruktif");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new SubtractArea();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new AreaPanel();
getContentPane().add(panel);
7
}
}
class AreaPanel extends JPanel {
public AreaPanel() {
setPreferredSize(new Dimension(760, 400));
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
//lingkaran pertama
Shape s1 = new Ellipse2D.Double(0, 0, 100, 100);
//lingkaran kedua
Shape s2 = new Ellipse2D.Double(60, 0, 100, 100);
//area geometri pertama
Area a2 = new Area(s2);
//pindah posisi kedua kedua lingkaran dengan x=20 y=50
g2.translate(20, 50);
//gambar lingkaran pertama
g2.draw(s1);
//gambar lingkaran kedua
g2.draw(s2);
//area geometri kedua
Area a1 = new Area(s1);
//operasi "subtract"
a1.subtract(a2);
//penentuan ketebalan dan warna garis
BasicStroke bsThickLine = new BasicStroke(5.0f);
g2.setStroke(bsThickLine);
g2.setPaint(Color.blue);
//gambar bidang hasil operasi "subtract"
g2.draw(a1);
//penentuan warna untuk mengisi bidang hasil operasi "subtract".
g2.setPaint(Color.green);
//pewarnaan bidang hasil operasi "subtract".
g2.fill(a1);
}
}
Listing 2.5 exclusiveOrArea.java
import java.awt.*;
import java.awt.event.*;
8
import javax.swing.*;
import java.awt.geom.*;
public class ExclusiveOrArea extends JApplet {
public static void main(String s[]) {
JFrame frame = new JFrame();
frame.setTitle("Geometri Bidang Konstruktif");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new ExclusiveOrArea();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new AreaPanel();
getContentPane().add(panel);
}
}
class AreaPanel extends JPanel {
public AreaPanel() {
setPreferredSize(new Dimension(760, 400));
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
//lingkaran pertama
Shape s1 = new Ellipse2D.Double(0, 0, 100, 100);
//lingkaran kedua
Shape s2 = new Ellipse2D.Double(60, 0, 100, 100);
//area geometri pertama
Area a2 = new Area(s2);
//pindah posisi kedua kedua lingkaran dengan x=20 y=50
g2.translate(20, 50);
//gambar lingkaran pertama
g2.draw(s1);
//gambar lingkaran kedua
g2.draw(s2);
//area geometri kedua
Area a1 = new Area(s1);
//operasi "exclusiveOr"
a1.exclusiveOr(a2);
9
//penentuan ketebalan dan warna garis
BasicStroke bsThickLine = new BasicStroke(5.0f);
g2.setStroke(bsThickLine);
g2.setPaint(Color.blue);
//gambar bidang hasil operasi "exclusiveOr"
g2.draw(a1);
//penentuan warna untuk mengisi bidang hasil operasi "exclusiveOr".
g2.setPaint(Color.green);
//pewarnaan bidang hasil operasi "exclusiveOr".
g2.fill(a1);
}
}
Latihan
Ketik masing-masing listing program tersebut di atas. Kemudian compile dan jalankan. Apa yang
dihasilkan oleh program tersebut? Jelaskan!
Jawab:
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
Catatan:
Supaya hanya menampilkan bidang hasil operasi add, intersect, subtract, dan, dan exclusiveOr, hilangkan
instruksi (baris program):
//gambar lingkaran pertama
g2.draw(s1);
//gambar lingkaran kedua
g2.draw(s2);
pada masing-masing listing program.
10
moveTo(float x, float y) Memindahkan titik path sekarang ke titik path yang diinginkan.
11
gp.moveTo(60,120);
//bagian bodi bawah-depan
gp.lineTo(80,120);
//roda depan
gp.quadTo(90,140,100,120);
//bagian bodi bawah-tengah
gp.lineTo(160,120);
//roda belakang
gp.quadTo(170,140,180,120);
//bagian bodi bawah-belakang
gp.lineTo(200,120);
//bagian belakang mobil
gp.curveTo(195,100,200,80,160,80);
//atap
gp.lineTo(110,80);
//kaca depan
gp.lineTo(90,100);
//bagian hidung mobil
gp.lineTo(60,100);
//bagian depan mobil
gp.lineTo(60,120);
//menggambar mobil
g2.draw(gp);
}
}
Latihan
Ketiklah kode program diatas. Kemudian compile dan jalankan. Menurut Anda gambar apa yang
dihasilkan oleh program tersebut? Jelaskan!
Jawab:
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
12
Tugas Projek
Tahap I
Buatlah program untuk menampilkan objek geometri yang terpilih. Lihat screenshot berikut:
Keterangan:
1. Tampilan di atas hanya merupakan contoh saja.
2. Dalam tahap 1 (pertama) ini program hanya dapat digunakan untuk menampilkan objek geometri
saja. Untuk menu atau fungsi yang lain dilanjutkan di tahap-tahap berikutnya.
Untuk membuat menu objek geometri yang akan ditampilkan bisa diganti menggunakan
comboBox.
Ditambah TextField yang digunakan untuk menentukan ukuran objek yang akan
13
ditampilkan.
Dan lain-lain.
4. Projek pertama (menampilkan objek) diharapkan dapat diselesaikan dalam satu minggu, supaya
tidak terbebani dengan tahapan projek berikutnya.
5. Program dinilai berdasarkan:
Originalitas