home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk12 / linefrac / readme < prev    next >
Encoding:
Text File  |  1989-11-20  |  13.2 KB  |  392 lines

  1. Comments about LINEFRAC
  2.  
  3.  
  4. Notes:
  5. ------
  6.  
  7. You must run "make opendlg" and include the ..\dll directory in your
  8. libpath before attempting to make or execute this application.
  9.  
  10. Two of the modules generate the following warning when they compile:
  11.     warning C4058: address of frame variable taken, DS != SS
  12. This is the result of a fairly obscure compiler warning message bug,
  13. which will be fixed in a future release.  The emitted code is correct.
  14.  
  15.  
  16.  
  17. General Description:
  18. --------------------
  19.  
  20. This program draws self-similar fractals defined by transformations
  21. of the unit interval.  By recursively applying the transformation,
  22. neat drawings result.
  23.  
  24. Currently you can only choose the built-in transforms.    Click on one
  25. to get that fractal at the current level of recursion.    Choose level
  26. one (from the miscellaneous attributes dialog box), and one side to the
  27. frame polygon (same dialog box), to see the transformation itself.
  28. Some fractals are shown graphically in the menu.
  29.  
  30. Clicking on the left mouse button causes the fractal to go deeper
  31. into recursion, while clicking on the right causes it to come back
  32. out.
  33.  
  34. In the misc. attributes dialog box you can specify "# sides of polygon",
  35. which is the number of initial segments to which your transform
  36. will be applied.  You always get a regular polygon of the number
  37. of sides you choose.
  38.  
  39. With the current limited set of transforms, you can still get some
  40. interesting effects by drawing a new fractal on top of old ones
  41. with varying attributes.  You can also draw several independent
  42. fractals and automatically switch between them, simulating animation.
  43.  
  44. Note that at recursion level n, an m-segment transform will be
  45.           n
  46. composed of  m     line segments.  Keep this in mind when playing with
  47. the 5-segment transforms, namely StovePipe and SquareWave.
  48.  
  49. The names are, except for Koch (mathematician who proved, I think,
  50. that the Koch curve has infinite arc length when the level of recursion
  51. goes to infinity), weak attempts to describe the basic shape.  The
  52. Fractal menu uses pictures, anyway.
  53.  
  54.  
  55. Description of commands:
  56. ------------------------
  57.  
  58. File
  59.  
  60.     Load ...
  61.     Load a bitmap from a BMP file. The top thread must have a
  62.     memory DC.
  63.     (Currently requires AutoResize option to be enabled).
  64.     Save ...
  65.     Save bitmap to a BMP file.  The top thread must have a memory DC.
  66.     About ...
  67.     Show the credits.
  68.  
  69.  
  70. Edit
  71.  
  72.     Select
  73.     Drag a rectangle (from lower left to upper right) to highlight
  74.     it for cutting or copying.  If you don't like what you selected,
  75.     then do it again.  Nothing's permanent until you choose cut or
  76.     copy.  Hitting the space bar will throw away the selection
  77.     rectangle.
  78.  
  79.     Cut
  80.     Copy the selected rectangle of bits into the "clipboard", and
  81.     fill with the current background color.
  82.  
  83.     Copy
  84.     Copy the selected rectangle of bits into the "clipboard".
  85.  
  86.     Paste
  87.     Copy the cut or copied bits back into the bitmap with the current
  88.     rop.  The selected rectangle is highlighted in its original
  89.     location.  Grab somewhere in the window (in the highlighted
  90.     rectangle is suggested) and move it to the desired location.
  91.  
  92.     Use Clipboard
  93.     Not implemented yet.  This will instruct linefrac to use the
  94.     shell's clipboard feature for saving bits, rather than an
  95.     internal second bitmap.
  96.  
  97.     ----------------------------------------------------------------
  98.  
  99.     Paste w/ S
  100.          DSa
  101.          DSo
  102.          DSx
  103.          Sn
  104.          DSan
  105.          DSon
  106.          DSxn
  107.  
  108.     Various rops for use when pasting bits back into the bitmap.
  109.  
  110.  
  111. Thread
  112.  
  113.     New
  114.     Direct
  115.         Creates a new thread which draws directly to the screen.
  116.         The WM_PAINT message does nothing for this thread.    To
  117.         see the image after the bits have been destroyed, you
  118.         have to cause a redraw (try Control Redraw).  Only one
  119.         thread may have a direct DC (temporary restriction).
  120.     Memory ...
  121.         Creates a new thread which draws into a bitmap.  If
  122.         thread inheritance is enabled (see below) the bitmap
  123.         parameters are taken from the top thread.  Otherwise a
  124.         dialog box appears with the bitmap parameters set to the
  125.         window dimensions with 0 planes and 0 bits per pixel (the
  126.         latter two cause the device to select its favored format).
  127.         The user can alter any of these values as desired.    When the
  128.         dialog box is closed, a bitmap is created and a thread
  129.         is created to draw into it.
  130.     PostScript
  131.         not implemented yet
  132.     ProPrinter
  133.         not implemented yet
  134.  
  135.     Bring to top
  136.     Select the number of the thread to bring to the foreground.
  137.     To switch between threads quickly via the keyboard, type a
  138.     digit between 0 and 9.    The thread started at that position
  139.     in the overall order will be brought to the front, e.g. its
  140.     bitmap will be visible, in the case of a memory DC thread.
  141.     For a direct DC thread, nothing will happen to the image
  142.     until a redraw is caused.
  143.  
  144.     Edit DC Parameters ...
  145.     View or edit the bitmap extents and color format.
  146.  
  147.     Kill top thread
  148.     Kills the top thread.  Brings the next lower (lesser id)
  149.     thread to the top.  If there's only one thread,  a new
  150.     thread is created with the program defaults.
  151.  
  152.     Kill all threads
  153.     Kills all the threads and leaves the program with one thread
  154.     with the program defaults.
  155.  
  156.     ----------------------------------------------------------------
  157.  
  158.     Automatic cyclic switch
  159.     "Animates" by automatically switching between each thread in
  160.     turn.  The delay between switches is set by the next command.
  161.  
  162.     Switch delay ...
  163.     Set the delay in microseconds between switches between threads.
  164.  
  165.     Update menus on thread switch
  166.     This controls the checking or unchecking of the various menu
  167.     items that vary per thread.  If disabled, there is less overhead
  168.     in a thread-switch, therefore a faster possible switch time.
  169.  
  170.     ----------------------------------------------------------------
  171.  
  172.     New thread inherits from top
  173.     If enabled, new threads will be copies of the thread which
  174.     was on top when the new thread was started.  If disabled,
  175.     the program will select default values for all thread variables.
  176.  
  177.  
  178. Control
  179.  
  180.     Redraw
  181.     Forces the fractal to be redrawn.
  182.  
  183.     Abort drawing
  184.     Causes drawing of current fractal, if any, to cease.
  185.  
  186.     Clear surface
  187.     Clear the drawing surface to the background color.
  188.  
  189.     Copy bitmap to screen.
  190.     Copies the entire bitmap to the screen.  Does nothing for
  191.     a direct DC.
  192.  
  193.     Square up window
  194.     Force the window to be nearly square for aspect ratio-corrected
  195.     drawing.
  196.  
  197.     Resize surface to window
  198.     Resizes the drawing surface to the window dimensions.
  199.  
  200.     ----------------------------------------------------------------
  201.  
  202.     Mouse click changes recursion
  203.     If enabled, clicking in the client area changes the level of
  204.     recursion:  left button --> go deeper (higher level);
  205.            right button --> go shallower (lower level)
  206.  
  207.     Animate mouse pointer
  208.     This causes the mouse pointer to change shape as it is moved.
  209.     It represents the koch curve going from recursive level 0 to 3
  210.     and back to 0 again repeatedly.
  211.  
  212.     Mouse pointer preferences ...
  213.     Let's you select the pointer shape to use when the pointer is
  214.     not animated.  Let's you determine the speed of animation by
  215.     setting the number of WM_MOUSEMOVE messages tallied before
  216.     switching pointer shapes.
  217.  
  218.     Cyclic redraw timer delay ...
  219.     Sets the delay in microseconds between automatic redraws.  Note
  220.     that the timer proceeds independently of the drawing.  A long
  221.     fractal will probably end up redrawing immediately, since its
  222.     semaphore will have been cleared before the current drawing is
  223.     finished, that is unless the delay is corresponding long.
  224.  
  225.  
  226. Fractal
  227.  
  228.     SharkTooth        (2 segments)
  229.     SawTooth        (3 segments)
  230.     Koch        (4 segments)
  231.     StovePipe        (5 segments)
  232.     SquareWave        (5 segments)
  233.  
  234.     Space filling curve (4 segments) (reflections on first and fourth segs)
  235.     (Note: the space filling curve was originally intended to be drawn
  236.            with the custom primitive "Peano curvelet").
  237.  
  238.     Hourglass        (3 segments, crosses itself)
  239.  
  240.     Click on one of these to select a similarity transform for your
  241.     fractal.
  242.  
  243.     ----------------------------------------------------------------
  244.  
  245.     Redraw after change
  246.     If enabled, causes an automatic redraw to occur after any
  247.     selection on this menu.
  248.  
  249.  
  250. Primitive
  251.  
  252.     PolyLine
  253.     PolyFillet
  254.     PolySpline
  255.     PolyMarker
  256.     Peano curvelet
  257.  
  258.     These determine the primitive used to display the points
  259.     accumulated during recursion on the fractal.
  260.  
  261.     The Peano curvelet is a "custom primitive".  It draws two lines
  262.     between each point instead of one.  The lines meet at a right
  263.     angle.    If the straight line between the two points is x major
  264.     (the difference in x is greater than the difference in y),
  265.     then the new middle point is on the left side, otherwise it's
  266.     on the right side.  In other words,
  267.  
  268.  
  269.           *      *   *
  270.          * *       * *        ^  *      |    *
  271.         *   *        *        |    *     |   *
  272.                     |     *    |  *
  273.         ---->      <----     |    *     |   *
  274.                     |  *      V    *
  275.  
  276.     With this primitive, the existing algorithm and data structures
  277.     can be used to draw the Peano space-filling curve.  Note that
  278.     the directions of these arrows are relative to the canonical
  279.     unit line segment in world coordinate space on which the
  280.     fractal is really drawn.  If the fractal is rotated (to put
  281.     it on the side of a polygon, for instance), the arrows all
  282.     rotate accordingly.
  283.  
  284.     ----------------------------------------------------------------
  285.  
  286.     Redraw after change
  287.     If enabled, causes an automatic redraw to occur after any
  288.     selection on this menu.
  289.  
  290.  
  291. Attributes
  292.  
  293.     Line attributes ...
  294.     Marker attributes ...
  295.     Area attributes ...
  296.     Image attributes ...
  297.     Set the various attributes.
  298.  
  299.     Miscellaneous attributes ...
  300.     Calls up a dialog box in which you can select the following
  301.     values:
  302.  
  303.         # sides to initial polygon
  304.  
  305.         number of points sent to GpiPolyLine at a time
  306.  
  307.         level of recursion at which to draw
  308.  
  309.         angle of rotation (radians, CCW positive) applied to initial
  310.         segments of fractal
  311.  
  312.     Fractal dimensions ...
  313.     x offset and scale, as a percentage of the width of the window
  314.     same for y, too;  the offsets determine where in the window
  315.     the fractal occurs, whereas the scale factors determine
  316.     roughly how big the image is
  317.  
  318.  
  319.     Drag fractal dimensions
  320.     Lets user drag a rectangle in the client window to determine
  321.     the approximate bounding box of the next fractal.  "Approximate"
  322.     because fractals might flow out of the box given enough depth
  323.     of recursion.  This call alters the values of the scale factors
  324.     and offsets.  The fractal attributes dialog box will show the
  325.     new values the next time it is called up.
  326.  
  327.     ----------------------------------------------------------------
  328.  
  329.     Redraw after change
  330.     If enabled, causes an automatic redraw to occur after any
  331.     selection on this menu.
  332.  
  333.  
  334. Environment
  335.  
  336.     AutoResize bitmap
  337.     If checked, the bitmap will be resized every time you change
  338.     the window size (even if you iconize).
  339.  
  340.     If not checked, the bitmap will stay the same size and won't
  341.     be redrawn when the window size changes.
  342.  
  343.     When the window is resized, each thread will react according to
  344.     this flag.
  345.  
  346.     AutoSelect fractal dimensions
  347.     If this is checked, the default x,y offsets and scale factors
  348.     will be used as soon as the transform is selected.  This positions
  349.     the fractal so as to center it in the window, with room to grow
  350.     so that it won't be clipped as the level of recursion increases.
  351.     Note that the space filling curve grows up, not sideways, so it
  352.     is not centered like the others.
  353.  
  354.     Clear surface on redraw
  355.     If enabled, the surface will be filled with the current area
  356.     attributes on the next redraw.
  357.  
  358.     Automatic cyclic redraw
  359.     Sets a timer which after a random delay causes a redraw.
  360.     The upper and lower limits on the random delay are set with
  361.     the "Control Timer delay ..." command.
  362.  
  363.     Collect bounds on fractals
  364.     When this is checked, the minimal rectangle of bits will be
  365.     copied to the screen after a fractal is drawn into the bitmap.
  366.     This speeds up the drawing slightly, and the mouse pointer won't
  367.     flash unless it's right on top of where the drawing is happening.
  368.  
  369.  
  370.  
  371.  
  372. Bugs to fix:
  373. ------------
  374.     sometimes the animation timer seems to stop -- moving the mouse over
  375.        the window is enough to get it started again
  376.     occasionally the redraw seems to not work -- selecting it again
  377.        works though
  378.     occasionally a fractal is not drawn to completion
  379.     parts of the window sometimes get erased with the WM_ERASEBACKGROUND
  380.        message, but don't get updated by WM_PAINT. Why?  Should
  381.        LfEraseBackground invalidate what it paints for the benefit
  382.        of LfPaint?
  383.     sometimes the upper left of a fractal is displayed in the window
  384.        instead of the lower left, depending on the window dimensions
  385.        (I saw this with a bitmap much larger than the screen) --
  386.        slowly resizing the window reveals a point at which the switch
  387.        occurs
  388.     the "cancel" buttons don't work as expected on various dialog
  389.        boxes -- looking at attributes can cause the fractal to redraw
  390.        even though nothing changes;  cancelling the new thread dialog
  391.        box doesn't stop it from being created
  392.