home *** CD-ROM | disk | FTP | other *** search
/ Mega A/V / mega_av.zip / mega_av / DEMOS / FRACT386.ZIP / README < prev   
Text File  |  1988-11-06  |  21KB  |  371 lines

  1.  
  2.        ***   FRACT386 (Version 3.0)   ******   by Bert Tyler   ***
  3.  
  4.  
  5. This program generates Mandelbrot and Julia set fractal images using 32-bit
  6. integer arithmetic specific to the 386 microprocessor.   It will politely
  7. refuse to execute if it finds itself on any earlier Intel processors such
  8. as the 8086, 80186 or 80286.   The program will work with CGA, EGA, MCGA,
  9. VGA and many popular super-rez adapters, and can switch display modes
  10. on-the-fly for those adapters capable of multiple emulation.  For instance,
  11. I can run this program in any of nine IBM CGA/EGA/MCGA/VGA modes on my
  12. PS/2 model 80.   The program does not perform any floating point arithmetic
  13. in its image generation routines, and does not require an FPU.
  14.  
  15. To start the program, simply type its name (FRACT386) without any parameters.
  16. When the program fires up, it displays a startup screen explaining how it
  17. works, and then waits for you to hit a Function Key (F1, F2, etc) to select
  18. an initial video mode (see the table below for a partial list of supported
  19. adapters and video modes).   You can also hit the ENTER (Return) key to see
  20. a complete list of the video adapters and video modes currently supported
  21. by the program and the function keys you can hit to activate them.   As soon
  22. as you select a video mode, the program begins drawing an initial display
  23. of the full Mandelbrot set.   From this point on, and AT ANY TIME, you can
  24. hit any of the following keys to select a function:
  25.  
  26.  Key          Function
  27.  ===========  ===============================================================
  28.  
  29.  PageUp         Display and Shrink the Zoom Box ("Zoom In")
  30.  PageDown       Display and Expand the Zoom Box ("Zoom Out")
  31.  Cursor Keys    Display and Move the Zoom Box Left, Right, Up, or Down ("Pan")
  32.  Ctrl-Cursor-Keys   Pan like the normal Cursor-Keys, but (five times) faster
  33.                 (NOTE:  Fast-Panning works only with an Enhanced Keyboard BIOS)
  34.  End or Enter   Redraw the area inside the Zoom Box as a full-screen image
  35.                 (If there is no Zoom Box, just re-draw the current screen)
  36.  F1,F2,F3,F4... Select a new Video Mode and THEN perform a Screen Redraw
  37.                 Currently supported video modes include:
  38.                 F1 = 320x200 16-color EGA/VGA   F2 = 640x350 16-color EGA/VGA
  39.                 F3 = 320x200 256-color MCGA/VGA F4 = 640x480 16-color VGA
  40.                 F5 = 320x200 4-color CGA        F6 = 640x200 B&W CGA
  41.                 F7 = 640x350 B&W EGA/VGA        F8 = 640x480 B&W VGA
  42.                 F9 = 640x200 16-color EGA/VGA   ..etc...etc..
  43.                 (For a complete list, hit the ENTER key on the Startup Screen)
  44.  Home           Redraw the Previous Screen (the program tracks 100 screens)
  45.                 (this gives you the ability to "back out" screen-by-screen)
  46.  Tab            Display the Current Screen or Zoom-Box coordinates
  47.                 (this gives you the ability to track where you are and
  48.                 re-start the program at your current position later on)
  49.  Spacebar       Toggles between Mandelbrot images and their corresponding
  50.                 Julia set images (read the Julia set notes below before
  51.                 trying this option if you want to see anything interesting)
  52.  Insert         Restart the Program all over again at the Startup Screen
  53.                 (in case you forgot the instructions or need to see the
  54.                 Video Mode list again)
  55.  Delete or Esc  Stop the Program and Return to MSDOS
  56.  
  57. Remember, you do NOT have to wait for the program to finish generating the
  58. full screen display (a process that can take from 30 seconds in "Low-Rez" EGA
  59. or MCGA mode to several minutes in full VGA mode) before hitting one of the
  60. above keys.   If you hit a keyboard key while the program is generating a
  61. screen image, it will simply stop and process the key  (it will NOT finish
  62. the display, though). If, say, you see an interesting spot you want to zoom
  63. in on, don't wait --  do it!   If the program finishes a display before you
  64. hit any keys, it will simply beep and wait for you to hit one.
  65.  
  66. Hints:  The most interesting areas are the border areas where the colors are
  67. changing rapidly.   Zoom in on them for the best results.   The areas closer
  68. to the outside of the fractal "egg" tend to involve fewer iterations and
  69. display more quickly than those closer to the inside.  The solid blue
  70. interior is the slowest region of all to display -- in fact, it's where
  71. the program has hit its iteration maximum (150) and given up.
  72.  
  73. Another hint:  The time it takes to generate a fractal image is directly
  74. proportional to the resolution of the selected video mode (more dots = more
  75. calculations).   I always select a low-resolution mode (I use F3 for MCGA)
  76. on the startup screen, and at some later point hit a function key instead
  77. of the END key to switch to a higher resolution mode (I use F4 for VGA)
  78. when things get interesting.   That gets me into the interesting stuff in
  79. detailed resolution quickly -- I've seen that first screen too often to
  80. get excited about it.   Actually, with its 256 colors (the program is
  81. "only" using the first 150), MCGA mode can give you some pretty spectacular
  82. effects on its own.
  83.  
  84.  
  85.        ***** Toggling between Mandelbrot and Julia Sets *****
  86.  
  87.    With Version 3.0, FRACT386 can be toggled between Mandelbrot images and
  88. their corresponding Julia sets.   What is a Julia set?   I don't really know
  89. either, but I can describe how the program generates them.  Let's start with
  90. a diversionary tactic and describe how the program generates the Mandelbrot
  91. set.   The Mandelbrot set is generated by assuming that each pixel on the
  92. screen represents a point on the complex-number "C plane", (X + i*Y), and
  93. calculating the following function until the "size" of Z(n) is greater
  94. than 2 :
  95.  
  96. Start with a complex-number constant            C = xcoord + i * ycoord
  97. use as the initial value of Z                   Z(0) = 0
  98. and iterate using this function                 Z(n+1) = Z(n)**2 + C
  99.  
  100.    Julia sets use a slightly different tactic, picking out a specific point
  101. on the "C plane" and assuming that each pixel on the screen represents
  102. an initial point on the "Z plane".   Once everything has been started up,
  103. however, the calculations are the same:
  104.  
  105. Start with a USER-SPECIFIED value of C          C = Creal + i * Cimaginary
  106. use as the initial value of Z                   Z(0) = xcoord + i * ycoord
  107. and iterate using this function                 Z(n+1) = Z(n)**2 + C
  108.  
  109.  
  110.    In either case, the pixel's color is arbitrarily determined by the
  111. number of iterations it took the program to get Z "large" enough to
  112. bail out of the loop.
  113.  
  114.  
  115.    Generating Julia sets are different from generating Mandelbrot sets in
  116. several important ways:
  117.  
  118.    (1) There is only one Mandelbrot set but, given that there are an infinite
  119. number of values available for the complex-number C, there are an infinite
  120. number of Julia sets.
  121.  
  122.    (2) Although there are an infinite number of Julia sets, a lot of them
  123. are pretty boring.   Only certain ranges of C result in interesting
  124. Julia set displays - values too "small" generate a simple circular display,
  125. and values that are too "big" generate something that looks like scattered
  126. dust.
  127.  
  128.    (3) It turns out, however, that the coordinates of the most interesting
  129. portions of the Mandelbrot image, where the colors are changing rapidly,
  130. are the VERY SAME values that generate the most interesting Julia sets.
  131. (There is a very sound mathematical reason for this.   I haven't the 
  132. vaguest idea what it is, though.)
  133.  
  134.  
  135.    What FRACT386 does is begin with the full Mandelbrot set, give you the 
  136. capability to zoom and pan around generating interesting Mandelbrot images,
  137. and then AT ANY POINT hit the spacebar toggle to "flip" to a full Julia set
  138. with startup constant C set to the coordinates at the center of the Mandelbrot
  139. image that you last generated.   From that point, you are zooming and
  140. panning around in a Julia set "Z plane" (you can always hit the spacebar
  141. toggle again to get your Mandelbrot set back).   You can think of it this way:
  142. all those fantastic Mandelbrot images you have been generating are just
  143. a way to select an initial value for Julia sets you can play with!
  144. Holy infinity, Batman!
  145.  
  146.  
  147.   ******   Optional Parameters (re-generating your favorite images)  ******
  148.  
  149.  
  150.    FRACT386 accepts optional parameters which tell it to fire up at something
  151. other than the full Mandelbrot set.   The full FRACT386 command line is
  152. actually:
  153.  
  154.          FRACT386 [Creal Cimaginary] [ Xmin Xmax Ymin Ymax ]
  155.  
  156.    The first two parameters, if given, are floating point numbers that
  157. tell the program to fire up using a Julia set rather than the default
  158. Mandelbrot set, and to use the two values as the real and imaginary
  159. portions of the startup constant C.
  160.  
  161.    The final four parameters, if given, are floating point numbers that
  162. specify the X and Y coordinates of the corners of the screen that is
  163. initially displayed.
  164.  
  165.    These parameters are all the same values (in the same order) that display
  166. on the screen when you hit the TAB key after generating a fractal image.
  167. The optional parameters, in combination with the TAB key function, are
  168. designed to give you the capability to quickly re-generate interesting
  169. displays that you might want to see again (or show to somebody else), and
  170. the floating point notation is the one commonly used by other fractal
  171. programs, so you can compare pictures with your buddy's MAC-II. 
  172.  
  173.    The following examples are from screens that I have played with:
  174.  
  175.                        (Mandelbrot sets)
  176.  
  177.          FRACT386 -0.7389  -0.7364  0.2883   0.2907     
  178.          FRACT386 -0.7276  -0.7270  0.36204  0.36263    
  179.          FRACT386 -0.727322554 -0.727313176 0.362338984 0.362347448
  180.  
  181.                        (Julia sets)
  182.  
  183.          FRACT386 .385 .382 .1161 .1490 .5034 .5344
  184.          FRACT386 -.523 .688 -.08 .08 -.08 .08
  185.          FRACT386 -.480 .626 .258 .598 -.501 -.167
  186.          FRACT386 -.480 .626                    (generates a full Julia set)
  187.  
  188.  
  189.           *** Support for Third-Party Hi-Rez Video Adapters ***
  190.  
  191.    FRACT386 uses a Video Adapter Table in the "C" program to reference
  192. everything it needs to know about any particular adapter/mode combination.
  193. This table can contain information for up to fifty adapter/mode combinations,
  194. and is automatically tied to fifty Function Keys (F1-F10, their Control/
  195. Shift/Alt variants, and Alt-0 thru Alt-9) when the program is running.
  196. The table entries, and the function keys they are tied to, are displayed
  197. on your screen if you hit the ENTER key at FRACT386's startup screen.
  198. This table makes adding support for various third-party video cards and
  199. their high-rez modes much easier, at least for the ones that pretend to be
  200. a standard adapter with more dots and/or colors.   
  201.  
  202.    The assembler object code (FRASM386.OBJ) is included in the ARC files to
  203. make it easier for those of you that have a fancy video adapter and want to
  204. modify FRACT386 to support it.   You will at a minimum need a "C" compiler
  205. that supports "Medium" model object code (Microsoft or Borland will work)
  206. and enough information about your adapter to throw it into one of its unique
  207. modes via INT 10.
  208.  
  209.    [Chris Green didn't have a "C" compiler handy, so he modified the
  210. program's video adapter table using DEBUG when he was testing the Paradise
  211. adapter entries -- but that's an act of desperation.   It worked, though.
  212. And I don't run the .EXE file through EXEPACK anymore, so it's easier now.]
  213.  
  214.    The table as currently distributed begins with nine standard IBM video
  215. modes that have been exercised successfully with a PS/2 model 80.   These
  216. entries, coupled with the descriptive comments in the table definition
  217. and the knowledge you have about throwing your adapter into its unique modes,
  218. should be all you need to see to be able to add your own entries.
  219.  
  220.    UNTESTED (note the emphasis) support for a number of popular high-rez
  221. video adapters has been added to the table from an information sheet that
  222. shows up sporadically on USENET.   Because the information on the sheet is
  223. somewhat sparse, I was forced to use the BIOS method for reading/writing dots
  224. for each of these adapters.   Specs for the Everex EVGA board are courtesy
  225. of Tom Moran (tmoran on BIX).   Specs for the Video-7 board are courtesy of
  226. Ira Emus (irae on BIX).   I tried calling up each of the "major" video
  227. board manufacturers (defined as those paying for full-page ads in magazines
  228. like BYTE and PC) several times to get the specs for their boards, but
  229. never got through to any technical support people - unless they were the
  230. ones playing the MUSAK while I was on hold.   And boy, was I on hold.
  231.  
  232.    If you have a favorite adapter that you would like added to the standard
  233. releases of FRACT386, just give me the table entry that you added to get
  234. it working.   You will be credited in the comments which display with the
  235. initial list of adapters ("Courtesy of John Smith").   If you have a favorite
  236. adapter that you would like added, but don't have the equipment to add it
  237. yourself, just provide me with the following information:
  238.  
  239.       The name of the Adapter/Video mode combination
  240.       The resolution (pixels across, pixels down, number of colors)
  241.       How you get it into its special mode (hopefully it's a variant
  242.             of BIOS interrupt 10H, with AX/BX/CX/DX = some specific values)
  243.       How the assembler routine should access it in its write-a-dot
  244.             and read-a-dot routines.  Current options are:
  245.                   1) use the BIOS (INT 10H, AH=12/13, AL=color) ((SLOW))
  246.                   2) pretend it's a super-res EGA/VGA
  247.                   3) pretend it's a super-res MCGA
  248.             (If you're not sure, have me use the BIOS or get me a programmer's
  249.             manual.  Note that using the BIOS to read/write dots can make it
  250.             tough to keep up with the keyboard during zoom/pan box operations)
  251.  
  252. I will add the adapter to my list, with a status of "UNTESTED:  may not work",
  253. and will change the status to "Tested OK by John Smith" on future releases of
  254. FRACT386 after getting confirmation from you or someone else that it works.
  255. Which brings up another point:   If you can confirm that a particular video
  256. adapter/mode works (or that it doesn't), and the program says it is UNTESTED,
  257. please get that information to me.   Thanks.
  258.  
  259.  
  260.                   ***** Limitations and Uglies *****
  261.  
  262. This program uses 32-bit integer math to generate fractals quickly (I do not
  263. have an FPU, and "normal" fractal packages take hours to draw on my machine).
  264. The advantage of this option is speed:  quite simply, this is by far the
  265. fastest fractal package that I have ever seen on a 386-class machine.   The
  266. disadvantage, aside from the fact that it cannot run on 80286-and-below
  267. processors, is accuracy.   To keep as much accuracy as possible, the program
  268. represents numbers like 1.00 as 32-bit integers of the form [1.00 * (2**29)]
  269. (approximately 500,000,000).   This yields over 8 significant digits of
  270. accuracy, and works just great -- until the initial values of the fractal
  271. calculations on consecutive pixels differ only in the ninth decimal place.
  272. At that point, the program does the best it can do -- it switches to its
  273. minimal drawing mode, with consecutive pixels in both directions having
  274. initial values differing by 1 (really 0.000000002) and disables zooming
  275. and panning.   This happens more often than you might think, only because
  276. it's so easy (and fascinating) to zoom in on a tiny piece of the previous
  277. screen -- and you can force this situation with your seventh consecutive
  278. "maximum zoom", each of which zooms in on about 1% of the previous screen.
  279. If it's any consolation, remember that this situation occurs when you are
  280. attempting to draw an area over your full screen that is approximately
  281. 1/(10**13)th [~0.0000000000001] of the area of the full Mandelbrot set ***
  282. -- and you can always hit the "Home" key to get the previous screen(s) back.
  283.  
  284. ***  Or, you can think of it this way:   First, draw the full Mandelbrot set
  285.      in full VGA mode.   Then zoom in on an area represented by a SINGLE
  286.      PIXEL (which you can't do with the current program) and re-draw it as
  287.      a full-screen image.   Then zoom in on an area represented by a single
  288.      pixel of THAT screen and re-draw IT as a full-screen image.   Your
  289.      screen is now displaying an area representing ((1/(640*480))**2)th
  290.      [~0.00000000001] of the area of the area of the full Mandelbrot set -
  291.      not yet in minimal drawing mode.   Try it a THIRD time, though, and
  292.      you'll reach it - but not if you can contain yourself and zoom in on
  293.      an area no smaller than 1/100th of the third screen.
  294.  
  295. Also, this being a public domain program and being true to that spirit, the
  296. program makes no attempt to verify that your video adapter can run in the
  297. mode you specify, or even that it's really there, before writing to it.
  298. It also assumes that every EGA adapter has a full 256K of memory (and can
  299. therefore display sixteen simultaneous colors in 640x350 resolution), but
  300. does nothing in particular to verify that fact before throwing pixels at it.
  301.  
  302.  
  303.                            *** Background ***
  304.  
  305.    This program started out as a modification of the Mandelbrot set program
  306. distributed (on BIX) by Doug Klein as DKMANDEL.ARC.   I have also downloaded
  307. and read the excellent description on Fractal calculations that is part of
  308. Tron Hvaring's FRACT12.ARC program (also on BIX).   I kept adding this and
  309. replacing that to Doug's code, until one day I looked around and couldn't
  310. find any of his code lying around anymore, so I guess it's now an original
  311. program...
  312.  
  313.    I have a PS/2 model 80 without an FPU, and all the Mandelbrot programs
  314. I could find on BIX ran slow as molasses using FPU emulation, so I
  315. modified Doug's code to use 386-specific arithmetic along with a few other
  316. tricks to speed thing up.   If I say so myself, I think this version sets
  317. new speed records.   Clock the basic mandelbrot set (map 26, 150 iterations -
  318. that's the first screen the program draws) in MCGA mode on a 16MHZ PS/2
  319. model 80 without an FPU in 26 seconds, or in full VGA mode in 125 seconds!
  320.  
  321.    I would like to be able to claim that re-writing what is traditionally
  322. Floating Point arithmetic as scaled 32-bit integer arithmetic was my idea,
  323. but the truth is that I first saw it done by Dave Warker of HDS about a 
  324. year ago when he wrote a Mandelbrot generator for a TI34010-based video
  325. display that HDS was going to throw into a graphics terminal.   When I
  326. got the idea to do the same thing on a PS/2 model 80, I first called Dave to
  327. find out how he accomplished it.   I may not be very creative, but I know
  328. good code when I steal--uh--see it.
  329.  
  330.    (No, Dave doesn't mind -- in fact, he was one of the guys responsible
  331. for getting me the Scientific American articles on Julia sets and then egging
  332. me on to adding them to FRACT386.   The TAB key display was also added
  333. at his request so that, in his words, "someone could compare screens with,
  334. say, something on his MAC II".   Dave uses a MAC-II as his "home" computer.)
  335.  
  336.    After I got it running real fast and started showing it around to
  337. everybody (see that!  that's mine!  WOW, that's fast!) I discovered that
  338. nobody was particularly interested in playing with it, primarily because
  339. the original user interface was less than spectacular (re-read the examples
  340. that use four or more floating-point numbers to start FRACT386 on a particular
  341. piece of the fractal plane -- then picture that as the ONLY way to select an
  342. area to draw).   That's when I added the zoom-and-pan interface. It has passed
  343. a pretty robust ease-of-use test -- my seven year old likes to play with it.
  344. She wants me to modify it to work with a mouse, though (sigh).
  345.  
  346.  
  347.    This code was compiled using Microsoft C (version 5.1) and Microsoft
  348. Assembler (also version 5.1).   Note that the assembler code uses the
  349. "C" model option added to version 5.1 (just because I thought it was neat),
  350. and must be assembled with the /MX switch to link with the "C" code.
  351. The "C" code is pretty simple (and simple-minded).   The assembler code,
  352. however, is tweaked to the hilt for performance reasons.
  353.  
  354.  
  355.  
  356.              *** Distribution and Contribution Policies ***
  357.  
  358.    This is public domain software.   There is no warranty or acceptance
  359. of liability either expressed or implied with it.   Use it, modify it,
  360. distribute it as you wish.   Your uploading it to other bulletin boards and
  361. the like is specifically encouraged.
  362.  
  363. Contribution policy:    Don't want money.   Got money.   Want admiration.
  364.  
  365.  
  366.             Bert Tyler                    btyler on BIX
  367.             Tyler Software                [73477,433] on Compuserve
  368.             124 Wooded Lane
  369.             Villanova, Pa  19085
  370.             (215) 525-6355
  371.