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

Apps Script untuk Cetak Sertifikat

Kumpulan Source Code Greenfoot

Menyembunyikan Failed Load Images di Blogger

Kode Greenfoot Game Flappy Bird

Checking Data yang Belum Dimasukkan dalam Daftar Menggunakan Query Google Sheet

Kebodohan Karyawan Menyalahkan Sistem

Algorithma Bilangan Prima dengan Javascript

Algorithma Coretan Abstrak dengan HTML5 Canvas

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

Mencoba Submit Theme di Wordpress.org