rjk@sequent.UUCP (Robert Kelley) (07/12/90)
I don't know what the referenced articles are about, but maybe someone here can supply Postscript code to generate open hexagonal grids (like honeycombs), i.e. "Hex Paper". Code appreciated! xanthian@zorch.SF-Bay.ORG (Kent Paul Dolan) writes: >sandvig@poincare.geom.umn.edu (Cary Sandvig) writes: >>we were doing hyperbolic geometry with it last summer... >>then later on working out configurations for a crystal growth simulator... >You really ought to go back to that occult shop and buy the directions >that go with hex paper; trust me on this, you're using it completely >wrong. >Kent, the man from xanth. ><xanthian@Zorch.SF-Bay.ORG> <xanthian@well.sf.ca.us> >-- >Sitting at the console all day, watching the news scroll away -- James Deibele
xanthian@zorch.SF-Bay.ORG (Kent Paul Dolan) (07/12/90)
In article <38413@sequent.UUCP> rjk@sequent.UUCP (Robert Kelley) writes: >I don't know what the referenced articles are about, but maybe someone >here can supply Postscript code to generate open hexagonal grids >(like honeycombs), i.e. "Hex Paper". Code appreciated! > >xanthian@zorch.SF-Bay.ORG (Kent Paul Dolan) writes: > >>sandvig@poincare.geom.umn.edu (Cary Sandvig) writes: >>>we were doing hyperbolic geometry with it last summer... >>>then later on working out configurations for a crystal growth simulator... > >>You really ought to go back to that occult shop and buy the directions >>that go with hex paper; trust me on this, you're using it completely >>wrong. We here at talk.bizarre posting central rarely get a call to post source code. Naturally, when that call comes, every loyal bizarrite does his/her duty. It is of course mandatory to post source code that can in no way be used for the purpose described in the request, and that is as bizarre as possible. So, no (bleah!) Postscript. No (bletch) 'C'. Nothing at all useful. Here is _LINEPRINTER_ hex grid code in _FORTRAN 77_ for BSD 4.3 Unix. It trys to tell the story of the founding of talk.bizarre back in the days of the old west. If you take out one lousy and well annotated GOTO(considered harmful) it becomes a hex maze generator program. Suck rocks and die before you ask for help bringing this up. I never saw this code before in my life. Kent, the man from xanth, who can write FORTRAN code in any language, but prefers the real thing. <xanthian@Zorch.SF-Bay.ORG> <xanthian@well.sf.ca.us> -- Sitting at the console all day, watching the news scroll away -- James Deibele #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # bighexgrid.f # This archive created: Thu Jul 12 01:17:53 1990 export PATH; PATH=/bin:$PATH echo shar: extracting "'bighexgrid.f'" '(7542 characters)' if test -f 'bighexgrid.f' then echo shar: will not over-write existing file "'bighexgrid.f'" else sed 's/^XX//' << \SHAR_EOF > 'bighexgrid.f' XXC--------------------------------------------------- XXC PROGRAM MAZE XXC--------------------------------------------------- XX PROGRAM MAZE XXC Column, row order for drawing characters: XX CHARACTER*1 MAZEC (129,62) XXC XXC Same for logical maze: XXC XXC Sized to correspond to printout size: XX CHARACTER*1 MAZEL (32,60) XXC XXC About double the needed size frontier list: XX INTEGER FLIST (4000),KFLST,MFLST XXC Markers for external, internal, and frontier maze elements: XX CHARACTER*1 EXTER,INTER,FRONT XXC Counters for cells in each condition: XX INTEGER KEXTR,KINTR,KFRNT XXC Characters for drawing maze: XX CHARACTER*1 BLANK,UNDER,SLASH,BACKS XXC Give maze sizes names, to make them easy to change: XX INTEGER ROWC,COLC,ROWL,COLL XXC Look up tables for maze offsets. Sense of index is 1/2 the XXC clock hour which points at the neighbor! XX INTEGER IOFFC(6),JOFFC(6),IOFFL(6),JOFFL(6) XXC Arrays for storing the output of the system clock routines: XX INTEGER DBUF(3),TBUF(3) XXC XX LOGICAL EXIST XXC Cell condition markers: XX DATA EXTER / 'E' /, XX 1 INTER / 'I' /, XX 2 FRONT / 'F' / XXC Maze drawing pieces: XX DATA BLANK / ' ' /, XX 1 UNDER / '_' /, XX 2 SLASH / '/' /, XX 3 BACKS / '\\' / XXC Maze sizes: XX DATA ROWC / 62 /, XX 1 COLC / 129 /, XX 2 ROWL / 60 /, XX 3 COLL / 32 / XXC Size of FLIST XX DATA MFLST / 4000 / XXC Character maze offsets to border picture elements: XXC 2 4 6 8 10 12 clock directions. XX DATA IOFFC / +1, +1, +0, -1, -1, +0 / XX DATA JOFFC / +1, +2, +2, +2, +1, +0 / XXC Logical maze offsets to neighbors: XXC 2 4 6 8 10 12 clock directions. XX DATA IOFFL / +1, +1, +0, +0, +0, +0 / XX DATA JOFFL / -1, +1, +2, +1, -1, -2 / XXC Inline functions for the offsets: XX ICOFF ( IIN,JIN,NCLOK ) = ( 4*IIN ) + IOFFC(NCLOK) -2 * MOD(JIN,2) XX JCOFF ( IIN,JIN,NCLOK ) = JIN + JOFFC(NCLOK) XX ILOFF ( IIN,JIN,NCLOK ) = IIN + IOFFL(NCLOK) XX 1 - MOD(JIN,2) + ( MOD(JOFFL(NCLOK)+3,2)*MOD(JIN,2) ) XX JLOFF ( IIN,JIN,NCLOK ) = JIN + JOFFL(NCLOK) XXC Inline function for real random to integer choice conversion: XX IDORN(IBEG,IEND) = XX 1 MIN(IFIX(FLOAT(IEND-IBEG+1)*DRAND(0))+IBEG,IEND) XXC Inline function to check existance of a neighbor: XX EXIST(IIN,JIN) = ( ( ( IIN.GE.1 ) .AND. XX 1 ( IIN.LE.COLL ) ) .AND. XX 2 ( ( JIN.GE.1 ) .AND. XX 3 ( JIN.LE.ROWL ) ) ) XXC Inline function to pack coordinates for the frontier list: XX IFPCK(IIN,JIN) = ((JIN-1)*COLL+IIN-1) XXC Inline functions to unpack coordinates from the frontier list: XX IUNPK(IFIN) = MOD(IFIN,COLL) + 1 XX JUNPK(IFIN) = (IFIN/COLL) + 1 XXC Seed random number generator: XX CALL IDATE(DBUF) XX CALL ITIME(TBUF) XX NSEED = XX &((((DBUF(2))*31+DBUF(3))*24+TBUF(1))*60+TBUF(2))*60+TBUF(3) XX RJUNK = DRAND(ISEED) XXC Blank maze drawing: XX DO 2 IC = 1,COLC XX DO 1 JC = 1,ROWC XX MAZEC(IC,JC) = BLANK XX 1 CONTINUE XX 2 CONTINUE XXC Mark all maze cells exterior: XX DO 4 IL = 1,COLL XX DO 3 JL = 1,ROWL XX MAZEL(IL,JL) = EXTER XX 3 CONTINUE XX 4 CONTINUE XXC Tile maze drawing: XXC First row is special: XX DO 5 IC = 2,COLC,4 XX MAZEC(IC,1) = UNDER XX 5 CONTINUE XXC Do rest of odd rows: XX DO 7 JC = 3,ROWC,2 XX DO 6 IC = 1,COLC XX IF (MOD(IC,4).EQ.1) MAZEC(IC,JC) = BACKS XX IF (MOD(IC,4).EQ.2) MAZEC(IC,JC) = UNDER XX IF (MOD(IC,4).EQ.3) MAZEC(IC,JC) = SLASH XXC IF (MOD(IC,4).EQ.0) MAZEC(IC,JC) = BLANK Leave it blank. XX 6 CONTINUE XX 7 CONTINUE XXC Do even rows: XX DO 9 JC = 2,ROWC,2 XX DO 8 IC = 1,COLC XX IF (MOD(IC,4).EQ.1) MAZEC(IC,JC) = SLASH XXC IF (MOD(IC,4).EQ.2) MAZEC(IC,JC) = BLANK Leave it blank. XX IF (MOD(IC,4).EQ.3) MAZEC(IC,JC) = BACKS XX IF (MOD(IC,4).EQ.0) MAZEC(IC,JC) = UNDER XX 8 CONTINUE XX 9 CONTINUE XXC Fix two special cases, upper right and lower left: XXC (May need a patch if changed row, column limits change XXC edge conditions.) XX MAZEC(COLC,2) = BLANK XX MAZEC(1,ROWC) = BLANK XXC Clear frontier list: XX KFLST=0 XXC Set up cell condition counters: XX KEXTR=COLL*ROWL XX KINTR=0 XX KFRNT=0 XXC XXC Seed maze: XXC XXC Find a likely prospect: XX ILNEW = IDORN(1,COLL) XX JLNEW = IDORN(1,ROWL) XXC Serve him a warrent: XX MAZEL (ILNEW,JLNEW) = INTER XXC Housekeep the counters: XX KINTR = KINTR + 1 XX KEXTR = KEXTR - 1 XXC XXC This is a cook; modify normal program to just make some hex grids; XXC bypass all other processing: XXC XX GO TO 50 XXC XXC Design maze: XXC XX 10 CONTINUE XXC Check out the neighborhood: XX DO 11 MCLOK = 1,6 XXC Make the address of the neighbor in MCLOK direction: XX IL = ILOFF(ILNEW,JLNEW,MCLOK) XX JL = JLOFF(ILNEW,JLNEW,MCLOK) XXC Make sure there's someone home: XX IF (.NOT.EXIST(IL,JL)) GO TO 11 XXC Make sure he's a customer: XX IF (.NOT.(MAZEL(IL,JL).EQ.EXTER)) GO TO 11 XXC Enter him in the raffle: XX KFLST = KFLST + 1 XXC (Check first that we didn't sell too many tickets:) XX IF (KFLST.GT.MFLST) GO TO 9999 XX FLIST(KFLST) = IFPCK(IL,JL) XXC Housekeep the counters: XX KFRNT = KFRNT + 1 XX KEXTR = KEXTR - 1 XXC And send him a note to let him know: XX MAZEL(IL,JL) = FRONT XX 11 CONTINUE XXC We're done when we've destroyed the last frontier: XX IF (KFLST.EQ.0) GO TO 50 XXC Still a herd of buffalo running loose; pick one to shoot: XX IFNEW = IDORN(1,KFLST) XXC Find out his name, religious preference, burial request: XX IFNAM = FLIST(IFNEW) XX ILNEW = IUNPK(IFNAM) XX JLNEW = JUNPK(IFNAM) XXC Shoot the wooly bugger, another one runs to take his place: XX FLIST(IFNEW) = FLIST(KFLST) XXC Memo the bad news, another noble beast just bit the dust: XX KFLST = KFLST - 1 XX KFRNT = KFRNT - 1 XXC Find somebody to sell the carcass to; first, count the house: XX KNGBH = 0 XXC Look all around carefully for a live customer: XX DO 12 MCLOK = 1,6 XXC Choose a place to check: XX IL = ILOFF(ILNEW,JLNEW,MCLOK) XX JL = JLOFF(ILNEW,JLNEW,MCLOK) XXC Make sure there is such a place, not just another overdose of XXC snake oil: XX IF (.NOT.EXIST(IL,JL)) GO TO 12 XXC OK, there was one behind that rock, count him: XX IF (MAZEL(IL,JL).EQ.INTER) KNGBH = KNGBH + 1 XX 12 CONTINUE XXC We've counted them, now for the hard sell: XXC Pick a victim: XX NPICK = IDORN(1,KNGBH) XXC OOPS, he slipped away, but we know his face; find him again: XXC (Easier than building a callaboose to keep him in). XX DO 13 MCLOK = 1,6 XX IL = ILOFF(ILNEW,JLNEW,MCLOK) XX JL = JLOFF(ILNEW,JLNEW,MCLOK) XX IF (.NOT.EXIST(IL,JL)) GO TO 13 XX IF (MAZEL(IL,JL).NE.INTER) GO TO 13 XX NPICK = NPICK - 1 XXC This time we'll put the rock on him, so he's there when we need him: XX IF (NPICK.EQ.0) NCLCK = MCLOK XX 13 CONTINUE XXC Let's get his name, rank, service number and date of birth; he's a XXC slippery one. XX IC = ICOFF(ILNEW,JLNEW,NCLCK) XX JC = JCOFF(ILNEW,JLNEW,NCLCK) XXC Knock down the fence, we haven't got time to go around: XX MAZEC(IC,JC) = BLANK XXC Just one more dead buffalo: XX MAZEL(ILNEW,JLNEW) = INTER XXC Count him in: XX KINTR = KINTR + 1 XXC Do it again: XX GO TO 10 XXC XX 50 CONTINUE XXC Output the maze: XX WRITE (6,9001) ((MAZEC(IC,JC),IC=1,COLC),JC=1,ROWC) XXC XXC Size for line printer, for now: XX 9001 FORMAT (129A1) XX CALL EXIT(0) XXC XXC Blooper bailout: XXC XX 9999 WRITE (6,9902) XX 9902 FORMAT (" PROCESSING ERROR; ABORT.") XXC XX CALL EXIT(1) XX END SHAR_EOF if test 7542 -ne "`wc -c < 'bighexgrid.f'`" then echo shar: error transmitting "'bighexgrid.f'" '(should have been 7542 characters)' fi fi # end of overwriting check # End of shell archive exit 0