javascript - Rendering concentric hexes on Canvas -
i've written loop in javascript render rings of concentric hexagons around central hexagon on html canvas.
i start innermost ring, draw hex @ 3 o'clock, continue around in circle until hexes rendered. move on next ring , repeat.
when draw hexagons way (instead of tiling them using solely x , y offsets) hexagon not divisible 60 not same distance center hex divisible 60 (because these hexes comprise flat edges, not vertices, of larger hex).
the problem i'm having these hexes (those not divisible 60 degrees) rendering in off position. i'm not sure if floating point math problem, problem algorithm, problem rusty trig, or plain stupidity. i'm betting 3 out of 4. cut chase, @ line if (alpha % 60 !== 0)
in code below.
as point of information, decided draw grid way because needed easy way map coordinates of each hex data structure, each hex being identified ring # , id# within ring. if there better way i'm ears, however, i'd still know why rendering off.
here amateur code, bear me.
<script type="text/javascript"> window.addeventlistener('load', eventwindowloaded, false); function eventwindowloaded() { canvasapp(); } function canvasapp(){ var xorigin; var yorigin; var scalefactor = 30; var thecanvas = document.getelementbyid("canvas"); var context; if (canvas.getcontext) { context = thecanvas.getcontext("2d"); window.addeventlistener('resize', resizecanvas, false); window.addeventlistener('orientationchange', resizecanvas, false); resizecanvas(); } drawscreen(); function resizecanvas() { var imgdata = context.getimagedata(0,0, thecanvas.width, thecanvas.height); thecanvas.width = window.innerwidth; thecanvas.height = window.innerheight; context.putimagedata(imgdata,0,0); xorigin = thecanvas.width / 2; yorigin = thecanvas.height / 2; } function drawscreen() { var rings = 3; var alpha = 0; var modifier = 1; context.clearrect(0, 0, thecanvas.width, thecanvas.height); drawhex(0,0); (var = 1; i<=rings; i++) { (var j = 1; j<=i*6; j++) { if (alpha % 60 !== 0) { var h = modifier * scalefactor / math.cos(dtr(360 / (6 * i))); drawhex(h * (math.cos(dtr(alpha))), h * math.sin(dtr(alpha))); } else { drawhex(2 * scalefactor * * math.cos(dtr(alpha)), 2 * scalefactor * * math.sin(dtr(alpha))); } alpha += 360 / (i*6); } modifier+=2; } } function drawhex(xoff, yoff) { context.fillstyle = '#aaaaaa'; context.strokestyle = 'black'; context.linewidth = 2; context.linecap = 'square'; context.beginpath(); context.moveto(xorigin+xoff-scalefactor,yorigin+yoff-math.tan(dtr(30))*scalefactor); context.lineto(xorigin+xoff,yorigin+yoff-scalefactor/math.cos(dtr(30))); context.lineto(xorigin+xoff+scalefactor,yorigin+yoff-math.tan(dtr(30))*scalefactor); context.lineto(xorigin+xoff+scalefactor,yorigin+yoff+math.tan(dtr(30))*scalefactor); context.lineto(xorigin+xoff,yorigin+yoff+scalefactor/math.cos(dtr(30))); context.lineto(xorigin+xoff-scalefactor,yorigin+yoff+math.tan(dtr(30))*scalefactor); context.closepath(); context.stroke(); } function dtr(ang) { return ang * math.pi / 180; } function rtd(ang) { return ang * 180 / math.pi; } } </script>
man took me longer i'd admit find pattern hexagonal circles. i'm tired right explain since think i'll need make assisting illustrations in order explain it.
in short, each "circle" of hexagonal shapes hexagonal. number of hexagonal shapes along 1 edge same number of steps center.
var c = document.getelementbyid("canvas"); var ctx = c.getcontext("2d"); c.width = 500; c.height = 500; var hexradius = 20; var innercircleradius = hexradius/2*math.sqrt(3); var to_radians = math.pi/180; function drawhex(x,y) { var r = hexradius; ctx.beginpath(); ctx.moveto(x,y-r); (var = 0; i<=6; i++) { ctx.lineto(x+math.cos((i*60-90)*to_radians)*r,y+math.sin((i*60-90)*to_radians)*r); } ctx.closepath(); ctx.stroke(); } drawhexcircle(250,250,4); function drawhexcircle(x,y,circles) { var rc = innercircleradius; drawhex(250,250); //center (var = 1; i<=circles; i++) { (var j = 0; j<6; j++) { var currentx = x+math.cos((j*60)*to_radians)*rc*2*i; var currenty = y+math.sin((j*60)*to_radians)*rc*2*i; drawhex(currentx,currenty); (var k = 1; k<i; k++) { var newx = currentx + math.cos((j*60+120)*to_radians)*rc*2*k; var newy = currenty + math.sin((j*60+120)*to_radians)*rc*2*k; drawhex(newx,newy); } } } }
canvas { border: 1px solid black; }
<canvas id="canvas"></canvas>
Comments
Post a Comment