/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.Td0bc7kJGLx/rev.1650
*
* authors:
* Ari Prasetyo
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/* @pjs preload="/static/uploaded_resources/p.583/star.png"; */
/* @pjs preload="/static/uploaded_resources/p.583/1298116681_twitter42.png"; */
// Gambar bintang untuk penanda jam.
// Diambil dari Silk Icons Set http://www.famfamfam.com/lab/icons/silk/
PImage tanda = loadImage("/static/uploaded_resources/p.583/star.png");
// Gambar burung untuk hiasan
// Diambil dari http://www.iconshock.com/twitter-icons/
PImage burung = loadImage("/static/uploaded_resources/p.583/1298116681_twitter42.png");
/**
* Setup awal
*/
void setup() {
size(300, 300);
colorMode(HSB, TWO_PI, 1.0, 1.0, 1.0);
frameRate(12);
smooth();
imageMode(CENTER);
}
/**
* Menggambar frame
*/
void draw() {
hapus();
jam(150, 150);
}
/**
* Menghapus seluruhnya
*/
void hapus() {
fill(3.4, 0.4, 1.0);
noStroke();
rect(0, 0, width, height);
}
/**
* Menggambar seluruh jam
*/
void jam(float x, float y) {
latar(x, y);
penandaMenit(x, y);
penandaJam(x, y);
jarumJam(x, y);
jarumMenit(x, y);
jarumDetik(x, y);
}
/**
* Menggambar jarum detik
*/
void jarumDetik(float x, float y) {
// Mendapatkan detik sekarang
float detik = second();
// Simpan dulu matriks transformasinya
pushMatrix();
// Memindahkan koordinat (0, 0) ke (x, y)
translate(x, y);
// Memutar koordinat sesuai dengan detik saat ini
// Karena satu lingkaran penuh = 2PI,
// dan satu lingkaran penuh = 60 detik,
// maka harus dikonversikan dulu sudutnya
// yaitu sudut = detik * 2PI / 60
rotate(detik * TWO_PI / 60);
// Gambar garisnya.
// Mengapa harus dari (0, 0) ke (0, -100)?
// Pertama, pusat jam sudah dipindah ke (x, y),
// sehingga menggambar jarum cukup dari (0, 0) saja.
// Kemudian, karena pada detik ke 0 jarum harus menunjuk
// ke atas, berarti dari (0, 0) dibuat garis sepanjang 100
// ke atas (100 boleh diganti), yang dalam sistem koordinat
// layar, berarti ujungnya ada di (0, -100). Tidak perlu
// pusing dengan perputaran, karena sudah di-rotate sebelumnya.
stroke(3.4, 0.6, 0.8);
strokeWeight(1);
line(0, 0, 0, -100);
// Kembalikan matriks transformasinya
popMatrix();
}
/**
* Menggambar jarum menit
*/
void jarumMenit(float x, float y) {
// Mendapatkan menit sekarang
// Agar bergerak lebih mulus, sertakan detik sebagai pecahan
float menit = minute() + (float) second() / 60;
// Simpan dulu matriks transformasinya
pushMatrix();
// Memindahkan koordinat (0, 0) ke (x, y)
translate(x, y);
// Memutar koordinat sesuai dengan detik saat ini
// Karena satu lingkaran penuh = 2PI,
// dan satu lingkaran penuh = 60 menit,
// maka harus dikonversikan dulu sudutnya
// yaitu sudut = menit * 2PI / 60
rotate(menit * TWO_PI / 60);
// Gambar garisnya.
// Penjelasan ada di fungsi jarumDetik()
stroke(3.4, 0.6, 0.8);
strokeWeight(3);
line(0, 0, 0, -100);
// Kembalikan matriks transformasinya
popMatrix();
}
/**
* Menggambar jarum jam
*/
void jarumJam(float x, float y) {
// Mendapatkan jam sekarang
// Agar jam bergerak lebih mulus, sertakan menit dan detik sebagai pecahan
float jam = hour() + (float) minute() / 60 + (float) second() / 3600;
// Simpan dulu matriks transformasinya
pushMatrix();
// Memindahkan koordinat (0, 0) ke (x, y)
translate(x, y);
// Memutar koordinat sesuai dengan detik saat ini
// Karena satu lingkaran penuh = 2PI,
// dan satu lingkaran penuh = 12 jam,
// maka harus dikonversikan dulu sudutnya
// yaitu sudut = jam * 2PI / 12
rotate(jam * TWO_PI / 12);
// Gambar garisnya.
// Penjelasan ada di fungsi jarumDetik()
// Panjangnya 50 saja
stroke(3.4, 0.6, 0.8);
strokeWeight(6);
line(0, 0, 0, -50);
// Kembalikan matriks transformasinya
popMatrix();
}
/**
* Menggambar penanda menit
*/
void penandaMenit(float x, float y) {
// Simpan dulu matriks transformasinya
pushMatrix();
translate(x, y);
stroke(3.4, 1.0, 0.7);
strokeWeight(1);
// Ulangi sebanyak 60 kali, karena dalam 1 lingkaran,
// terdapat 60 penanda menit
for (int i = 0; i < 60; i++) {
// setiap kali perulangan, rotasikan 2PI/60
rotate(TWO_PI / 60);
line(0, -105, 0, -108);
}
// Kembalikan matriks transformasinya
popMatrix();
}
/**
* Menggambar penanda jam
*/
void penandaJam(float x, float y) {
// Simpan dulu matriks transformasinya
pushMatrix();
translate(x, y);
noStroke();
// Ulangi sebanyak 12 kali, karena dalam 1 lingkaran,
// terdapat 12 penanda jam
for (int i = 0; i < 60; i++) {
// setiap kali perulangan, rotasikan 2PI/12
rotate(TWO_PI / 12);
pushMatrix();
translate(0, -108);
rotate(0.001 * millis());
image(tanda, 0, 0, 10, 10);
popMatrix();
}
// Kembalikan matriks transformasinya
popMatrix();
}
/**
* Membuat latar
*/
void latar(float x, float y) {
fill(3.4, 0.4, 0.5, 0.5);
ellipse(x, y, 330, 330);
fill(3.4, 0.1, 1.0);
ellipse(x, y, 240, 240);
fill(3.4, 0.3, 1.0);
ellipse(x, y, 130, 130);
pushMatrix();
translate(110, 190);
rotate(0.4 * sin(0.005 * millis()));
image(burung, 0, 0, 64, 64);
popMatrix();
}