Dot Connection Abstrak dengan HTML5 Canvas


Percampuran warna biru menyala dan background warna abu-abu, ternyata dapat menambahkan kesan elegan seperti gambar di atas.

Secara konsep, algoritma gambar di atas adalah menggambar antara dua titik yang tekoneksi, dengan ketika mendeteksi bagian yang sudah terisi, maka penggambaran titik dihentikan.

Metode yang digunakan adalah dengan menambahkan grid.

Grid ini diimplementasikan secara semu sebagai marker, dan tersebar seolah-olah menjadi lapisan 2D (dua dimensi) tersendiri.

Grid ditandai dengan nilai 0 jika belum terisi (ditmpati oleh dot atau dilewati garis), dan akan ditandai dengan angka 1 jika sudah terisi.

Sedangkan untuk proses penggambarannya dibagi menjadi tiga kondisi, yaitu deteksi dot awal secara acak sebagai pembuka, penggambaran garis, dan penggambaran dot penutup.

Jika grid yang akan diisi atau dilewati sudah terisi, maka garis dan dot tidak digambarkan, dan perulangan akan dilanjutkan ke perulangan selanjutnya, tetapi tetap sebagai kondisi pertama, sampai 100 kali perulangan terpenuhi.

Kode berikut ini adalah kode HTML5 Canvas untuk menggambarkan pola acak di atas:

<html> 
<head> 
<title>Polygon Cloud Generator</title> 
</head> 
<body> 
<canvas id="myCanvas" width="1024" height="768"> 
</canvas> 
<script> 
 
var canvas = document.getElementById("myCanvas"); 
 
var ctx = canvas.getContext("2d"); 
ctx.fillStyle = "black"; 
ctx.fillRect(0,0,canvas.width,canvas.height); 
 
ctx.fillStyle="#50575C"; 
var rx=0.5*canvas.width; 
var ry=0.5*canvas.height; 
var r=Math.sqrt(rx*rx+ry*ry); 
 
var x=0,y=0,n=0; 
while(y<canvas.height){ 
 var a=(n%2==1)?5:0; 
 x-=a; 
 while(x<canvas.width){ 
  var d=10; 
  rx=x-0.5*canvas.width; 
  ry=y-0.5*canvas.height; 
  var ro=Math.sqrt(rx*rx+ry*ry); 
  ctx.beginPath(); 
  ctx.fillRect(x,y,d,3); 
  ctx.closePath(); 
  x+=d+1; 
 } 
 x=0; 
 y+=5; 
 n++; 
} 
 
var kondisi=0,ax=0,ay=0,num=0; 
 
var dp=15; 
var p=Math.round(canvas.width/dp); 
var l=Math.round(canvas.height/dp); 
var grids=[]; 
for(i=0;i<p*l;i++)grids[i]=0; 
var pox=0,poy=0,targetx=0,targety=0,rotasi=0; 
 
function Menggambar() 
{ 
 var passed=true; 

 ctx.fillStyle="#03BBFF"; 
 ctx.strokeStyle="#03BBFF"; 
 ctx.lineWidth =4; 
 if(kondisi==0){ 
  ax=Math.random()*canvas.width; 
  ay=Math.random()*canvas.height; 
  rotasi=0;//-180+360*Math.random(); 
  var px=Math.floor(ax/dp); 
  var py=Math.floor(ay/dp); 
  var testx=px+dp*Math.cos(rotasi*Math.PI/180); 
  var testy=py+dp*Math.sin(rotasi*Math.PI/180); 
  var tx=Math.floor(testx/dp); 
  var ty=Math.floor(testy/dp); 
  if(grids[px+p*py]!=1 && grids[px+p*py+1]!=1 && grids[px+p*py+p]!=1 && grids[px+p*py+p+1]!=1 && grids[tx+p*ty]!=1 && grids[tx+p*ty+1]!=1 && grids[tx+p*ty+p]!=1 && grids[tx+p*ty+p+1]!=1){ 
   ax=(px+0.5)*dp;ay=(py+0.5)*dp; 
   pox=(px+0.5)*dp;poy=(py+0.5)*dp; 
   targetx=(px+0.5)*dp;targety=(py+0.5)*dp; 
   grids[px+p*py]=1; 

   kondisi++; 

   ctx.beginPath(); 
   ctx.arc(ax,ay,6, 0, 2 * Math.PI); 
   ctx.fill(); 
   ctx.closePath(); 
   ctx.beginPath(); 
   ctx.moveTo(pox,poy); 
  } 
 } 

 if(kondisi==1){ 
  var px=Math.floor(ax/dp); 
  var py=Math.floor(ay/dp); 
  var tx=Math.floor(targetx/dp); 
  var ty=Math.floor(targety/dp); 
  if(tx==px && ty==py){ 
   var r=200;//+500*Math.random(); 
   rotasi+=-30+60*Math.random(); 
   targetx+=r*Math.cos(rotasi*Math.PI/180); 
   targety+=r*Math.sin(rotasi*Math.PI/180); 
   targetx=(Math.floor(targetx/dp)+0.5)*dp; 
   targety=(Math.floor(targety/dp)+0.5)*dp; 
  } 

  var testx=ax+dp*Math.cos(rotasi*Math.PI/180); 
  var testy=ay+dp*Math.sin(rotasi*Math.PI/180); 
  tx=Math.floor(testx/dp); 
  ty=Math.floor(testy/dp); 
  if(px!=tx || py!=ty){ 
   if(grids[tx+p*ty]==1)kondisi=2; 
  } 

  if(ax<-dp || ay<-dp || ax>canvas.width+dp || ay>canvas.height+dp)kondisi=2; 

  if(ax<targetx)ax++; 
  if(ax>targetx)ax--; 
  if(ay<targety)ay++; 
  if(ay>targety)ay--; 

  ctx.lineTo(ax,ay); 
  ctx.stroke(); 
  pox=ax;poy=ay; 
  grids[px+p*py]=1; 
 } 

 if(kondisi==2){ 
  ctx.lineTo(ax,ay); 
  ctx.closePath(); 

  var px=Math.floor(ax/dp); 
  var py=Math.floor(ay/dp); 
  ctx.beginPath(); 
  ctx.arc(ax,ay,6, 0, 2 * Math.PI); 
  ctx.fill(); 
  ctx.closePath(); 

  grids[px+p*py]=1; 

  kondisi=0; 
  num++; 
 } 

 if(num<100)window.requestAnimationFrame(Menggambar); 
 else alert("Done"); 
} 
 
Menggambar(); 
</script> 
</body> 
</html> 

Komentar



Postingan populer dari blog ini

Membuat Kalkulator Interpolasi Bilinear dengan Javascript

Seberapa Hebatkah Orang Dalam

Algorithma Tic Tac Toe dengan HTML5 Canvas

Perbedaan Sudut Pandang Dosen dan Karyawannya

Sedikit Pandangan tentang Pelatihan Bersertifikasi

Membuktikan Hasil Pendekatan Limit Menggunakan Algebra Equation Calculator

Menggambar Lingkaran Menyala dengan Efek Shadow

Polygon Cloud Generator dengan HTML5 Canvas

Jasa Penjadwalan Semester, UTS dan UAS Perguruan Tinggi menggunakan Google Sheet

Generate Karakter Acak dan Menempatkannya di Sel Google Sheets dengan Apps Script