no warnings; # Draw a grid of hexagons glMatrixMode(GL_MODELVIEW); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,1,0); glPointSize(10); glLineWidth(1); glDisable(GL_DEPTH_TEST); glLoadIdentity(); glTranslatef(-5,-8,-30); glPushMatrix(); glTranslatef(0,0,0); for my $x (0..10) { glTranslatef(cos(R30D),sin(R30D),0); glPushMatrix(); for my $y(0..10) { glTranslatef(0,1,0); drawHex([$x%2,$y%2,0], [0,.5-$y/20,$y/10]); } glPopMatrix(); } glPopMatrix(); glutSwapBuffers(); sub drawHex { my $border=shift; my $fill = shift; my $r = shift || 0.5; my $bwidth = shift || 0.05; $r = $r-2*$bwidth; my $s = $r / cos(R30D); my $h = $s * sin(R30D); #print "$h, $r, $s"; if (defined $fill) { glColor3f(@$fill); glBegin(GL_POLYGON); glVertex2f($bwidth+$h,-$r); glVertex2f($bwidth+$h+$s,-$r); glVertex2f($bwidth+2*$h+$s,0); glVertex2f($bwidth+$h+$s, $r); glVertex2f($bwidth+$h, $r); glVertex2f($bwidth,0); glEnd(); } if (defined $border) { glColor3f(@$border); glBegin(GL_LINE_LOOP); glVertex2f($bwidth+$h,-$r); glVertex2f($bwidth+$h+$s,-$r); glVertex2f($bwidth+2*$h+$s,0); glVertex2f($bwidth+$h+$s, $r); glVertex2f($bwidth+$h, $r); glVertex2f($bwidth,0); glEnd(); } }