Looping
Yuk, kita buat 3 lingkaran yang bersampingan.
function draw() {
background(220);
circle(10, 100, 10);
circle(20, 100, 10);
circle(30, 100, 10);
}
Task 1 📝: Ten Circles
Sekarang buatlah 10 lingkaran yang bersampingan.
Repot kan ya :D, bagaimana kalau kita membuat 100 lingkaran? Tentu sangat repot.
for
loop
function draw() {
background(220);
for (let i = 1; i <= 10; i++) {
circle(i * 10, 100, 10);
} }
Nah, bisa jauh lebih simple kan?
Mari kita pahami isi for
loop di atas.
for (let i = 1;
artinya kita membuat variabeli
yang nilainya dimulai dari 1.i <= 10;
artinya kita akan melakukan looping selama nilaii
kurang dari atau sama dengan 10.i++
artinya setiap kali looping, nilaii
akan bertambah 1.
i | i <= 10 | Penjelasan |
---|---|---|
1 | true | i dimulai dari 1 |
2 | true | Nilai i bertambah 1 karena i++ |
3 | true | Idem |
4 | true | Idem |
5 | true | Idem |
6 | true | Idem |
7 | true | Idem |
8 | true | Idem |
9 | true | Idem |
10 | true | Idem |
11 | false | Karena i <= 10 bernilai false , maka looping berhenti |
circle(i * 10, 100, 10);
-> kita mengalikan nilai i
dengan 10, sehingga lingkaran akan tergambar di posisi i * 10
. Jadi lingkaran pertama akan tergambar di posisi 10, kedua di posisi 20, ketiga di posisi 30, dan seterusnya.
Task 2 📝: 20 Circles
Buatlah 20 lingkaran yang bersampingan.
Task 3 📝: Shift to Right
Geser semua lingkaran 10 pixel ke kanan, i.e. lingkaran dimulai dari posisi 20 (bukan 10) dan berakhir di posisi 210.
Task 4 📝: Add Space
Letakkan lingkaran di posisi 10, 30, 50, 70, 90, 110, 130, 150, 170, 190.
Bonus: Modulo Operator
%
adalah operator modulo, sisa pembagian dari dua bilangan.
5 % 2
= 1 (karena 5 dibagi 2 sisa 1)6 % 2
= 0 (karena 6 dibagi 2 sisa 0)7 % 2
= 1 (karena 7 dibagi 2 sisa 1)7 % 3
= 1 (karena 7 dibagi 3 sisa 1)
Nah, modulo operator bisa digunakan untuk membuat pola yang menarik.
function draw() {
background(220);
for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 100, 10);
} }
i | i % 2 |
---|---|
1 | 1 |
2 | 0 |
3 | 1 |
4 | 0 |
5 | 1 |
Perhatikan bahwa nilai modulo-nya bergantian antara 0 dan 1, sehingga bisa digunakan untuk membuat pola warna yang menarik.
Task 5 📝: Alternating Colors
Buatlah 10 lingkaran dengan pola warna merah - hijau - biru
Repeating for
loop
Bagaimana jika kita ingin membuat 2 baris lingkaran seperti di atas?
Mudah, tinggal copy paste saja for
loopnya, dan ganti posisi y-nya.
function draw() {
background(220);
for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 100, 10);
}for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 120, 10); // perhatikan nilai y-nya berbeda
} }
Bagaimana untuk 4 baris?
function draw() {
background(220);
for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 100, 10);
}for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 120, 10); // perhatikan nilai y-nya berbeda
}for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 140, 10); // perhatikan nilai y-nya berbeda
} }
Wah repot ya, dejavu :D
Nested for
loop
Solusinya adalah wrap for
loop di atas di dalam for
loop baru
function draw() {
background(220);
for (let j = 0; j < 3; j++) {
for (let i = 1; i <= 10; i++) {
if (i % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(i * 20, 100 + j * 20, 10);
}
} }
Perhatikan adalah j
yang bertugas menggeser posisi y-nya.
Bonus: i, j, k Counter
Pada umumnya, loop counter dinamai i
, j
, k
, dst. Ini adalah konvensi yang umum digunakan di dunia programming. Code di atas tidak sesuai konvensi, karena kita menggunakan j
di foor
yang paling luar, dan i
di for
yang paling dalam.
Mari kita ubah agar sesuai konvensi.
function draw() {
background(220);
for (let i = 0; i < 3; i++) {
for (let j = 1; j <= 10; j++) {
if (j % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(j * 20, 100 + i * 20, 10);
}
} }
Task 6 📝: Three Colors
Buatlah 10 baris pola di atas
Pola Segitiga
Nilai i
dan j
bisa dibandingkan untuk membuat pola menarik
for (let i = 0; i < 10; i++) {
for (let j = 1; j <= 10; j++) {
if (j <= i + 1) {
if (j % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(j * 20, 100 + i * 20, 10);
}
} }
Task 7 📝: Triangle Shape
Buatlah pola segitiga terbalik
Animasikan
Kita bisa membuat animasi dengan mengubah nilai variabel di dalam draw
loop.
function draw() {
background(220);
for (let i = 0; i < 10; i++) {
for (let j = 1; j <= 10; j++) {
if (j % 2 == 0) {
fill("red");
else {
} fill("blue");
}circle(j * 20 + random(5), 100 + i * 20 + random(5), 10);
}
} }
Task 8 📝: Animated
Buatlah agar lingkaran bergerak ke kanan dan ke kiri saja
Task 9 📝: Chess Board
Buatlah papan catur seperti ini:
mouseX
dan mouseY
Yuk sekarang kita buat interaktif dengan menggunakan mouseX
dan mouseY
.
https://p5js.org/reference/#/p5/mouseX
mouseX
adalah variable yang menyimpan posisi x dari mouse, dan mouseY
adalah variable yang menyimpan posisi y dari mouse.
function draw() {
background(220);
circle(mouseX, mouseY, 100);
}
Perhatikan bahwa lingkaran akan mengikuti posisi mouse.
Oh, ya apa yang terjadi jika background(220)
dihapus?
Task 10 📝: Without background
Hapus background(220)
dan lihat apa yang terjadi.
Task 11 📝: Mouse Following
Buatlah animasi seperti ini
Task 12 📝: Enlarge
Buat agar ketika mouse-nya diclick, lingkaran akan membesar. Dan ketika keyboard-nya ditekan, lingkaran akan mengecil.
Bonus: Cool Pattern
Pertama-tama, yuk bikin persegi 20x20
function draw() {
background(220);
noLoop();
for (let i = 0; i < 20; i++) {
for (let j = 0; j < 20; j++) {
square(j * 20, i * 20, 20);
}
} }
Kemudian, kita buat garis diagonal dari kiri atas ke kanan bawah
function draw() {
background(220);
noLoop();
for (let i = 0; i < 20; i++) {
for (let j = 0; j < 20; j++) {
square(j * 20, i * 20, 20);
let topLeftX = j * 20;
let topLeftY = i * 20;
let bottomRightX = j * 20 + 20;
let bottomRightY = i * 20 + 20;
line(topLeftX, topLeftY, bottomRightX, bottomRightY);
}
} }
Satu lagi diagonal dari kanan atas ke kiri bawah
function draw() {
background(220);
noLoop();
for (let i = 0; i < 20; i++) {
for (let j = 0; j < 20; j++) {
square(j * 20, i * 20, 20);
let topLeftX = j * 20;
let topLeftY = i * 20;
let bottomRightX = j * 20 + 20;
let bottomRightY = i * 20 + 20;
let topRightX = j * 20 + 20;
let topRightY = i * 20;
let bottomLeftX = j * 20;
let bottomLeftY = i * 20 + 20;
line(topLeftX, topLeftY, bottomRightX, bottomRightY);
line(topRightX, topRightY, bottomLeftX, bottomLeftY);
}
} }
Sekarang kita hapus persegi dan biarkan garisnya saja
Terakhir, decision untuk membuat diagonal-nya kita randomize. Kadang kita buat diagonal dari kiri atas ke kanan bawah, kadang kita buat diagonal dari kanan atas ke kiri bawah.
function draw() {
background(220);
noLoop();
for (let i = 0; i < 20; i++) {
for (let j = 0; j < 20; j++) {
let topLeftX = j * 20;
let topLeftY = i * 20;
let bottomRightX = j * 20 + 20;
let bottomRightY = i * 20 + 20;
let topRightX = j * 20 + 20;
let topRightY = i * 20;
let bottomLeftX = j * 20;
let bottomLeftY = i * 20 + 20;
let rnd = random(2);
if (rnd < 1) {
line(topLeftX, topLeftY, bottomRightX, bottomRightY);
else {
} line(topRightX, topRightY, bottomLeftX, bottomLeftY);
}
}
} }
Task 13 📝 Cool Pattern
Buatlah pattern seperti ini