Pertemuan 03:
Grafika Komputer:
Windows dan Viewport
Dr. Suyoto
Prodi Teknik Informatika Fakultas Teknologi Industri
Agenda
• Windows, Viewports dan Pemotongan • Grafik Kura-kura
• Poligon Teratur
• Lingkaran dan Busur • Kurva Parametrik
Fungsi yang Berguna
//--- setWindow
---void setWindow(GLdouble left, Gldouble right, GLdouble bottom, GLdouble top)
{
glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluOrtho2D(left, right, bottom, top); }
//--- setViewport
---void setViewport(GLdouble left, Gldouble right, GLdouble bottom, GLdouble top)
{
float x, xmin = 0, xmax=1024;
glColor3f(0,0,1); //warna garis biru glPushMatrix();
glTranslated (0, 300, 0); glBegin(GL_POINTS);
glVertex2d(0, 0);
for(x = xmin; x < xmax; x+=0.005 ) {
//glVertex2d(x, 200*pow(2.71, -x/300)*cos(4*3.14*x/360)); glVertex2d(x, 200*cos(2*2*3.14*x/360));
Windows dan Viewports
• Contoh: Zooming In
Setting Window
• Jika kita set ukuran window, dan kita ingin objek pemandangan yang akan kita
tangkap.
• Objeknya terlalu besarkah atau terlalu kecil. • Jika terlalu kecil maka objek akan
Setting Window
• Untuk set window ke ukuran yang tepat, kita perlukan ukuran koordinat yang kita tangkap.
Setting Window
• Program membutuhkan melalukan data dua kali::
1. Eksekusi rutin penggambaran, tetapi tidak melakukan penggambaran.
Set Viewport
• Untuk menggambar dengan tampilan di viewport tidak terdistorsi, kita perlukan untuk memastikan bahwa baik window maupun viewport
Set Viewport
• Jika aspect ratio segiempat kurang dari 0, maka segiempat lebih tinggi dibandingkan lebarnya. • Contoh. W/H = 3/5
Set Viewport
a) R > W/H (dengan R aspect ratio dari jendela dunia)
• Jika jendela dunia ‘flatter’ daripada jendela layar, maka ada ruang yang tidak digunakan di atas dan atau dibawah.
Set Viewport
b) R < W/H (dengan R aspect ratio dari jendela dunia)
• Jika jendela dunia ‘lebih tinggi’ daripada jendela layar maka akan ada ruang yang tidak terpakai.
Pengubahan Ukuran Viewport
• Dalam lingkungan windows environment,
pengguna perlu mengubah ukuran dengan suka-suka.
• Jika ini terjadi, maka kita perlu memastikan
Pengubahan Ukuran Viewport
• OpenGL menyediakan fungsi resize untuk mengubah ukuran window. Ini dapat
dihubungkan dengan fungsi pengubahan ukuran yang anda buat sendiri.
Pengubahan Ukuran Viewport
void myReshape(GLsizei W, GLsizei H) {
if(R > W/H) //use global window aspect ratio setViewport(0, W, 0, W/R);
else
Agenda
• Windows, Viewports dan Pemotongan
Windows dan Viewports
• Sebelumnya kita melihat bahwa pada window OpenGL dengan x dan y digambar sebagai nilai piksel positif.
• Oleh karena itu, kita tidak tertarik untuk mempertahannya.
• Kita lebih baik menggunakan koordinat dengan bebas sesuai dengan kondisi nyata.
Windows dan Viewports
Layar
Windows dan Viewports
Dunia (apa yang kita lihat senyatanya)
Jendela Layar Jendela dunia (bagian kecil yang kita inginkan)
Windows dan Viewports
• Jendela dunia adalah segiempat • Viewport adalah segiempat.
• Keduanya tidak perlu mempunyai ukuran dan aspect ratio yang sama.
Windows dan Viewports
Jendela dunia
Windows dan Viewports
Jendela dunia Viewport
(0,0) (100,0) (0,0) (100,0) Ini disebut
Windows dan Viewports
• x’ = Ax + B dan y’ = Cy + D
Windows dan Viewports
• Pemetaan melibatkan skala dan translasi. • Baik jendela dunia dan viewport dapat
sembarang segiempat.
Windows dan Viewports
W.t = Window atas W.l = Window kiri W.b = Window bawah W.r = Window kanan
Windows dan Viewports
xmin, ymin, xmax, ymax = W.l, W.b, W.r, W.t SCREENWIDTH = V.r – V.l
Windows dan Viewports
dsx dx
• Pemetaan dibuat secara proporsional
• Jarak sebuah titik sepanjang sumbu x di jendela dunia
proporsional dengan titik yang dibambar di sepanjang sumbu x di Viewport.
• Berapa jauhkah x dari W.l? •dx = x – W.l
•Sebagai proporsi keseluruhan panjang:
Windows dan Viewports
l
W
r
W
l
W
x
l
V
r
V
l
V
sx
.
.
.
.
.
.
• Jadi:• Atau disusun kembali menjadi:
W l
Windows dan Viewports
b
W
t
W
b
W
x
b
V
t
V
b
V
sy
.
.
.
.
.
.
• Dengan cara yang sama untuk y:
• Atau disusun kembali menjadi:
W b
Windows dan Viewports
Contoh
Berapakah A, B, C & D ??
World Window Viewport Jendela dunia Viewport
(10,6)
(-10,-6)
400
0
Windows dan Viewports
Contoh
Jendela dunia Viewport
(10,6)
(-10,-6)
400
0
600
A = 600/20 = 30
B = 400/12 = 33.3333 C = 0 – 30 * -10 = 300
D = 0 – 33.3333 * -6 = 200
Jika benar, (-10,-6) harus dipetakan ke (0,0) dan (10,6) -> (600,400)
sx = A * -10 + C = 0 sy = B * -6 + D = 0 sx = A * 10 + C = 600 xy = B * 6 + D = 400
Windows dan Viewports
Windows dan Viewports
• Tidak
• OpenGL melakukannya untuk kita
Windows dan Viewports
• Setiap kali kita memanggil OpenGL untuk
melukis titik (Contoh:
glVertex2f()
etc..)
koordinat titik dilalakan melalui set
Windows dan Viewports
• Pertama-tam kita set koordinat jendela dunia
dengan:
void glOrtho2D(GLDouble left, GLDouble right, GLDouble bottom, GLDouble top);
• Kemudian set viewport dengan:
Windows dan Viewports
void myInit(void) {
glClearColor(1.0,1.0,1.0,0.0); glColor3f(0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
//set Pandangan Koordinat
gluOrtho2D(-10.0, 10.0, -6.0, 6.0); glViewport(0,0,600,400);
Windows dan Viewports
glPointSize(10.0);
glBegin(GL_POINTS);
glVertex2i(-10,-6);
glVertex2i(0,0);
glVertex2i(10,6);
glEnd();
*Catatan: titik yang diberikan dalam
Penggambaran Relatif
• Penggambaran Relatif merujuk pada
pergerakan titik gambar pada kanvas relatif ke lokasi penggambaran.
• Pikirkanlah ini seprti pergerakan pena pada kertas.
Grafik Kura-kura
• Gambarlah garis dan titik pada layar sehingga menyerupai kura-kura.
• Gunakan:
– garisKe(float x, float y)
Grafik Kura-kura
Contoh: Polispiral
for( int i=0; i<200; i++ ) {
terusLurus(panjang, 1); putarKe(sudut*i);
G
ra
fi
k
K
ur
a-ku
ra
G
ra
fi
k
K
ur
a-ku
ra
G
ra
fi
k
K
ur
a-ku
ra
Poligon Teratur
Poligon Teratur
• Untuk menggambar poligon teratur
dibutuhkan titik pusat, jejari dan sudut rotasi.
R
cos(
2
i
/
n
),
R
sin(
2
i
/
n
)
Poligon Teratur
void ngon(int n, float cx, float cy, float radius, float rotAngle)
{
if(n < 3) return; //bad number of sides
double angle = rotAngle * 3.14159265 / 180; //initial angle
double angleInc = 2 * 3.14159265 /n; //angle increment
cvs. moveTo(radius * cos(angle) + cx, radius * sin(angle) + cy);
for(int k = 0; k < n; k++) // repeat n times {
angle += angleInc;
cvs.lineTo(radius*cos(angle) + cx, radius*sin(angle) + cy);
P
ol
ig
on
T
er
at
ur
Lingkaran dan Busur
• Lingkaran dapat dibuat dengan
poligon teratur tetapi dengan sejumlah
besar titik.
void drawCircle(Point2 center, float radius) {
const int numVerts = 50;
L
in
gk
ar
Lingkaran dan Busur
• Untuk melukis busur atau lingkaran
dibutuhkan titik pusat, sudut awal (a) dan
Lingkaran dan Busur
Kode ini mirip dengan ngon( ) sehingga busar dapat digambar, yang berarti kita tidak menggambar 360 derajad.
drawArc(Point2 center, float radius, float startAngle, float sweep) { // startAngle dan sweep dalam derajad
const int n = 30; // jumlah segmen
float angle = startAngle * 3.14159265 / 180; // inisialisasi sudut dalam radian
float angleInc = sweep * 3.14159265 /(180 * n); // penaikan sudut float cx = center.getX(), cy = center.getY();
pindahKe(cx + radius * cos(angle), cy + radius * sin(angle)); for(int k = 1; k < n; k++, angle += angleInc)
B
us
Latihan: Lingkaran dan Busur
Putar: airmata
Kurva Parametrik
Sebuah kurva dapat dinyatakan:
1. Secara implisit
F(x,y) = 0;
F(x,y) = (y – Ay)(Bx-Ax) – (x-Ax)(By-Ay)
F(x,y) = 0 untuk semua titik pada kurva.
F(x,y) > 0 untuk semua titik di luar kurva.
Kurva Parametrik
• F(x,y) = x2 + y2 - R2
Kurva Parametrik
• F(x,y) = x2 + y2 - R2
Kurva Parametrik
• F(x,y) = x2 + y2 - R2
• F(x,y) = 0
Kurva Parametrik
• Masalah perwakilan secara implisit
– Mungkin banyak nilai x dan y.
– Beberapa fungsi mungkin hanya bergantung pada nilai x saja.
– Beberapa fungsi mungkin hanya bergantung pada nilai y saja
x
R
y
2 2
Kurva Parametrik
Kurva Parametrik
Kurva dapat digambarkan:
2. Secara Parametrik
• Titik berbeda pada sebuah kurva dihasilkan untuk semuah parameter.
Kurva Parametrik
Kurva Parametrik
Kurva Parametrik
Kurva Parametrik
Kurva Parametrik
Kurva Parametrik
Kurva Parametrik
Kurva Parametrik
• Lintasan pergerakan partikel sepanjang kurva ditetapkan oleh dua fungsi, x() and y().
Kurva Parametrik
Contoh:
Sebuah garis lurus dari A ke B pada t=0 partikel di A dan pada t=1 partikel ada di B.
A
B t=1
Kurva Parametrik
Jadi:
x(t) = Ax + (Bx – Ax)t
y(t) = Ay + (By – Ay(t)
Titik bergerak melalui semua titik pada garis A dan B pada t dari 0 ke 1.
A
B t=1
Kurva Parametrik
Contoh: Elips
H * sin(t)
Kurva Parametrik
//plot ellipse
GLdouble width = 500.0; GLdouble height = 200.0;
GLdouble TWOPI = 2 * 3.14159265;
float interval = 2500.0; glPushMatrix();
glTranslated (512, 300, 0); glBegin(GL_POINTS);
glColor3f(0,0,1); //warna poligon biru
for(GLdouble t = 0; t <= TWOPI; t += TWOPI/interval ) {
glVertex2d(width * cos(t), height * sin(t)); }
glEnd();
K
ur
va
P
ar
am
et
ri
Koordinat Polar
• Masing-masing titik pada kurva diwakili oleh jarak radial (r) dan sudut (θ).
r dan θ merupakan fungsi t
yang dinyatakan dengan (r(t), θ(t)) • x(t) = r(t)cos(θ(t))
Koordinat Polar
• Untuk masing-masing titik x dan y dapat disederhanakan:
K
oo
rd
in
at
P
ol
ar
Contoh: Kurva bunga mawar
glBegin(GL_POINTS);
glColor3f(1,0,0); //warna poligon merah
drawPolar(center, 270, 10);
glColor3f(0,1,0); //warna poligon hijau
drawPolar(center, 260, 6);
glColor3f(0,0,1); //warna poligon biru