Scalable Polygon Grid Using For Loop
I want to create an interactive digital canvas that will generate a series of near-square polygons in a grid. The below jsFiddle shows a 2x2 grid system of said polygons. If you in
Solution 1:
How to draw a grid with slightly random offset intersection points
Think of each intersecting point on your grid as a circle’s centerpoint.
Then you can calculate an offset from that centerpoint using a random radius and a random angle.
This will randomly offset each intersecting point.
Here’s an example of how to calculate gridpoints with a 0-2.5 pixel “wobble” off it's "usual" position:
// make each grid cell's side 20px
// (you can alter this to fit your needs)
var sideLength=20;
// allow the point to wobble up to 2.5 pixels from its "usual" position
var radius=2.5*Math.random();
// allow that point to wobble at a random angle around its "usual" position
var radianAngle=2*Math.PI*Math.random();
// do the calculation of the new wobbled intersection point
// the x & y are the cell's horizontal(x) and vertical(y) position on the grid
var cx=x*sideLength+radius*Math.cos(radianAngle);
var cy=y*sideLength+radius*Math.sin(radianAngle);
Here is example code and a Fiddle: http://jsfiddle.net/m1erickson/Wqhb9/
<!doctype html>
<html>
<head>
<link type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
#canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
// declare an array
var points=new Array(17);
for(var i=0;i<points.length;i++){
points[i]=new Array(17);
}
var sideLength=20;
// fill the array with
for(var y=0;y<17;y++){
for(var x=0;x<17;x++){
// create a random semi-offset grid point
var radius=2.5*Math.random();
var radianAngle=2*Math.PI*Math.random();
var cx=x*sideLength+radius*Math.cos(radianAngle);
var cy=y*sideLength+radius*Math.sin(radianAngle);
// if this is a sidepoint, don't offset (sides are straight)
if(x==0){cx=0;}
if(y==0){cy=0;}
if(x==16){cx=x*sideLength;}
if(y==16){cy=y*sideLength;}
// add this gridpoint to the points array
points[x][y]={x:cx+10,y:cy+10};
}
}
// stroke the 4 sides of each cell
for(var y=0;y<16;y++){
for(var x=0;x<16;x++){
strokeCell(x,y);
}
}
// draw the 4 sides of the cell
function strokeCell(x,y){
var pt0=points[x][y];
var pt1=points[x+1][y];
var pt2=points[x+1][y+1];
var pt3=points[x][y+1];
ctx.beginPath();
ctx.moveTo(pt0.x,pt0.y);
ctx.lineTo(pt1.x,pt1.y);
ctx.lineTo(pt2.x,pt2.y);
ctx.lineTo(pt3.x,pt3.y);
ctx.closePath();
ctx.stroke();
}
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=400 height=400></canvas>
</body>
</html>
Post a Comment for "Scalable Polygon Grid Using For Loop"