UnderwareDesign
May 24, 2013, 12:16:19 AM *
News: Happy Diver 2 WIP by Sigtrygg (11th,Jan,2013)
   Home    
Pages: [1]
 
Author Topic: hex grid images  (Read 1246 times)
Member

WWW
« on: March 19, 2006, 08:24:05 AM »


This simple routine will create an image of a hex grid and save it to disk as a Windows bitmap.  The file will be saved in the program's folder under the name "HexGrid.bmp".  You can specify hexes of any size, with any number of rows and columns, in either horizontal or vertical orientation.  You can choose to show the hex numbering, which will be in "xxyy" format starting with hex 0101 in the top left (the classic board war game format).  The image will contain black hex outlines and numbering on a white background.  The program has virtually no error-checking and is offered "as is".

PlayBASIC Code:
Constant white = RGB(255, 255, 255)
Constant black = RGB(8, 8, 8)

OpenScreen 500, 180, 16, 1
CenterScreen
TitleScreen "Draw Hex Grid"
RenderToScreen
Cls white
Ink black
ScreenFont = GetFreeFont()
LoadFont "Arial", ScreenFont, 21, 0
SetFont ScreenFont
 
; get parameters from user:
request$ = "length in pixels of 1 hex side:  "
answer$ = GetInputLine(30, 30, request$)
HexSide# = Val(answer$)

; horizontal orientation = flat hex sides are vertical
; vertical orientation = flat hex sides are horizontal
request$ = "hex orientation (H or V):  "
answer$ = GetInputLine(30, 50, request$)
HexOrientation$ = Lower$(answer$)

; the following refers to a FULL row or column, i.e., one which is not offset
;    from the map edge
request$ = "no. of hexes in 1 row:  "
answer$ = GetInputLine(30, 70, request$)
NumHexesInRow = Val(answer$)

request$ = "no. of hexes in 1 column:  "
answer$ = GetInputLine(30, 90, request$)
NumHexesInColumn = Val(answer$)

request$ = "show hex numbering (Y or N):  "
answer$ = GetInputLine(30, 110, request$)
HexNumbering$ = Lower$(answer$)

; ------------------------------------------------------------------------------

Cls white
CenterText GetScreenWidth() / 2, 65, "Working ..."
Sync

hexnumFont = GetFreeFont()
LoadFont "Arial", hexnumFont, 12, 0
SetFont hexnumFont

HexApothem# = Cos(30) * HexSide#
HexCutoff# = Sin(30) * HexSide#

RemStart
NOTE that for a regular hexagon created by CreateConvexShape the GetShapeVertexX,Y
commands produce the HexCutoff# & HexApothem# respectively.  That is the position
of the upper right vertex in relation to the center on a Cartesian grid.
The convex shape's handle is its center.
RemEnd

HexShape = GetFreeShape()
CreateConvexShape HexShape, HexSide#, 6

If HexOrientation$ = "h"
; HORIZONTAL ORIENTATION:
; PB draws hexes in Vertical Orientation
    RotateShape HexShape, 90, 1
    
   x = NumHexesInRow * (HexApothem# * 2) + 1
   y = NumHexesInColumn * (HexSide# + HexCutoff#) + HexCutoff# + 1
   CreateImage 1, x, y
   RenderToImage 1
   DrawGFXImmediate
   Cls white
   
   startX# = HexApothem#
   startY# = HexCutoff# + HexSide# / 2
   OffsetY# = HexCutoff# + HexSide#

   col = 1 : row = 1 : hexnum = 101
   Repeat
     If Even(row)
        ; remember - the shape's handle is its center
        OffsetX# = HexApothem#
    Else
             OffsetX# = 0
       EndIf
      x# = startX# + (col - 1) * (HexApothem# * 2) + OffsetX#
      y# = startY# + (row - 1) * OffsetY#
  DrawShape HexShape, x#, y#, 1
  If HexNumbering$ = "y"
     CenterText x#, y# - HexApothem# / 1.5, Digits$(hexnum, 4)
  EndIf
  Inc col : hexnum = hexnum + 100
  If (col > NumHexesInRow) Or (Even(row) And col = NumHexesInRow)
  ; every second row has 1 less hex
     col = 1 : hexnum = 100 + row
     Inc row : Inc hexnum
  EndIf
     Until row > NumHexesInColumn

Else
; vertical orientation
   
   x = NumHexesInRow * (HexSide# + HexCutoff#) + HexCutoff# + 1
   y = NumHexesInColumn * (HexApothem# * 2) + 1
   CreateImage 1, x, y
   RenderToImage 1
   DrawGFXImmediate
   Cls white
   
   startX# = HexCutoff# + HexSide# / 2
   startY# = HexApothem#
   OffsetX# = HexCutoff# + HexSide#

   col = 1 : row = 1 : hexnum = 101
   Repeat
    If Even(col)
       OffsetY# = HexApothem#
    Else
       OffsetY# = 0
    EndIf
    x# = startX# + (col - 1) * OffsetX#
    y# = startY# + (row - 1) * (HexApothem# * 2) + OffsetY#
  DrawShape HexShape, x#, y#, 1
  If HexNumbering$ = "y"
     CenterText x#, y# - HexApothem# / 1.5, Digits$(hexnum, 4)
  EndIf
  Inc row : hexnum = hexnum + 1
  If (row > NumHexesInColumn) Or (Even(col) And row = NumHexesInColumn)
  ; every second column has 1 less hex
     row = 1 : hexnum = col * 100 + 1
     Inc col : hexnum = hexnum + 100
  EndIf
   Until col > NumHexesInRow

EndIf

f$ = CurrentDir$() + "\HexGrid.bmp"
Save_Image_As_BitMap(f$, 1) 

RenderToScreen
Cls white
Ink black
SetFont ScreenFont
Text 30, 30, "Done."
Text 30, 60, "The blank hex grid is saved in"
Text 30, 90, CurrentDir$() + "\HexGrid.bmp"
Sync

WaitAllInput Off, 7, On

Login required to view complete source code



Logged
Member


WWW
« Reply #1 on: March 19, 2006, 09:24:45 AM »

Hello,

It's working very well. Thank you Alex777 for your effort.

Have a nice day,

Tomaz
Logged

My computer specification:

AMD Athlon 64 2800+
MB ASUS K8V Socket 754 VIA K8T800
SB Audigy 2
3 GB RAM DDR 400 MHz PQI
AGP NVIDIA GeForce 7600GT 256 MB-Club 3D
Windows XP Pro SP2
DirectX 9.0c
Member

WWW
« Reply #2 on: March 19, 2006, 09:34:51 AM »

Thanks, Tomaz!  Actually, I had to correct a bug and have reposted it, so if you need to use it you should d/l again.
Logged
Pages: [1]
 
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.13 | SMF © 2006-2009, Simple Machines LLC | Privacy Policy Valid XHTML 1.0! Valid CSS!