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

Kaidah Baku untuk Konsistensi Data (PT, Tbk, Pty., & Ltd.)

Honeycomb Style Wallpaper dengan HTML5 Canvas

Game TicTacToe dengan Greenfoot

Eliminasi Gauss-Jordan untuk Invers Matrix dengan Java

Afiliasi Shopee Tanpa Wajah dan Tanpa Beli Sampel Bermodal AI

Apps Script untuk Membuat Banyak Folder di Google Drive

Robot Forex Martingale Gratis

Algorithma FPB dan KPK dengan Javascript

Perbedaan Sudut Pandang Dosen dan Karyawannya

Membuat Kalkulator Interpolasi Bilinear dengan Javascript