home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2002 March / PCWMAR02.iso / software / turbocad / V4 / tcw.z / Fern.bas < prev    next >
BASIC Source File  |  1997-10-28  |  9KB  |  392 lines

  1. 'Adaptation of the Fern Fractal Generator that uses functions from the TurboCAD scripting API to construct a new graphic object 
  2. '
  3. '
  4. '******************************************************************
  5. '                                                                                     
  6. '                      TurboCAD for Windows                      
  7. '                   Copyright (c) 1993 - 1996                          
  8. '             International Microcomputer Software, Inc.      
  9. '                            (IMSI)                                                
  10. '                      All rights reserved.                                  
  11. '                                                                                    
  12. '******************************************************************
  13. '
  14. ' Filename: FERN.BAS
  15. '
  16. ' Author:    Pat Garner, Natalia Karaseva (updated to version 4.0 interface)
  17. '
  18. ' Date:        1/13/97, 09/30/97
  19. '
  20. ' Scriptname:    Fractal Fern Generator
  21. '
  22. ' Description:    Adaptation of the Fern Fractal Generator
  23. '                 that uses functions from the TurboCAD 
  24. '                 scripting API to construct a new graphic
  25. '                 object 
  26. '
  27. '
  28. ' New to version 2.3:    Add property loops from ATS script
  29. '                         series to be used immediately to
  30. '                         test the TCWGraphicPropertyGet/Set
  31. '                         API functions scripting functions.
  32. '                        
  33. '                        The long term goal would be to hook
  34. '                         the functions into a property 
  35. '                         page/wizard dialog to give the 
  36. '                         user more depth of control on how
  37. '                         the graphic is created.  
  38. '
  39. '                        To take this a step further, the script 
  40. '                         could check to see if a selected graphic
  41. '                         is a fern graphic.  If so, the script
  42. '                         could bring up it's 'property page' 
  43. '                         dialog and allow the user to modify it's
  44. '                         attributes ala smart shape action. 
  45. '
  46. '                                                -pg 2/7/97
  47. '
  48. '        
  49. '
  50. '
  51. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  52.  
  53.  
  54.   
  55.  
  56.  
  57. ''SCRIPT VARIABLES'''''''''''''''''''''''''''''''''''''''''''''''''
  58. '
  59. ' - Script Constants
  60. '
  61. Global Const MAX_POINTS = 100000        ' * Total number of points to be created
  62. Global Const MY_TRUE = 1                ' * For use with TCWPenDown
  63. Global Const MY_FALSE = 0                ' * For use with TCWPenDown
  64. Global Const GK_GRAPHIC = &H0B            ' * TurboCAD graphic type 
  65. Global Const METHOD = 0                    ' * Method used to generate the fern graphic
  66. '
  67. '
  68. ' - Error Reporting Constants
  69. '
  70. '
  71. ' - Arrays to hold the x/y values generated 
  72. '    by the fern fractal algorthm.  
  73. '
  74. dim Xarray(MAX_POINTS) as double
  75. dim Yarray(MAX_POINTS) as double
  76. dim numPoints As Long
  77. '
  78. '
  79. ' - Script effects variables
  80. '
  81. dim smear_eff    as integer
  82. dim smear_val    as double
  83. dim measure        as double
  84.  
  85. '
  86. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  87.  
  88.  
  89.  
  90.  
  91.  
  92. ''SUBROUTINE: MAIN'''''''''''''''''''''''''''''''''''''''''''''''''
  93. '
  94. ' * Parameters: None
  95. ' *
  96. ' * Return Value: None
  97. ' * 
  98. ' * Description:    
  99. ' * 
  100. ' *        Main is the conductor of the program
  101. ' *         and like a music conductor, tells
  102. ' *         the other parts of the program when
  103. ' *         it's time to do their thing.
  104. ' * 
  105. ' * 
  106. Sub main ()
  107.  
  108.     InitializeScript
  109. measure = Abs(TCWViewExtentsGetY2() - TCWViewExtentsGetY1())/8.5    
  110.     DoFernUI
  111.  
  112.     LoadVertexCoordinateArray
  113.     GenerateFernGraphic
  114.  
  115. 'MsgBox "Finished"
  116. End Sub
  117. '
  118. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  119.  
  120.  
  121.  
  122.  
  123.  
  124. ''SUBROUTINE: InitializeScript'''''''''''''''''''''''''''''''''''''
  125. '
  126. ' * Parameters: None
  127. ' *
  128. ' * Return Value: None
  129. ' * 
  130. ' * Description:    
  131. ' * 
  132. ' *        Script Setup Stuff
  133. ' *
  134. ' * 
  135. Sub InitializeScript ()
  136.  
  137.     smear_eff = 0
  138.     smear_val = 0
  139.  
  140.     TCWClearError    ' * Clear any error out of the error buffer.
  141.  
  142.     ' * ADD YOUR CODE HERE *
  143.  
  144. End Sub
  145. '
  146. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  147.  
  148.  
  149.  
  150.  
  151.  
  152. ''SUBROUTINE: LoadVertexCoordinateArray''''''''''''''''''''''''''''
  153. '
  154. ' * Parameters: None
  155. ' * 
  156. ' * Return Value: None
  157. ' * 
  158. ' * Description:    
  159. ' * 
  160. ' *        This subroutine uses a fern fractal algorithm
  161. ' *         to generate a set of x/y coordinates based on
  162. ' *         a randomly generated seed value and the previous
  163. ' *         iterations x/y output.  Each iterations
  164. ' *         results are loaded into an array which is 
  165. ' *         then used to generate the fractal graphic itself.
  166. ' * 
  167. ' * 
  168. Sub LoadVertexCoordinateArray ()
  169.  
  170.     dim counter as long
  171.     dim a        as double
  172.     dim b        as double
  173.     dim c        as double
  174.     dim d        as double
  175.     dim e        as double
  176.     dim f        as double
  177.     dim r        as double
  178.     dim x        as double
  179.     dim y        as double
  180.  
  181.     for counter = 0 To (numPoints-1)
  182.  
  183.         r = rnd()*measure
  184.  
  185.         if (r <= .01*measure) then
  186.             a = 0
  187.             b = 0
  188.             c = 0 
  189.             d = .16
  190.             e = 0
  191.             f = 0
  192.  
  193.         elseif (r > .01*measure) and( r <= .86*measure) then
  194.             a = .85
  195.             b = .04
  196.             c = -.04
  197.             d = .85
  198.             e = 0
  199.             f = 1.6
  200.  
  201.         elseif (r > .86*measure) and (r <= .93*measure) then
  202.             a = .2
  203.             b = -.26
  204.             c = .23
  205.             d = .22
  206.             e = 0
  207.             f = 1.6
  208.  
  209.         else
  210.             a = -.15
  211.             b = .28
  212.             c = .26
  213.             d = .24
  214.             e = 0
  215.             f = .44
  216.  
  217.         end if
  218.  
  219.         x = (a * x) + (b * y) + e
  220.         y = (c * x) + (d * y) + f
  221.  
  222.         Xarray(counter) =(x+5.0)*measure
  223.         Yarray(counter) = (y/1.2)*measure
  224.  
  225.     next
  226.  
  227. End Sub
  228. '
  229. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  230.  
  231.  
  232.  
  233.  
  234.  
  235. ''SUBROUTINE: GenerateFernGraphic''''''''''''''''''''''''''''''''''
  236. '
  237. ' * Parameters: None
  238. ' *
  239. ' * Return Value: None
  240. ' * 
  241. ' * Description:    
  242. ' * 
  243. ' *        This subroutine creates the fern 
  244. ' *         graphic.
  245. ' * 
  246. ' * 
  247. Sub GenerateFernGraphic ()
  248.     
  249.     dim gfgCounter    as long
  250.     dim hGraphic    as long
  251.     dim hDrawing    as long
  252.     dim offset        as double
  253.  
  254.     if smear_eff = 1 then
  255.         
  256.         offset = smear_val
  257.  
  258.     else
  259.         
  260.         offset = 0.01*measure
  261.  
  262.     end if
  263.  
  264.     hDrawing = TCWDrawingActive
  265.     hGraphic = TCWGraphicCreate (GK_GRAPHIC, "")
  266.     
  267.     for gfgCounter=0 to (numPoints-1)
  268.  
  269.         VertexCreateMethod hGraphic, Xarray(gfgCounter), Yarray(gfgCounter), offset
  270.         
  271.     next
  272.  
  273.     TCWGraphicAppend 0, hGraphic
  274.     TCWGraphicDraw hGraphic, 0
  275.  
  276.     TCWUndoRecordStart hDrawing, "fern"
  277.  
  278.         TCWUndoRecordAddGraphic hDrawing, hGraphic
  279.  
  280.     TCWUndoRecordEnd hDrawing
  281.             
  282. End Sub
  283. '
  284. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  285.  
  286.  
  287.  
  288.  
  289.  
  290. ''SUBROUTINE: VertexCreateMethod'''''''''''''''''''''''''''''''''''
  291. '
  292. ' * Parameters: None
  293. ' *
  294. ' * Return Value: None
  295. ' * 
  296. ' * Description:    
  297. ' * 
  298. ' *        This subroutine creates a fern
  299. ' *         graphic using TCWVertexAppend
  300. ' *         
  301. ' * 
  302. ' * 
  303. Sub VertexCreateMethod (ByVal hGraphic As Long, ByVal x As Double, ByVal y As Double, ByVal os As Double)
  304.  
  305.     dim hVertex1    as long
  306.     dim hVertex2    as long
  307.  
  308.     hVertex1 = TCWVertexCreate(x, y, 0)
  309.     hVertex2 = TCWVertexCreate(x+os, y+os, 0)
  310.     
  311.     TCWPenDown hVertex1, MY_FALSE
  312.     TCWPenDown hVertex2, MY_TRUE
  313.  
  314.     TCWGraphicVertexAdd hGraphic, hVertex1
  315.     TCWGraphicVertexAdd hGraphic, hVertex2
  316.  
  317. End Sub
  318. '
  319. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  320.  
  321.  
  322.  
  323.  
  324.  
  325. ''SUBROUTINE: DoFernUI'''''''''''''''''''''''''''''''''''''''''''''
  326. '
  327. ' * Parameters: None
  328. ' *
  329. ' * Return Value: None
  330. ' * 
  331. ' * Description:    
  332. ' * 
  333. ' *        This is the fern fractal script's user interface. 
  334. ' *         It's actually a dialog box definition that serves
  335. ' *         as a "template" for later creating a variable of
  336. ' *         of this type and them using the enable function
  337. ' *        'Dialog' to display it and return values.  The  
  338. ' *         dialog definition is done in a manner very similar 
  339. ' *         to creating user defined variables with the type 
  340. ' *         function in basic or the struct function in C.
  341. ' *         By utilizing several of the UI objects available
  342. ' *         you can actually create quite a useful interface 
  343. ' *         for setting script values and options as well as
  344. ' *         guiding the user through script setup with a 
  345. ' *         "wizard" like interface.  
  346. ' *  
  347. Sub DoFernUI ()
  348.  
  349.     Begin Dialog FernUI 60, 60, 240, 184, "Fern Fractal Generator"
  350.  
  351.         Text 30,    30,        180,    180,    "This sample TurboCAD script interacts with the user with a 'wizard' style interface and generates a fractal 'fern' with the specified number of points." 
  352.         Text 30,    110,    140,    20,        "How many Points would you like?"
  353.  
  354.         TextBox 150, 109, 40, 14, .numPointText
  355.  
  356.         OKbutton     80, 160, 40, 12
  357.         CancelButton 120, 160, 40, 12
  358.     
  359.     End Dialog
  360.     
  361.  
  362.     Dim FrnDlg As FernUI
  363.     FrnDlg.numPointText = "1500"
  364.     button = Dialog(FrnDlg)
  365.  
  366.  
  367.     if button = 0 then
  368.  
  369.         END
  370.  
  371.     else 
  372.  
  373.         numPoints = FrnDlg.numPointText
  374.         
  375.         if numPoints > 100000 then
  376.  
  377.             MsgBox "Too many points!  Please enter a value smaller than 100000."
  378.             DoFernUI
  379.  
  380.         elseif numPoints < 1 then
  381.  
  382.             MsgBox "Not enough points!  Please enter a value larger than 0."
  383.             DoFernUI
  384.  
  385.         end if
  386.  
  387.     end if
  388.  
  389. End Sub
  390. '
  391. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  392.