home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume18 / planet / part04 < prev    next >
Internet Message Format  |  1991-04-10  |  54KB

  1. From: allen@viewlogic.com (Dave Allen)
  2. Newsgroups: comp.sources.misc
  3. Subject: REPOST: v18i004:  planet - planet generation simulator, Part04/04
  4. Message-ID: <1991Apr9.041825.8147@sparky.IMD.Sterling.COM>
  5. Date: 9 Apr 91 04:18:25 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: b2104cf2 01fc0da8 88f3c561 60378f00
  8.  
  9. Submitted-by: Dave Allen <allen@viewlogic.com>
  10. Posting-number: Volume 18, Issue 4
  11. Archive-name: planet/part04
  12. Supersedes: tec: Volume 10, Issue 77-78
  13.  
  14. #! /bin/sh
  15. # into a shell via "sh file" or similar.  To overwrite existing files,
  16. # type "sh file -c".
  17. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  18. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  19. # Contents:  ./README ./doc/params.tec ./doc/readme.clim
  20. #   ./doc/readme.globe ./doc/readme.tec ./example/clim.in
  21. #   ./example/clim.out ./example/tec.out.1 ./example/tec.out.2
  22. #   ./example/tec.out.3 ./src/clim.h ./src/climate.c ./src/const.h
  23. #   ./src/globe.c ./src/tec.h ./src/unix.c ./src/wind.c
  24. # Wrapped by kent@sparky on Mon Apr  8 22:39:15 1991
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. echo If this archive is complete, you will see the following message:
  27. echo '          "shar: End of archive 4 (of 4)."'
  28. if test -f './README' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'./README'\"
  30. else
  31.   echo shar: Extracting \"'./README'\" \(849 characters\)
  32.   sed "s/^X//" >'./README' <<'END_OF_FILE'
  33. XThis is version 1 of a scientific planet generator (as opposed to a
  34. Xdie-rolling planet generator).  It is written in C and runs in graphics
  35. Xmode under Xwindows, or in text-only mode under UN*X.  There are three
  36. Xprograms: 
  37. X
  38. X   - tec: a continental drift simulator
  39. X   - clim: a climate generator
  40. X   - globe: computes and displays a rotating planet
  41. X
  42. XCopyright (c) 1991 by David Allen.  You may distribute this freely as long
  43. Xas you leave my name and copyright notice intact.
  44. X
  45. XI'd really like your comments and feedback; send e-mail to
  46. Xallen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore Ave,
  47. XMaynard, MA 01754.
  48. X
  49. XThere are three subdirectories:
  50. X
  51. X   - src: contains all source and a UN*X Makefile
  52. X   - example: contains some sample input and output files
  53. X   - doc: contains details about how to use the programs and how they work.
  54. X
  55. XHave fun!
  56. END_OF_FILE
  57.   if test 849 -ne `wc -c <'./README'`; then
  58.     echo shar: \"'./README'\" unpacked with wrong size!
  59.   fi
  60.   # end of './README'
  61. fi
  62. if test -f './doc/params.tec' -a "${1}" != "-c" ; then 
  63.   echo shar: Will not clobber existing file \"'./doc/params.tec'\"
  64. else
  65.   echo shar: Extracting \"'./doc/params.tec'\" \(5857 characters\)
  66.   sed "s/^X//" >'./doc/params.tec' <<'END_OF_FILE'
  67. XIf you give tec a filename as a command line argument, it will read 
  68. Xparameters from that file.  If you hand it '-' as an argument, it will
  69. Xread them from stdin.  For example, you could type "tec - < foo", or
  70. X"tec foo".  The '-' option is handy for pipes.
  71. X
  72. XThe parameter file is optional; all of the parameters you can change
  73. Xhave defaults.  Thus, the parameter file need contain only the parameters
  74. Xyou want to change.  A parameter file looks like LISP; for example,
  75. Xto change the XSIZE parameter, the file would have the one line
  76. X
  77. X(XSIZE 40)
  78. X
  79. XParameters can also be vectors; for example
  80. X
  81. X(MOVERATE (1 1 1))
  82. X
  83. XThe parameters are either easy or hard.  This rating concerns how much
  84. Xyou have to know about the simulation to change the parameters.  Easy
  85. Xones just affect run time, resolution, and so on.  Hard ones should
  86. Xonly be changed if you understand the code pretty well.
  87. X
  88. XEasy parameters:
  89. XPRINTMODE - 0 produces no output, 1 produces a long text file (default),
  90. X            3 produces a summary text file and 4 produces PostScript
  91. X            grayscale drawings.
  92. XDRAWEVERY - How many steps should be iterated for each output.  Default 1,
  93. X            but this produces an awful lot of text.  Reasonable values
  94. X            for non-interactive runs are 5 or 10.  Supercontinents appear
  95. X            every 25 steps or so.  A value of zero implies that only the
  96. X            final map, at the last timestep, should be output.
  97. XMAXSTEP   - How many steps to run before terminating.  Default 100.
  98. XXSIZE     - Horizontal size of arrays.  Default 90.  To produce summaries
  99. X            that fit on a normal page, I used 72.
  100. XYSIZE     - Vertical size of arrays.  Default 90.  To produce the summaries
  101. X            included in tec.out.[1-3], I used 48.
  102. XHYDROPCT -  The percentage of the grid that should be covered by water.
  103. X            Default is 70.  A threshhold is found for the initial blob to meet
  104. X            this goal within about 2-3%.  If DRAWEVERY is also set to 0 (see
  105. X            above), then at the last step the ocean level is forced up or
  106. X            down to satisfy the requirement.  This may cause a PANIC error if
  107. X            there just isn't enough land to do it.
  108. XUNDERSCAN - If a potential rift gets within this many squares of the edge, it
  109. X            is thrown away.  This keeps new fragments from appearing near the
  110. X            edge, which in turn means that far less land falls off the edge
  111. X            of the map.  This is a hack; the default is 0, which is no change;
  112. X            for 100 x 100 maps, 10 is the best choice.
  113. X
  114. XSo to produce a text file with 10 pictures, you could use 
  115. X
  116. X(PRINTMODE 2) (DRAWEVERY 10) (XSIZE 72) (YSIZE 48)
  117. X
  118. XTo produce a 20-page PostScript output with a little more detail, use
  119. X
  120. X(PRINTMODE 4) (DRAWEVERY 5)
  121. X
  122. XHard Parameters:
  123. XZINIT     - Initial altitude of supercontinent.  Default 22.
  124. XZSUBSUME  - Altitude added to leading edge of drifting plate.  Default 16.
  125. XZCOAST    - Sea level.  Everything below this is under water.  Default 16.
  126. XZSHELF    - Minimum altitude for continental shelf.  Default 8.
  127. XZMOUNTAIN - Used in PRINTMODE 2; altitude above which a square is counted
  128. X            as mountain instead of land.  Default 48.
  129. XZERODE    - Minimum altitude used in erosion.  Default 16.  Decrease this
  130. X            number and continents grow faster at the margins; increase it
  131. X            and they grow more slowly.  Increase it too much and weird
  132. X            things happen to your mountains.
  133. XMAXBUMP   - If two plates overlap on more than this number of squares,
  134. X            the plates must be merged together.  Default 50. 
  135. XBUMPTOL   - If the relative velocity of two touching plates is less than this
  136. X            value, the plates will be merged together.  Default 50.
  137. XMOVERATE  - A vector of real numbers describing the rate at which plates
  138. X            move apart, slow down, and then drift back together.  Each
  139. X            plate has an age, measured in steps from its creation.  The age
  140. X            is used as an offset into the vector.  The result is a real
  141. X            between -1.0 and +1.0 which is multiplied by the plate's original
  142. X            movement vector.  The default vector is
  143. X            (1.0 1.0 1.0 0.7 0.4 0.1 -0.2 -0.5 -0.8 -1.0)
  144. X
  145. X            It can be interpreted this way.  The first three steps a plate is
  146. X            in motion, it moves at its normal velocity.  During the 4-6
  147. X            steps, it slows down.  During the 7-10 steps, it moves the
  148. X            opposite way from the way it started, at increasing speeds.
  149. X            Thereafter, it keeps moving at its final velocity.
  150. XRIFTPCT   - Percent chance that a rift will occur in a given step.  Default 40.
  151. XMAXCTRTRY - The number of tries the rift routine will make to find an
  152. X            acceptable place to start a rift.  Default 50.
  153. XRIFTDIST  - The minimum allowable distance between a proposed rift center
  154. X            and the nearest coast.  Default 5.
  155. XDOERODE   - Whether or not to compute erosion.  Default 1; if 0, the program
  156. X            will run about twice as fast but will generate way too many
  157. X            mountains, since the only thing that gets rid of mountains
  158. X            is erosion.
  159. XERODERND  - The rounding factor used in erosion.  Default 4.  As this 
  160. X            parameter goes from 0 to 7, erosion occurs faster.
  161. XBENDEVERY - Each time a rift grows by this many squares, it is allowed to
  162. X            bend a little bit.  Default 6.
  163. XBENDBY    - When a rift bends, it bends by a random angle in the range
  164. X            -BENDBY ... +BENDBY multiplied by pi/2000.  Default value is 100.
  165. X            If BENDBY is too high or BENDEVERY is too low, very curvy rifts
  166. X            will be generated, with unrealistic results.
  167. XSPPEDBASE - The minimum speed at which new plates will travel.  Default 200.
  168. XSPEEDRNG  - The actual speed at which a plate travels is SPEEDBASE +
  169. X            rnd (SPEEDRNG).  Default value is 300.
  170. END_OF_FILE
  171.   if test 5857 -ne `wc -c <'./doc/params.tec'`; then
  172.     echo shar: \"'./doc/params.tec'\" unpacked with wrong size!
  173.   fi
  174.   # end of './doc/params.tec'
  175. fi
  176. if test -f './doc/readme.clim' -a "${1}" != "-c" ; then 
  177.   echo shar: Will not clobber existing file \"'./doc/readme.clim'\"
  178. else
  179.   echo shar: Extracting \"'./doc/readme.clim'\" \(3183 characters\)
  180.   sed "s/^X//" >'./doc/readme.clim' <<'END_OF_FILE'
  181. XThis is the README file for Version 1 of clim, a program which computes
  182. Xthe climate for a planet: temperature, pressure zones, wind patterns, rain
  183. Xpatterns, and finally climate based on temperature and rain.  It is
  184. Xwritten in C and runs on any Xwindows system (X11R4).  Copyright (c) 1991
  185. Xby David Allen.  You may distribute this freely as long as you leave my
  186. Xname and copyright notice intact.
  187. X
  188. XI'd really like your comments and feedback; send e-mail to
  189. Xallen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore Ave,
  190. XMaynard, MA 01754.
  191. X
  192. XWHAT DOES CLIM DO?
  193. X
  194. XGiven a topographical map, for example, one produced by TEC, this program
  195. Xcomputes temperature, pressure, wind, rain and climate.  The information
  196. Xused in these computations comes from any college-level meterology text.
  197. XOutput is produced as an animation on the graphics screen, on in text
  198. Xfiles including PostScript output.
  199. X
  200. XI have included a sample text map showing climate for one world; it is
  201. Xin example/clim.out.
  202. X
  203. XHOW DO I RUN IT?
  204. X
  205. XTo compile clim, go to the src directory and type "make clim".  To run it,
  206. Xgo to the example directory and type "../src/clim clim.in".  This directs
  207. Xthe program to read the map stored in the file clim.in.
  208. X
  209. XWhen clim runs, it opens a graphics screen.  It prints about 40 lines of
  210. Xstatus information to stderr, then begins to animate the results.
  211. X
  212. XAt any time, you can type "q" into the graphics window to end the program.
  213. XYou can flip between the types of display with these keys:
  214. X   h: display temperature; default.  Temperature is displayed using the
  215. X      full spectrum; purple is coldest, then blue, and so on; red is
  216. X      hottest.  There are about 30 visibly different shades.  Black
  217. X      lines indicate coastline; white lines surround mountains.
  218. X   p: display pressure.  Zones of low pressure are surrounded by white
  219. X      lines; zones of high pressure are surrounded by black lines.  Ocean
  220. X      is blue, land is red, and mountains are grey.
  221. X   w: display wind patterns.  Winds run in circles, especially over the
  222. X      ocean.  Black horizontal lines are westbound; white horizontals are
  223. X      eastbound; black verticals are southbound; white verticals are 
  224. X      northbound.  Ocean is blue, land is red, mountains are grey.
  225. X   r: display rainfall.  Amount of rainfall is displayed using the full
  226. X      spectrum; purple is driest, then blue; red is wettest.  Black lines
  227. X      indicate coastline; white lines surround mountains.
  228. X   c: display climate.  The following colors are used:
  229. X      dark blue:  Ocean           orange:        Savannah
  230. X      light grey: Icebergs        dark green:    Decidous forest 
  231. X      dark grey:  Tundra          bright green:  Jungle
  232. X      brown:      Steppe          bright blue:   Swamp
  233. X      yellow:     Desert
  234. X
  235. XTo produce your own maps for use with clim, you can use tec.  For example,
  236. Xcreate a tec input file with this single line:
  237. X
  238. X(XSIZE 60) (YSIZE 30) (PRINTMODE 3) (MAXSTEP 20)
  239. X
  240. XThen type "tec filename > tec.out" (where filename is the name of the
  241. Xinput file you just created).  Tec should run for a couple of seconds
  242. Xand then produce a file called tec.out.  Then type "clim tec.out" and
  243. Xyou will see the climate for your own planet.
  244. END_OF_FILE
  245.   if test 3183 -ne `wc -c <'./doc/readme.clim'`; then
  246.     echo shar: \"'./doc/readme.clim'\" unpacked with wrong size!
  247.   fi
  248.   # end of './doc/readme.clim'
  249. fi
  250. if test -f './doc/readme.globe' -a "${1}" != "-c" ; then 
  251.   echo shar: Will not clobber existing file \"'./doc/readme.globe'\"
  252. else
  253.   echo shar: Extracting \"'./doc/readme.globe'\" \(1735 characters\)
  254.   sed "s/^X//" >'./doc/readme.globe' <<'END_OF_FILE'
  255. XThis is the README file for Version 1 of globe, a program which takes
  256. Xa square map, wraps it around a globe, and displays an animation of the
  257. Xglobe rotating.  It is written in C and runs on any Xwindows system (X11R4).
  258. XCopyright (c) 1991 by David Allen.  You may distribute this freely as long
  259. Xas you leave my name and copyright notice intact.
  260. X
  261. XI'd really like your comments and feedback; send e-mail to
  262. Xallen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore Ave,
  263. XMaynard, MA 01754.
  264. X
  265. XWHAT DOES THE GLOBE PROGRAM DO?
  266. X
  267. XGiven a square map, for example, one produced by TEC, this program shows
  268. Xwhat the map would look like from space.  Since a square is flat, and
  269. Xa sphere is round, some distortion is involved.  
  270. X
  271. XHOW DO I RUN IT?
  272. X
  273. XTo compile globe, go to the src directory and type "make globe".  To run it,
  274. Xgo to the example directory and type "../src/globe globe.in".  This directs
  275. Xthe program to read the map stored in the file globe.in.
  276. X
  277. XWhen globe runs, it opens a graphics screen.  After a couple of seconds,
  278. Xa purple globe pops up.  There are 18 frames in the animation; the colors
  279. Xindicate altitudes.  Unlike tec, the ocean is displayed as bright purple
  280. Xrather than black.
  281. X
  282. XAt any time, you can type "q" into the graphics window to end the program.
  283. XIt will stop automatically after 10000 steps (a fairly long time).
  284. X
  285. XYou can display your own maps created using tec.  For example, create
  286. Xa tec input file with this single line:
  287. X
  288. X(MAXSTEP 20) (UNDERSCAN 10) (PRINTMODE 1)
  289. X
  290. XThen type "tec filename > tec.out" (where filename is the name of the
  291. Xinput file you just created).  Tec should run for a couple of seconds
  292. Xand then produce a file called tec.out.  Then type "globe tec.out" and
  293. Xyou will see your own globe rotating.
  294. END_OF_FILE
  295.   if test 1735 -ne `wc -c <'./doc/readme.globe'`; then
  296.     echo shar: \"'./doc/readme.globe'\" unpacked with wrong size!
  297.   fi
  298.   # end of './doc/readme.globe'
  299. fi
  300. if test -f './doc/readme.tec' -a "${1}" != "-c" ; then 
  301.   echo shar: Will not clobber existing file \"'./doc/readme.tec'\"
  302. else
  303.   echo shar: Extracting \"'./doc/readme.tec'\" \(3896 characters\)
  304.   sed "s/^X//" >'./doc/readme.tec' <<'END_OF_FILE'
  305. XThis is the README file for Version 5 of tec, a plate tectonic simulator.
  306. XIt is written in C and runs on any Xwindows system (X11R4) or any UN*X
  307. Xmachine using text or PostScript output.  Copyright (c) 1991 by David Allen.
  308. XYou may distribute this freely as long as you leave my name and copyright
  309. Xnotice intact.
  310. X
  311. XI'd really like your comments and feedback; send e-mail to
  312. Xallen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore Ave,
  313. XMaynard, MA 01754.
  314. X
  315. XVersion history:
  316. X1.  Posted to rec.games.frp and rec.games.programmer on 11 / 15 / 89
  317. X    - Runs only on Amiga, produces long text summary.
  318. X    - Includes PostScript translator for any PostScript printer.
  319. X2.  (Unreleased)
  320. X    - Added text-only mode so it runs on UN*X machines.
  321. X    - Added summary text output mode that fits on 80-character lines.
  322. X    - PostScript support merged into main program.
  323. X3.  Posted to comp.sources.misc, v10i077-78, on 2 / 15 / 90.
  324. X    - Parameters can come from an input file (see params.tec).
  325. X    - Ported to Sun workstation by the author.
  326. X    - Ported to IBM PC by Peter Lind.
  327. X4.  (Unreleased)
  328. X    - Ported to Xwindows by George Ferguson.
  329. X    - Autoscaling to produce specified hydrographics percentage.
  330. X    - Underscan mode to reduce drift "off the edge of the world".
  331. X5.  Posted to comp.sources.misc on 3 / 23 / 1991.
  332. X    - Merged with globe display and climate generator
  333. X    - Scope reduced to Xwindow graphics
  334. X
  335. XCredits:
  336. XBrian Love - conversion to Amiga Lattice C 5.02, Amiga beta tester.
  337. XPeter Lind - port to IBM PC Turbo C with CGA/MCGA/EGA/VGA.
  338. XAndrew Hay - improved random number seeding (now BSD independent).
  339. XFred Smith - added support for IBM PC Hercules mono graphics card.
  340. XHoward Johnson, Dave Pare - bug fixes.
  341. XGeorge Ferguson - port to XWindows.
  342. X
  343. X
  344. XWHAT DOES THE TECTONIC SIMULATOR DO?
  345. X
  346. XTEC draws a map of some imaginary world and puts one big continent on it.
  347. XThe program then graphically simulates the breakup of this supercontinent by
  348. Xrifts and the drifting of the continents.  Mountains are built by
  349. Xsubsuming and by continental collision, and are reduced by erosion.  As
  350. Xmore time passes, the continents tend to drift back into a supercontinent
  351. Xand split up again, forming what some authors call a "supercontinent cycle."
  352. X
  353. XThe program produces a map of an imaginary world which contains realistic
  354. Xlooking mountain ranges and continents which sometimes look like they fit
  355. Xtogether (like South America and Africa on Earth).
  356. X
  357. XI've included some sample output in the files example/tec.out.[1-3]; they are
  358. Xshort text files.  0's indicate ocean, 1's indicate land, and 2's indicate
  359. Xmountains.  Take a look.
  360. X
  361. X
  362. XHOW DO I RUN IT?
  363. X
  364. XTo compile tec, go to the src directory and type "make tec".  To run tec,
  365. Xtype "tec".  You can provide many optional parameter settings; place them
  366. Xin a file and run tec with "tec filename".  Output from tec goes to stdout;
  367. Xredirect it to a file to save it, as in "tec filename > outfile".
  368. X
  369. XWhen tec runs, it opens a graphics screen.  A big purple blob pops up.
  370. XThis is the initial supercontinent.  Every second or so (depending on
  371. Xmachine speed) another "step" will be computed and drawn.
  372. X
  373. XAltitudes are represented by colors; black is the lowest (ocean), and goes
  374. Xthrough the spectrum from lowest to highest: purple, blue, green, yellow,
  375. Xorange, red and finally white.  There are about 30 visibly different altitude
  376. Xranges, since each color has several shades.
  377. X
  378. XAs time passes, you will see the supercontinent split up; green and yellow
  379. Xmountains will appear on the leading edges of drifting continents; when
  380. Xcontinents slow down, reverse course, and collide, higher orange and red
  381. Xmountains will appear.  If you watch carefully, you can see erosion on
  382. Xmountains that are not growing; they turn darker and travel down through
  383. Xthe color ranges.
  384. X
  385. XAt any time, you can type "q" into the graphics window to end the program.
  386. XIt will stop automatically after 100 steps.
  387. END_OF_FILE
  388.   if test 3896 -ne `wc -c <'./doc/readme.tec'`; then
  389.     echo shar: \"'./doc/readme.tec'\" unpacked with wrong size!
  390.   fi
  391.   # end of './doc/readme.tec'
  392. fi
  393. if test -f './example/clim.in' -a "${1}" != "-c" ; then 
  394.   echo shar: Will not clobber existing file \"'./example/clim.in'\"
  395. else
  396.   echo shar: Extracting \"'./example/clim.in'\" \(1840 characters\)
  397.   sed "s/^X//" >'./example/clim.in' <<'END_OF_FILE'
  398. X(LAND (
  399. X000000000000000000000011111000000000011111111111100000000000
  400. X000000000000000000000111111100000000011111111111110000000000
  401. X000000000000000000001111111110000000011111111111110000000000
  402. X000000000000000000011111111110000000011111111111110000000000
  403. X000000000000000000111111111110000000011111111111110000000000
  404. X000000000000001111111122111110000000011111111111100000000000
  405. X000000000000011111111222111100000000011111111111100000000000
  406. X000000000000011111112222111100000000001111111111000000000000
  407. X000000000000011111222221111000000000001111111111000000000000
  408. X000000000000111112222211111000000000000111111111000000000000
  409. X000000000000111122222211110000000000000111111111000000000000
  410. X000000000000111222221111100000000000000111111111000000000000
  411. X000000000000111222211111000000000000000111111111000000000000
  412. X000000000000111222111110000000000000000111111110000000000000
  413. X000000000000111221111100000000000000111111111110000000000000
  414. X000000000000111211111100000000000001111111111110000000000000
  415. X000000000000111111111000000000000001111111111110000000000000
  416. X000000000000111111110000000000000011111111111100000000000000
  417. X000000000000111111110000000000000011111111111000000000000000
  418. X000000000000111111100000000000000111111111110000000000000000
  419. X000000000000111111000000000000001111111111110000000000000000
  420. X000000000000111111000000000000001111111111000000000000000000
  421. X000000000000000000000000000000011111111111000000000000000000
  422. X000000000000000000000000000000111111111111000000000000000000
  423. X000000000000000000000000000000111111111111000000000000000000
  424. X000000000000000000000000000001111111111110000000000000000000
  425. X000000000000000000000000000001111111111110000000000000000000
  426. X000000000000000000000000000001111111111100000000000000000000
  427. X000000000000000000000000000000111111111100000000000000000000
  428. X000000000000000000000000000000011111110000000000000000000000))
  429. END_OF_FILE
  430.   if test 1840 -ne `wc -c <'./example/clim.in'`; then
  431.     echo shar: \"'./example/clim.in'\" unpacked with wrong size!
  432.   fi
  433.   # end of './example/clim.in'
  434. fi
  435. if test -f './example/clim.out' -a "${1}" != "-c" ; then 
  436.   echo shar: Will not clobber existing file \"'./example/clim.out'\"
  437. else
  438.   echo shar: Extracting \"'./example/clim.out'\" \(1830 characters\)
  439.   sed "s/^X//" >'./example/clim.out' <<'END_OF_FILE'
  440. X333333333333333333333333333333333333333333333333333333333333
  441. X333333333333333333333333333333333333333333333333333333333333
  442. X333333333333333333333333333334444444444444433333333333333333
  443. X333333333333333333333333333300088885555555550000003333333333
  444. X000000000000000000000000000000008888555555555888000000000000
  445. X000000000000000080000000000000000088555555588888800000000000
  446. X000000000000885550000000000000000000005555555558850000000000
  447. X000000000000887667000000000000000000006655555555557000000000
  448. X000000000000877666780000000000000000006666666667667700000000
  449. X000000000000877666788000000000000000007666666667777880000000
  450. X000000000000876666778800000000000000007766667778887880000000
  451. X000000000000866666777888000000000000006666677778888800000000
  452. X000000000000666666777779900000000000007797900000009000000000
  453. X000000000000666666777777999000000000000000000000000000000000
  454. X000000000000777766777777799990000000000000000000000000000000
  455. X000000000000999777777777779999900000000000000000000000000000
  456. X000000000000A999999999999999999A0000000000000000000000000000
  457. X000000000000A99997777777777777900000000000000000000000000000
  458. X000000000000999979777677777770000000000000000000000000000000
  459. X000000000000988888766677667700000000000000000000000000000000
  460. X000000000000008888876666677800000000000000000000000000000000
  461. X000000000000000088887767677000000000000000000000000000000000
  462. X000000000000000000080007700000000000000000000000000000000000
  463. X000000000000000000000000000000000000000000000000000000000000
  464. X000000000000000000000000000000000000000000000000000000000000
  465. X000000000000000000000000000000000000000000000000000000000000
  466. X000000000000000000000000000000000000000000000000000000000000
  467. X333333333333333333333333333333333333333333333333333333333333
  468. X333333333333333333333333333333333333333333333333333333333333
  469. X333333333333333333333333333333333333333333333333333333333333
  470. END_OF_FILE
  471.   if test 1830 -ne `wc -c <'./example/clim.out'`; then
  472.     echo shar: \"'./example/clim.out'\" unpacked with wrong size!
  473.   fi
  474.   # end of './example/clim.out'
  475. fi
  476. if test -f './example/tec.out.1' -a "${1}" != "-c" ; then 
  477.   echo shar: Will not clobber existing file \"'./example/tec.out.1'\"
  478. else
  479.   echo shar: Extracting \"'./example/tec.out.1'\" \(3504 characters\)
  480.   sed "s/^X//" >'./example/tec.out.1' <<'END_OF_FILE'
  481. X000000000000000000000000000000000000222222221110000000000000000000000000
  482. X000000000000001111110000000000000001222111111100000000000000000000000000
  483. X000000000000011111111000000000000011211111111000000000000000000000000000
  484. X000000000001111111111111000000000111111111110000001110000000000000000000
  485. X000000000011111111111111100000000111111111100000011100000000000000000000
  486. X000000000011111111111111110000001111111111000000011110000000000000000000
  487. X000000000111111111111111111000011111111100000000111110000000000000000000
  488. X000000000111111111111111111100111111111000000001111110000000000000000000
  489. X000000000111111111111111111001111111110000000011111111000000000000000000
  490. X000000000111111111111111111111111111100000000111111111000000000000000000
  491. X000000000111111111111111111111111110000000011111111111000000000000000000
  492. X000000000111111111111111111111111100000000111111111111000000000000000000
  493. X000000000111111111112211111222110000000001111111111110000000000000000000
  494. X000000000111111111122222221111100000000011111221111111000000000000000000
  495. X000000000111111111122222111000000000001111122212221111100000000000000000
  496. X000000000011111111112222100000000000011112222212111111100000000000000000
  497. X000000000011111111111121000000000011111222222211111111110000000000000000
  498. X000000000011111111111010000000000111112222222211111111111000000000000000
  499. X000000000011111111100000000001111111222221112111111111111100000000000000
  500. X000000000011111111000000000112211222222211122111111111111111000000000000
  501. X000000000011111111000000001211111222221111111111111111111110000000000000
  502. X000000000000001110000000011111122222111111111111111111111110000000000000
  503. X000000000000000000000000111111222221111111111111111111100000000000000000
  504. X000000000000000000000001111212222111111111111101111111000000000000000000
  505. X000000000000000000000001222122221111111111111001111111000000000000000000
  506. X000000000000000000000001222222111111111111111101111110000000000000000000
  507. X000000000000000000000001222111111111111111111100110000000000000000000000
  508. X000000000000000000000001211111111111111111111000000000000000000000000000
  509. X000000000000000000000001111111111111111111111000000000000000000000000000
  510. X000000000000000000000000111111111111111111110000000000000000000000000000
  511. X000000000000000000000000111111111111111100000000000000000000000000000000
  512. X000000000000000000000000111111111111111000000000000000000000000000000000
  513. X000000000000000000000000011011111111100000000000000000000000000000000000
  514. X000000000000000000000000000011111111000000000000000000000000000000000000
  515. X000000000000000000000000000000110000000000000000000000000000000000000000
  516. X000000000000000000000000000000000000000000000000000000000000000000000000
  517. X000000000000000000000000000000000000000000000000000000000000000000000000
  518. X000000000000000000000000000000000000000000000000000000000000000000000000
  519. X000000000000000000000000000000000000000000000000000000000000000000000000
  520. X000000000000000000000000000000000000000000000000000000000000000000000000
  521. X000000000000000000000000000000000000000000000000000000000000000000000000
  522. X000000000000000000000000000000000000000000000000000000000000000000000000
  523. X000000000000000000000000000000000000000000000000000000000000000000000000
  524. X000000000000000000000000000000000000000000000000000000000000000000000000
  525. X000000000000000000000000000000000000000000000000000000000000000000000000
  526. X000000000000000000000000000000000000000000000000000000000000000000000000
  527. X000000000000000000000000000000000000000000000000000000000000000000000000
  528. X000000000000000000000000000000000000000000000000000000000000000000000000
  529. END_OF_FILE
  530.   if test 3504 -ne `wc -c <'./example/tec.out.1'`; then
  531.     echo shar: \"'./example/tec.out.1'\" unpacked with wrong size!
  532.   fi
  533.   # end of './example/tec.out.1'
  534. fi
  535. if test -f './example/tec.out.2' -a "${1}" != "-c" ; then 
  536.   echo shar: Will not clobber existing file \"'./example/tec.out.2'\"
  537. else
  538.   echo shar: Extracting \"'./example/tec.out.2'\" \(3504 characters\)
  539.   sed "s/^X//" >'./example/tec.out.2' <<'END_OF_FILE'
  540. X000000000000000000000000000000000000000000000000011111111111221000000000
  541. X000000000000000000000000000000000000000000000000001111111111222000000000
  542. X000000000000000000000000000011000000000000000000001111111111122100000000
  543. X000000000000000000000000011111110000000000000000000111111111111100000000
  544. X000000000000000000000000111111111100000000000000000111111111111100000000
  545. X000000000000000000000000011111111100000000000000000011111111111001100000
  546. X000000000000000000110000000011111100000000000000000011111111111011110000
  547. X000000000000000001110000000001111100000000000000000001111111211121111000
  548. X000000000000000001110110000000011110000000000000000001111111221121111000
  549. X000000000000000001111100000000000111000000000000000000111111221121111000
  550. X000000000000000001111110000000000111000001000000000000111111221121111000
  551. X000000000000000001111111110000000111000001000000000000011111221111111000
  552. X000000000000000001111111111000001111000001000000000000001111211112111000
  553. X000000000000000001211111111100011111000001000000000000001111221112111000
  554. X000000000000000001111111111110111111000001100000000000000111122112111000
  555. X000000000000000001111111111111111111000001110000000000000111122112111000
  556. X000000000000000001111111111111111111000001111000000000000011122112111000
  557. X000000000000000001111111111111111111000001111000000000000011112111210000
  558. X000000000000000000111111111111111111000001111100000000000001112211110000
  559. X000000000000000000111111111111111111000001111110000000000000112211110000
  560. X000000000000000000111111111111111111000001111110000000000000011221110000
  561. X000000000000000000111111111111111111000001111111000000000000001111100000
  562. X000000000000000000121111111111111111000001111111000000000000000111000000
  563. X000000000000000000011111111111111111000001111111000000000000000010000000
  564. X000000000000000000001111111111111111000001111111100000000000000000000000
  565. X000000000000000000000000121111111111000001111111110000000000000000000000
  566. X000000000000000000000000111111111110000001111111111000000000000000000000
  567. X000000000000000000000000121111111100000001111111111100000000000000000000
  568. X000000000000000000000000011111111000000011111111111110000000000000000000
  569. X000000000000000000000000001111111000000011111111111110000000000000000000
  570. X000000000000000011111100000111111000000011111111111111000000000000000000
  571. X000000000000000112222110000000011000000011111111111111000000000000000000
  572. X000000000001011222222210000000001000000011111111111111100000000000000000
  573. X000000000011112221112211000000000000000001111111111111110000000000000000
  574. X000000000012222111111121000000000000000001111111111111110000000000000000
  575. X000000000012211111111121110000000000000001111111111111100000000000000000
  576. X000000000011111111111112211111000000000001111111111111000000000000000000
  577. X000000000001111111111112222221110000000001111111111110000000000000000000
  578. X000000000011111111111112222222221100000000000000000000000000000000000000
  579. X000000000011111111112222222222222110000000000000000000000000000000000000
  580. X000000000011111111112222222222222210000000000000000000000000000000000000
  581. X000000000001111001111111111111111110000000000000000000000000000000000000
  582. X000000000000000000000000000000000000000000000000000000000000000000000000
  583. X000000000000000000000000000000000000000000000000000000000000000000000000
  584. X000000000000000000000000000000000000000000000000000000000000000000000000
  585. X000000000000000000000000000000000000000000000000000000000000000000000000
  586. X000000000000000000000000000000000000000000000000000000000000000000000000
  587. X000000000000000000000000000000000000000000000000000000000000000000000000
  588. END_OF_FILE
  589.   if test 3504 -ne `wc -c <'./example/tec.out.2'`; then
  590.     echo shar: \"'./example/tec.out.2'\" unpacked with wrong size!
  591.   fi
  592.   # end of './example/tec.out.2'
  593. fi
  594. if test -f './example/tec.out.3' -a "${1}" != "-c" ; then 
  595.   echo shar: Will not clobber existing file \"'./example/tec.out.3'\"
  596. else
  597.   echo shar: Extracting \"'./example/tec.out.3'\" \(3504 characters\)
  598.   sed "s/^X//" >'./example/tec.out.3' <<'END_OF_FILE'
  599. X000000000000000000000000000000000000000000000000000000000000000000000000
  600. X000000000000000000000000000000000000000000000000000000000000000000000000
  601. X000000000000000000000000000000000000000000000000000000000000000000000000
  602. X000000000000000000000000000000000000000000000000000000000000000000000000
  603. X000000000000000000000000000001110000000000000000000011000000000000000000
  604. X000000000000000000000000000001101111111111111111111111000000000000000000
  605. X000000000000000000000000000000001111111111111111111111000000000000000000
  606. X000000000000000000000011000000000111111111111111111111000000000000000000
  607. X000000000000000000000011100000000001111111111111111111110000000000000000
  608. X000000000000000000000011111100000000011111111111111111110000000000000000
  609. X000000000000000000000011111100000000000111111111111111100000000000000000
  610. X000000000000000000000011111110000000000011111111111111100000000000000000
  611. X000000000000000000000011111111110000000001111111111110111111110000000000
  612. X000000000000000000000011111111111000000001111111111101111111111000000000
  613. X000000000000000000000011111111111110000000111111000001111111111110000000
  614. X000000000000000000000011111111111111000000011110000011111111111110000000
  615. X000000000000000000000011111111111110000000111110000111111111111000000000
  616. X000000000000000000000011111111111111100001111110001111111111110000000000
  617. X000000000000000000000011111111111111110011111111111111111111110000000000
  618. X000000000000000000000001111111111111111111111111111111111111111100000000
  619. X000000000000000000000001111111111111111111111111111111111111111110000000
  620. X000000000000000000000001111111111111111111111111111111111111111110000000
  621. X000000000000000000000001111111112221111111111111111111111111111110000000
  622. X000000000000000000000001111111112221111111111111111111111000010000000000
  623. X000000000000000000000000111111112211111111111111111111110000000000000000
  624. X000000000000000000000000000011122111111111111111111111111000000000000000
  625. X000000000000000000000000000111121111111111111111111111111100000000000000
  626. X000000000000000000000000001111111111111011111111111111111100000000000000
  627. X000000000000000000000000011112111111110011111111111111111100000000000000
  628. X000000000000000111111111111122111111110011111111111111111000000000000000
  629. X000000000000000111111111111111111111110011111111111111110000000000000000
  630. X000000000000000111111112222111111111110011111111111111000000000000000000
  631. X000000000000000111111222211111111111110011111111111111100000000000000000
  632. X000000000000000111111221111111111111111001111111111111110000000000000000
  633. X000000000000000111111111111111111111111101111111111111100000000000000000
  634. X000000000000000111111111111111111111111101111111111111000000000000000000
  635. X000000000000000111111111111111111111111001111111111110000000000000000000
  636. X000000000000000111111111111000111111100001111101101100000000000000000000
  637. X000000000000000111111111000000000000000000000000000000000000000000000000
  638. X000000000000000001111110000000000000000000000000000000000000000000000000
  639. X000000000000000000111000000000000000000000000000000000000000000000000000
  640. X000000000000000000010000000000000000000000000000000000000000000000000000
  641. X000000000000000000000000000000000000000000000000000000000000000000000000
  642. X000000000000000000000000000000000000000000000000000000000000000000000000
  643. X000000000000000000000000000000000000000000000000000000000000000000000000
  644. X000000000000000000000000000000000000000000000000000000000000000000000000
  645. X000000000000000000000000000000000000000000000000000000000000000000000000
  646. X000000000000000000000000000000000000000000000000000000000000000000000000
  647. END_OF_FILE
  648.   if test 3504 -ne `wc -c <'./example/tec.out.3'`; then
  649.     echo shar: \"'./example/tec.out.3'\" unpacked with wrong size!
  650.   fi
  651.   # end of './example/tec.out.3'
  652. fi
  653. if test -f './src/clim.h' -a "${1}" != "-c" ; then 
  654.   echo shar: Will not clobber existing file \"'./src/clim.h'\"
  655. else
  656.   echo shar: Extracting \"'./src/clim.h'\" \(675 characters\)
  657.   sed "s/^X//" >'./src/clim.h' <<'END_OF_FILE'
  658. X#define MAXB       4
  659. X#define LINE_DIAG  1
  660. X#define LINE_CORN  2
  661. X#define LINE_0V    1
  662. X#define LINE_1V    2
  663. X#define LINE_0H    4
  664. X#define LINE_1H    8
  665. X#define N          LINE_0V
  666. X#define S          LINE_1V
  667. X#define E          LINE_0H
  668. X#define W          LINE_1H
  669. X#define PR_LOW     1
  670. X#define PR_HIGH    2
  671. X#define PR_HEQ     3
  672. X#define M_MAIN     0
  673. X#define M_HEAT     1
  674. X#define M_PRESS    2
  675. X#define M_WIND     3
  676. X#define M_RAIN     4
  677. X#define M_CLIM     5
  678. X#define C_OCEAN    0
  679. X#define C_BARELAND 1
  680. X#define C_MOUNTAIN 2
  681. X#define C_OCEANICE 3
  682. X#define C_TUNDRA   4
  683. X#define C_STEPPE   5
  684. X#define C_DESERT   6
  685. X#define C_SAVANA   7
  686. X#define C_DECID    8
  687. X#define C_JUNGLE   9
  688. X#define C_SWAMP   10
  689. END_OF_FILE
  690.   if test 675 -ne `wc -c <'./src/clim.h'`; then
  691.     echo shar: \"'./src/clim.h'\" unpacked with wrong size!
  692.   fi
  693.   # end of './src/clim.h'
  694. fi
  695. if test -f './src/climate.c' -a "${1}" != "-c" ; then 
  696.   echo shar: Will not clobber existing file \"'./src/climate.c'\"
  697. else
  698.   echo shar: Extracting \"'./src/climate.c'\" \(4025 characters\)
  699.   sed "s/^X//" >'./src/climate.c' <<'END_OF_FILE'
  700. X/* This program is Copyright (c) 1991 David Allen.  It may be freely
  701. X   distributed as long as you leave my name and copyright notice on it.
  702. X   I'd really like your comments and feedback; send e-mail to
  703. X   allen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore
  704. X   Avenue, Maynard, MA 01754. */
  705. X
  706. X/* This file contains the routines that compute local climate */
  707. X
  708. X#include "const.h"
  709. X#include "clim.h"
  710. X
  711. X
  712. X/* Input arrays are l from main.c, rn from rain.c, and t from heat.c.  Note
  713. X   that the unscaled temperatures are used.  The output array is cl.  Array
  714. X   lm (from main.c) is used by the drawing routine.*/
  715. X
  716. Xextern unsigned char l[MAXX][MAXY], lm[MAXX][MAXY], rn[MAXB][MAXX][MAXY];
  717. Xextern int tt[MAXB][MAXX][MAXY];
  718. Xunsigned char cl[MAXX][MAXY];
  719. X
  720. X
  721. X/* These parameters are defined in main.c or heat.c */
  722. Xextern int BSIZE, XSIZE, YSIZE, TEMPSCALE, PRINTMODE;
  723. X
  724. X/* These parameters are used here, and are described in params.doc */
  725. Xint tempcut[] = { 0, 40, 90, 120 }, raincut[] = { 40, 60, 110, 160, 180 };
  726. Xint PRINTCLIM = 0, MTDELTA = 20, TCSIZE = 4, RCSIZE = 5;
  727. Xdouble ICEBERGK = 263.0;
  728. X
  729. X
  730. X/* This array is the heart of the climate routine; temperature increases
  731. X   going down the array, and rainfall increases going from left to right. */
  732. X
  733. Xstatic unsigned char climkey[4][5] = {
  734. X   { C_TUNDRA, C_TUNDRA, C_TUNDRA, C_TUNDRA, C_TUNDRA },
  735. X   { C_STEPPE, C_STEPPE, C_DECID,  C_DECID,  C_DECID  },
  736. X   { C_DESERT, C_SAVANA, C_DECID,  C_JUNGLE, C_SWAMP  },
  737. X   { C_DESERT, C_SAVANA, C_JUNGLE, C_SWAMP,  C_SWAMP  } };
  738. X
  739. X
  740. Xclimpar (s) char *s; {
  741. X   /* This function is called by mainpar() in main.c; it simply tests input
  742. X   parameter names to see if they are defined in this file.  Each of the
  743. X   above ints are defined in this file.  If the input string matches here,
  744. X   the function returns true. */
  745. X   if      (CMP ("ICEBERGK"))    getdbl  (&ICEBERGK,        M_CLIM);
  746. X   else if (CMP ("PRINTCLIM"))   getlng  (&PRINTCLIM,       M_CLIM);
  747. X   else if (CMP ("TEMPCUT"))     getlvec (&TCSIZE, tempcut, M_CLIM);
  748. X   else if (CMP ("RAINCUT"))     getlvec (&RCSIZE, raincut, M_CLIM);
  749. X   else if (CMP ("MTDELTA"))     getlng  (&MTDELTA,         M_CLIM);
  750. X   else if (CMP ("PRINTCLIM"))   getlng  (&PRINTCLIM,       M_CLIM);
  751. X   else return (0);
  752. X   return (1); }
  753. X
  754. X
  755. Xclimdraw () { draw (DRAW_CLIM, LINE_CORN, cl, lm); }
  756. X   /* This routine calls draw with the proper arguments to display climate */
  757. X
  758. X
  759. Xclimcomp () {
  760. X   /* The outer loop looks at each square.  If it is ocean, the climate will
  761. X   be ocean unless the temperature is below ICEBREGK degrees all year round.
  762. X   If it is land, then the average rainfall and temperature (in Farenheit) are
  763. X   computed for the square.  If the square is mountain, it is colder; the
  764. X   temperature is decreased.  These two figures are then turned into array
  765. X   indices by using the tempcut and raincut parameter vectors.  The climate
  766. X   for the square is then simply a table lookup.  Finally, the array is printed
  767. X   if desired. */
  768. X
  769. X   register int i, j, buf;
  770. X   int noice, avetemp, averain, ttt, r;
  771. X
  772. X   usermessage ("Computing climate"); checkmouse ();
  773. X   for (j=0; j<YSIZE; j++) for (i=0; i<XSIZE; i++) {
  774. X      if (!l[i][j]) { /* ocean */
  775. X         for (noice=0, buf=0; buf<BSIZE; buf++)
  776. X            noice |= (tt[buf][i][j] > TEMPSCALE * ICEBERGK);
  777. X         cl[i][j] = noice ? C_OCEAN : C_OCEANICE; }
  778. X      else { /* land or mountain */
  779. X         for (averain=0, avetemp=0, buf=0; buf<BSIZE; buf++) {
  780. X            averain += rn[buf][i][j]; avetemp += tt[buf][i][j]; }
  781. X         averain /= BSIZE; avetemp /= BSIZE;
  782. X         avetemp = ((double) (avetemp / TEMPSCALE) - 273.0) * 1.8 + 32.0;
  783. X         if (l[i][j] == 2) avetemp -= MTDELTA;
  784. X         ttt = 0; while ((avetemp > tempcut[ttt]) && (ttt < TCSIZE-1)) ttt++;
  785. X         r  = 0; while ((averain > raincut[r])  && (r  < RCSIZE-1)) r++;
  786. X         cl[i][j] = climkey[ttt][r]; } }
  787. X   if (PRINTCLIM) {
  788. X      if (PRINTMODE == PRINTMODE_GREY)
  789. X         putmat ("CLIMATE", -1, PRINTMODE_CLIM, cl, lm);
  790. X      else putmat ("CLIMATE", -1, PRINTMODE_SHORT, cl, lm); } }
  791. END_OF_FILE
  792.   if test 4025 -ne `wc -c <'./src/climate.c'`; then
  793.     echo shar: \"'./src/climate.c'\" unpacked with wrong size!
  794.   fi
  795.   # end of './src/climate.c'
  796. fi
  797. if test -f './src/const.h' -a "${1}" != "-c" ; then 
  798.   echo shar: Will not clobber existing file \"'./src/const.h'\"
  799. else
  800.   echo shar: Extracting \"'./src/const.h'\" \(467 characters\)
  801.   sed "s/^X//" >'./src/const.h' <<'END_OF_FILE'
  802. X#define MAXX 100
  803. X#define MAXY 100
  804. X#define PRINTMODE_NONE  0
  805. X#define PRINTMODE_LONG  1
  806. X#define PRINTMODE_SCALE 2
  807. X#define PRINTMODE_SHORT 3
  808. X#define PRINTMODE_GREY  4
  809. X#define PRINTMODE_CLIM  5
  810. X#define DRAW_GREY  1
  811. X#define DRAW_LAND  2
  812. X#define DRAW_CLIM  3
  813. X#define DRAW_TEC   4
  814. X#define LINE_DIAG  1
  815. X#define LINE_CORN  2
  816. X#define LINE_NONE  3
  817. X
  818. X#define ABS(xx) ((xx < 0) ? -xx: xx)
  819. X#define CMP(x) !strcmp (s, x)
  820. X
  821. Xextern double cos(), sin(), sqrt(), atof(), asin(), atan2();
  822. END_OF_FILE
  823.   if test 467 -ne `wc -c <'./src/const.h'`; then
  824.     echo shar: \"'./src/const.h'\" unpacked with wrong size!
  825.   fi
  826.   # end of './src/const.h'
  827. fi
  828. if test -f './src/globe.c' -a "${1}" != "-c" ; then 
  829.   echo shar: Will not clobber existing file \"'./src/globe.c'\"
  830. else
  831.   echo shar: Extracting \"'./src/globe.c'\" \(3176 characters\)
  832.   sed "s/^X//" >'./src/globe.c' <<'END_OF_FILE'
  833. X/* This program is Copyright (c) 1991 David Allen.  It may be freely
  834. X   distributed as long as you leave my name and copyright notice on it.
  835. X   I'd really like your comments and feedback; send e-mail to
  836. X   allen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore
  837. X   Avenue, Maynard, MA 01754. */
  838. X
  839. X/* This file contains a spinning globe animation */
  840. X
  841. X#include "const.h"
  842. X#define N ((MAXX / 2) - 1)
  843. X#define AREA (MAXX * MAXX)
  844. X#define RADIUS 45
  845. X#define PI 3.14159
  846. X#define TWOPI (2.0 * PI)
  847. X#define HALFPI (PI / 2.0)
  848. X#define SET(n,x,y,i,j) m[n][(x)+N][(y)+N] = m[0][(i)+N][(j)+N]
  849. X
  850. Xunsigned char m[21][MAXX][MAXY];
  851. Xint rx[] = {0, 0, 0, 0, 0}, ry[] = {0, N, 0, N, 0};
  852. Xint xofs, prime, xflip, sflip, sxflip, change[1], step = 0;
  853. Xint MAXSTEP = 10000, PRINTMODE = PRINTMODE_SCALE, XSIZE = MAXX, YSIZE = MAXX;
  854. Xint ZCOAST = 0;
  855. X
  856. X
  857. Xinit (s) char *s; { int i;
  858. X   fileinit ();
  859. X   if (!s || !(*s)) panic ("no valid filename"); else getparams (s);
  860. X   for (i=1, xofs=45; i<6; xofs-=10, i++) {
  861. X      prime = 16-i; xflip = i+5;  sflip = 15+i; sxflip = 6-i; compute (); } }
  862. X
  863. X
  864. Xonestep () { static int i = 0;
  865. X   draw (DRAW_TEC, LINE_NONE, m[i], 0); i++; step++;
  866. X   if (i == 5) i = 6; if (i == 16) i = 17; if (i == 21) i = 1; }
  867. X
  868. X
  869. Xmainpar (s) char *s; { int vec [AREA], index = AREA; register int i, j, k;
  870. X
  871. X   if (CMP ("LAND")) {
  872. X      getlvec (&index, vec, 0);
  873. X      for (k=0, j=0; j<MAXX; j++) for (i=0; i<MAXX; i++, k++)
  874. X         m[0][i][j] = (vec[k] > 16) ? vec[k] : 16;
  875. X      return (1); }
  876. X   return (0); }
  877. X
  878. X
  879. Xcompute () {
  880. X   register int i, j, top; int x, y;
  881. X
  882. X   rx[0] = xofs + N; rx[4] = rx[0]; rx[2] = xofs - N;
  883. X   for (j=0; j<RADIUS; j++) {
  884. X      checkmouse ();
  885. X      top = sqrt ((double) (RADIUS * RADIUS - j * j + 0.5));
  886. X      for (i=1-top; i<top; i++) {
  887. X         point (i, j, &x, &y);
  888. X         SET (prime,   i,  j,  x,  y); SET (prime,   i, -j,  x, -y);
  889. X         SET (xflip,  -i,  j, -x,  y); SET (xflip,  -i, -j, -x, -y);
  890. X         permute (x, y, &x, &y);
  891. X         SET (sxflip,  i, -j, -x,  y); SET (sxflip,  i,  j, -x, -y);
  892. X         SET (sflip,  -i, -j,  x,  y); SET (sflip,  -i,  j,  x, -y); } } }
  893. X
  894. X
  895. Xpoint (x, y, i, j) int x, y, *i, *j; {
  896. X   double r, theta, topx, topy, botx, boty; int bot, top;
  897. X
  898. X   r = asin (sqrt ((double)(x * x + y * y)) / RADIUS) * 2.0 / PI;
  899. X   if (x || y) theta = atan2 ((double)y, (double)x);
  900. X   else theta = 0;
  901. X   if (theta <= 0) theta += TWOPI;
  902. X   bot = 0; while (theta > HALFPI) { bot++; theta -= HALFPI; }
  903. X   top = bot + 1; theta = theta / HALFPI;
  904. X   mapr (bot, r, &botx, &boty); mapr (top, r, &topx, &topy);
  905. X   *i = botx + theta * (topx - botx) + 0.5;
  906. X   *j = boty + theta * (topy - boty) + 0.5;
  907. X   if (*i >= N) *i = N-1; if (*j >= N) *j = N-1; }
  908. X
  909. X
  910. Xmapr (n, r, x, y) int n; double r, *x, *y; {
  911. X   *x = r * (rx[n] - xofs) + xofs;
  912. X   *y = r * ry[n];
  913. X   if (*x >= N) { *y = *x - N; *x = N; if (n == 4) *y = -(*y); } }
  914. X
  915. X
  916. Xpermute (x, y, i, j) int x, y, *i, *j; {
  917. X   if ((x >= 0) && (y >= 0)) { *i =  N - y - 1; *j =  x - N + 0; }
  918. X   if ((x <  0) && (y >= 0)) { *i =  y - N + 0; *j = -N - x - 1; }
  919. X   if ((x >= 0) && (y <  0)) { *i =  y + N + 0; *j =  N - x - 1; }
  920. X   if ((x <  0) && (y <  0)) { *i = -N - y - 1; *j =  x + N + 0; } }
  921. X
  922. X
  923. Xgreyscale (x) int x; { }
  924. END_OF_FILE
  925.   if test 3176 -ne `wc -c <'./src/globe.c'`; then
  926.     echo shar: \"'./src/globe.c'\" unpacked with wrong size!
  927.   fi
  928.   # end of './src/globe.c'
  929. fi
  930. if test -f './src/tec.h' -a "${1}" != "-c" ; then 
  931.   echo shar: Will not clobber existing file \"'./src/tec.h'\"
  932. else
  933.   echo shar: Extracting \"'./src/tec.h'\" \(531 characters\)
  934.   sed "s/^X//" >'./src/tec.h' <<'END_OF_FILE'
  935. X#define MAXSPLINTER 10
  936. X#define MAXFRAG 100
  937. X#define MAXPLATE 40
  938. X#define MAXCHANGE 10
  939. X#define REALSCALE 100
  940. X
  941. Xstruct plate { int dx, dy, odx, ody, rx, ry, age, area, id, next; };
  942. X
  943. Xextern int XSIZE,    YSIZE,        MAXSTEP;
  944. Xextern int MAXLIFE,    MAXBUMP,    BUMPTOL;
  945. Xextern int DRAWEVERY,    HYDROPCT,    PRINTMODE;
  946. Xextern int ZINIT,    ZSUBSUME,    ZCOAST;
  947. Xextern int ZSHELF,    ZMOUNTAIN,    ZERODE;
  948. Xextern int RIFTPCT,    DOERODE,    ERODERND;
  949. Xextern int MAXCTRTRY,    RIFTDIST,    BENDEVERY;
  950. Xextern int BENDBY,    SPEEDBASE,    SPEEDRNG;
  951. Xextern int UNDERSCAN;
  952. Xextern double MR[];
  953. END_OF_FILE
  954.   if test 531 -ne `wc -c <'./src/tec.h'`; then
  955.     echo shar: \"'./src/tec.h'\" unpacked with wrong size!
  956.   fi
  957.   # end of './src/tec.h'
  958. fi
  959. if test -f './src/unix.c' -a "${1}" != "-c" ; then 
  960.   echo shar: Will not clobber existing file \"'./src/unix.c'\"
  961. else
  962.   echo shar: Extracting \"'./src/unix.c'\" \(862 characters\)
  963.   sed "s/^X//" >'./src/unix.c' <<'END_OF_FILE'
  964. X/* This program is Copyright (c) 1991 David Allen.  It may be freely
  965. X   distributed as long as you leave my name and copyright notice on it.
  966. X   I'd really like your comments and feedback; send e-mail to
  967. X   allen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore Ave,
  968. X   Maynard, MA 01754. */
  969. X
  970. X#include "const.h"
  971. Xextern int XSIZE, YSIZE, MAXSTEP, step;
  972. Xint picktype;
  973. X
  974. Xmain (argc,argv) int argc; char **argv; {
  975. X   unsigned short seed16v[3];
  976. X
  977. X   /* Initialize random number generator */
  978. X   srand (time ((long *) 0));    /* initialize rand() */
  979. X   seed16v[0] = rand(); seed16v[1] = rand(); seed16v[2] = rand();
  980. X   seed48 (seed16v);    /* initialize lrand48() */
  981. X
  982. X   init (*++argv);
  983. X   for (step=0; step<MAXSTEP; step++) onestep();
  984. X   return (0); }
  985. X
  986. Xcheckmouse () { }
  987. Xpanic (s) char *s; { printf ("PANIC: %s\n", s); exit (1); }
  988. X
  989. Xdraw (ctype, ltype, cra, lra) { }
  990. END_OF_FILE
  991.   if test 862 -ne `wc -c <'./src/unix.c'`; then
  992.     echo shar: \"'./src/unix.c'\" unpacked with wrong size!
  993.   fi
  994.   # end of './src/unix.c'
  995. fi
  996. if test -f './src/wind.c' -a "${1}" != "-c" ; then 
  997.   echo shar: Will not clobber existing file \"'./src/wind.c'\"
  998. else
  999.   echo shar: Extracting \"'./src/wind.c'\" \(5268 characters\)
  1000.   sed "s/^X//" >'./src/wind.c' <<'END_OF_FILE'
  1001. X/* This program is Copyright (c) 1991 David Allen.  It may be freely
  1002. X   distributed as long as you leave my name and copyright notice on it.
  1003. X   I'd really like your comments and feedback; send e-mail to
  1004. X   allen@viewlogic.com, or send us-mail to David Allen, 10 O'Moore
  1005. X   Avenue, Maynard, MA 01754. */
  1006. X
  1007. X/* This file contains the wind computation routines. */
  1008. X
  1009. X#include "const.h"
  1010. X#include "clim.h"
  1011. X#define MAXPRESS 255
  1012. X
  1013. X/* Input arrays are pr, from pressure.c, and l, from main.c.  The array
  1014. X   hl is used as temporary storage for highs and lows, while p is used
  1015. X   to store the smoothed pressure map.  The output array, wd, contains
  1016. X   an edge map with wind directions. */
  1017. X
  1018. Xextern unsigned char pr[MAXB][MAXX][MAXY], l[MAXX][MAXY];
  1019. Xunsigned char wd[MAXB][MAXX][MAXY];
  1020. Xstatic char hl[2][MAXX][MAXY];
  1021. Xstatic unsigned char p[MAXX][MAXY];
  1022. X
  1023. X/* The externs below are parameters defined in main.c.  The other two ints
  1024. X   are parameters described in params.doc. */
  1025. X
  1026. Xextern int XSIZE, YSIZE, BSIZE, PRINTMODE;
  1027. Xint BARSEP = 16, PRINTWIND = 0;
  1028. X
  1029. X
  1030. Xwindpar (s) char *s; {
  1031. X   /* This function is called by mainpar() in main.c; it simply checks to
  1032. X   see if the parameter is defined in this file.  If so, it returns true. */
  1033. X   if (CMP ("BARSEP")) getlng (&BARSEP, M_WIND);
  1034. X   else if (CMP ("PRINTWIND")) getlng (&PRINTWIND, M_WIND);
  1035. X   else return (0);
  1036. X   return (1); }
  1037. X
  1038. X
  1039. Xwindcomp () {
  1040. X   /* This is the main function in this file; it calls getpress() to create
  1041. X   a smoothed pressure map, then getwind() to put isobars (wind lines) on
  1042. X   the output map.  The last step makes sure that contradictory winds are
  1043. X   removed, such as N and S winds in the same square. */
  1044. X
  1045. X   register int i, j, x, buf;
  1046. X
  1047. X   for (buf=0; buf<BSIZE; buf++) {
  1048. X      status (M_WIND, buf); getpress (buf); getwind (buf);
  1049. X      for (j=0; j<YSIZE; j++) for (i=0; i<XSIZE; i++) {
  1050. X         x = wd[buf][i][j];
  1051. X         if (x & N) x &= (~S); if (x & E) x &= (~W);
  1052. X         wd[buf][i][j] = x; } }
  1053. X
  1054. X   if (PRINTWIND) for (buf=0; buf<BSIZE; buf++) {
  1055. X      if (PRINTMODE == PRINTMODE_GREY) 
  1056. X         putmat ("WIND", buf, PRINTMODE_SHORT, l, wd[buf]);
  1057. X      else putmat ("WIND", buf, PRINTMODE_SHORT, wd[buf], 0); } }
  1058. X
  1059. X
  1060. Xwindraw (n) int n; { draw (DRAW_LAND, LINE_DIAG, l, wd[n]); }
  1061. X   /* This function calls draw with the right arguments to display wind */
  1062. X
  1063. X
  1064. Xgetpress (buf) int buf; {
  1065. X   /* This function takes the high and low markings from pressure.c and creates
  1066. X   a smoothed function.  Highs turn into MAXPRESS and lows turn into 0. */
  1067. X
  1068. X   register int i, j;
  1069. X
  1070. X   for (j=0; j<YSIZE; j++) for (i=0; i<XSIZE; i++) {
  1071. X      /* Zero out the arrays to be used */
  1072. X      wd[buf][i][j] = 0; hl[0][i][j] = 0; hl[1][i][j] = 0;
  1073. X
  1074. X      /* Fill hl[0] with the low pressure zones, and hl[1] with highs */
  1075. X      if      (pr[buf][i][j] == PR_LOW)  hl[0][i][j] = -1;
  1076. X      else if (pr[buf][i][j] == PR_HIGH) hl[1][i][j] = -1;
  1077. X      else if (pr[buf][i][j] == PR_HEQ)  hl[0][i][j] = -1; }
  1078. X
  1079. X   /* Set each square in hl[0] to the distance from that square to the */
  1080. X   /* nearest low, and each square in hl[1] to the distance to a high. */
  1081. X   range (hl[0]); range (hl[1]);
  1082. X
  1083. X   /* The final pressure, in array p, is zero if a low is there and */
  1084. X   /* MAXPRESS if a high is there.  Otherwise, the pressure in a square is */
  1085. X   /* proportional to the ratio of (distance from the square to the nearest */
  1086. X   /* low) to (total of distance from nearest high and nearest low).  This */
  1087. X   /* gives a smooth curve between the extremes. */
  1088. X   for (j=0; j<YSIZE; j++) for (i=0; i<XSIZE; i++) {
  1089. X      if (hl[1][i][j] == -1) p[i][j] = MAXPRESS;
  1090. X      else if (hl[0][i][j] == -1) p[i][j] = 0;
  1091. X      else p[i][j] = (MAXPRESS*hl[0][i][j]) / (hl[0][i][j] + hl[1][i][j]); } }
  1092. X
  1093. X
  1094. Xgetwind (buf) int buf; {
  1095. X   /* This function draws isobars around the pressure map created above.  These
  1096. X   isobars are the directions of wind flow.  The isobars are given a direction
  1097. X   depending on whether the square is above or below the heat equator; north of
  1098. X   the heat equator, the winds blow counterclockwise out from a low, while
  1099. X   south of it, the opposite is true. */
  1100. X
  1101. X   register int i, j; int a, b, e, bar;
  1102. X
  1103. X   /* Step from 0 to MAXPRESS by BARSEP; bar is the pressure for which this */
  1104. X   /* isobar will be drawn. */
  1105. X   for (bar=BARSEP; bar<=MAXPRESS; bar+=BARSEP) {
  1106. X      checkmouse ();
  1107. X      for (i=0; i<XSIZE; i++) for (e=0, j=0; j<YSIZE; j++) {
  1108. X
  1109. X         /* Set e if this square is south of the heat equator */
  1110. X         a = p[i][j]; if (pr[buf][i][j] == 3) e = 1;
  1111. X
  1112. X         /* Provided the square is not at the top of the array, compare the */
  1113. X         /* pressure here to the pressure one square up.  This gives the */
  1114. X         /* direction of the wind in terms of east / west flow. */
  1115. X         if (j) {
  1116. X            b = p[i][j-1];
  1117. X            if ((a < bar) && (b >= bar)) wd[buf][i][j] |= (e ? E : W);
  1118. X            if ((a >= bar) && (b < bar)) wd[buf][i][j] |= (e ? W : E); }
  1119. X
  1120. X         /* Compare the pressure here to the pressure one square to the left */
  1121. X         /* (including wraparound); this gives the wind direction in terms */
  1122. X         /* of north / south flow. */
  1123. X         b = i ? p[i-1][j] : p[XSIZE-1][j];
  1124. X         if ((a < bar) && (b >= bar)) wd[buf][i][j] |= (e ? N : S);
  1125. X         if ((a >= bar) && (b < bar)) wd[buf][i][j] |= (e ? S : N); } } }
  1126. END_OF_FILE
  1127.   if test 5268 -ne `wc -c <'./src/wind.c'`; then
  1128.     echo shar: \"'./src/wind.c'\" unpacked with wrong size!
  1129.   fi
  1130.   # end of './src/wind.c'
  1131. fi
  1132. echo shar: End of archive 4 \(of 4\).
  1133. cp /dev/null ark4isdone
  1134. MISSING=""
  1135. for I in 1 2 3 4 ; do
  1136.     if test ! -f ark${I}isdone ; then
  1137.     MISSING="${MISSING} ${I}"
  1138.     fi
  1139. done
  1140. if test "${MISSING}" = "" ; then
  1141.     echo You have unpacked all 4 archives.
  1142.     rm -f ark[1-9]isdone
  1143. else
  1144.     echo You still must unpack the following archives:
  1145.     echo "        " ${MISSING}
  1146. fi
  1147. exit 0
  1148. exit 0 # Just in case...
  1149. -- 
  1150. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1151. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1152. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1153. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1154.