Last active
June 19, 2018 19:55
-
-
Save jgamble/7a96a7539cb473f2edcbf1e6c6d834f7 to your computer and use it in GitHub Desktop.
Hexpaper In Postscript, by Daniel C. Nygren (posted on USENET in 1994). Settings (hex size, page size, etc) are set in-place, I've never felt the need to write a wrapper for it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| %!PS-Adobe-1.0 | |
| % hexpaper.ps - Version 1.0 : Hexagon mapping paper in PostScript | |
| % | |
| % Copyright 1994 by Daniel C. Nygren | |
| % Current e-mail: nygren@tecnet1.jcte.jcs.mil | |
| % | |
| % Permission to use and modify this software for any purpose other than | |
| % commercial use or its incorporation into a commercial product is | |
| % hereby granted without fee. Permission to copy and distribute this software | |
| % only for non-commercial use is also granted without fee, provided that | |
| % the above copyright notice and this entire permission notice appear in | |
| % all copies, and any supporting documentation. The author makes no | |
| % representations about the suitability of this software for any purpose. | |
| % It is provided "as is" without express or implied warranty. | |
| % This program prints out hexagon mapping paper on a PostScript printer. | |
| % The size of the hexes is adjustable via the side_size variable. The darkness | |
| % of the lines can be changed with the setgray operator and the line thickness | |
| % can also be set differently with the setlinewidth operator. | |
| % --- Defines --- | |
| /#copies 1 def %Enter number of copies to print out | |
| /side_size {0.2} def %Enter length of a hexagon side in inches | |
| /paper_width {8.5} def %Enter paper width in inches | |
| /paper_height {11} def %Enter paper height in inches | |
| /margin {0.25} def %Enter paper margin in inches | |
| % Calculate a hexagon's height and width given a side's size | |
| /hex_height {2 side_size mul 60 sin mul} bind def | |
| /hex_width {2 side_size mul 60 cos mul side_size add} bind def | |
| % Calculate how many hexes will fit across the paper's width | |
| % Subtract a hex_width from the available space because we need to | |
| % add one last_hex_bottom at the end of each row of hex_bottoms | |
| /this_many_hexes_wide {paper_width margin 2 mul sub hex_width sub hex_width side_size add div floor} bind def | |
| % Calculate how many hexes will fit across the paper's height | |
| /this_many_hexes_high {paper_height margin 2 mul sub hex_height div floor} bind def | |
| /inch {72 mul} bind def | |
| % --- Lines --- | |
| /line {side_size inch 0 inch rlineto} def | |
| /no_line {side_size inch 0 inch rmoveto} def | |
| /hex_bottom { % %%%%%% | |
| -60 rotate % % | |
| line %%%%%% | |
| 60 rotate | |
| line | |
| 60 rotate | |
| line | |
| -60 rotate | |
| line | |
| } bind def | |
| /last_hex_bottom { % % | |
| -60 rotate % % | |
| line %%%%%% | |
| 60 rotate | |
| line | |
| 60 rotate | |
| line | |
| -60 rotate | |
| } bind def | |
| /hex_top { %%%%%% | |
| 60 rotate % % | |
| line % %------ | |
| -60 rotate | |
| line | |
| -60 rotate | |
| line | |
| 60 rotate | |
| no_line | |
| } bind def | |
| % --- Start program --- | |
| newpath %Start with a clean slate | |
| 0.2 setgray %Play with this to change darkness of lines | |
| 0.2 setlinewidth %Play with this to change line thickness | |
| % --- Calculate where to start printing so the hexes are centered --- | |
| % Find out how many hex_bottoms will fit across the paper's width. | |
| this_many_hexes_wide | |
| % Then see how much room they will take up (Don't forget the last hex bottom!) | |
| hex_width side_size add mul hex_width add | |
| % Then subtract from paper width and divide by two to find out where to start | |
| % printing. This x coordinate is left on the stack. | |
| paper_width exch sub 2 div inch | |
| % Find out how many hexes will fit across the paper's height | |
| this_many_hexes_high | |
| % Then see how much room they will take up | |
| hex_height mul | |
| % Then subtract from paper height and divide by two and add hex_height divided | |
| % by two (because we start drawing at the middle of the hex) to find out where | |
| % to start printing This y coordinate is left on the stack. | |
| paper_height exch sub 2 div hex_height 2 div add inch | |
| % Start printing at the calculated spot | |
| moveto | |
| % Construct the rows of hexes by printing a row of hex bottoms | |
| % followed by a row of hex tops. Loop counts must be integers, so | |
| % cvi is used to convert the numbers to integers. | |
| this_many_hexes_high cvi{ | |
| currentpoint %Save currentpoint on stack twice: | |
| currentpoint %once for getting back to print the hex tops, | |
| %once for returning to move up one row. | |
| %Make a row of hex_bottoms | |
| this_many_hexes_wide cvi{ | |
| hex_bottom | |
| }repeat | |
| last_hex_bottom %Last hex bottom doesn't have a tail sticking out | |
| moveto %Go back to point saved on stack to print hex tops | |
| %Make a row of hex tops | |
| this_many_hexes_wide cvi{ | |
| hex_top | |
| }repeat | |
| hex_top %Last hex top to match last hex bottom | |
| moveto %Go back to point saved on stack so we can move up to next row | |
| 0 inch hex_height inch rmoveto %Move up to next row | |
| }repeat | |
| stroke | |
| showpage |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment