jac@paul.rutgers.edu (Jonathan A. Chandross) (02/11/91)
Submitted-by: Henry Throop Posting-number: Volume 1, Source:26 Archive-name: games/mandel/pascal/throop Architecture: ONLY_2gs Version-number: 1.00 This is a little Mandelbrot generator I started about a year ago, but because of compiler problems (summary: don't buy TML Pascal II) haven't quite been able to complete it. However, this version does compile and run, though maybe not with all the features I had intended. =Read.Me - - MandelNET gs - -This is a little Mandelbrot generator I started about a year ago, but -because of compiler problems (summary: don't buy TML Pascal II) haven't -quite been able to complete it. However, this version does compile and -run, though maybe not with all the features I had intended. - -The program is in two parts: - - first compile "part_1" (creates a unit file in memory) - - then compile "part_2" (the main program). - -This should work with some modification on ORCA/Pascal or MPW, but I -haven't tried it. - -The indentation looks funny because TML's default font is proportional, -which causes problems -> monospaced. Sorry. - -Mail me with questions about the algorithms or anything. - -Version 1.00 - -Henry Throop -Oregon State University -Computer Science Deptartment -throoph@jacobs.cs.orst.edu - =part_1 - - -{ - Henry Throop - Oregon State University - Computer Science Deptartment - throoph@jacobs.cs.orst.edu -} - - -Unit Mandelstuf; - -INTERFACE - -USES Types, { GS Toolbox Units } - - Locator, { Tool 1 } - Memory, { Tool 2 } - MiscTool, { Tool 3 } - QuickDraw, { Tool 4 } - QDAux, - - Events, { Tool 6 } - Desk, { Tool 5 } - IntMath, { Tool 11 } - - Controls, { Tool 16 } - Windows, { Tool 14 } - Menus, { Tool 15 } - LineEdit, - Dialogs, { Tool 21 } - StdFile, { Tool 23 } - - GSOS, { OS } - Resources, { Resource Mgr } - TMLUtils; - -TYPE - complex = record - x, y : extended - end; - - plane = record {complex plane} - x : extended; - y : extended; - minx : extended; - maxx : extended; - miny : extended; - maxy : extended; - incx : extended; - incy : extended; - sizex : integer; - sizey : integer; - countx : integer; - county : integer; - pprx : integer; - ppry : integer; - level : integer; - ZoomRect : rect; - end; - - SaveStuff = record - data : plane; - hndl : handle - end; - -CONST { Resource IDs } - kStartStopResID = 1; - kMenuBarResID = 1; - - { Menu / Menu item IDs } - kAppleMenuID = 300; - kAboutItem = 301; - - kFileMenuID = 400; - kOpenItem = 401; - kCloseItem = 402; - kQuitItem = 403; - - kMandelMenuID =500; - kStartItem =501; - kStopItem =502; - kContItem =503; - kZoomItem =505; - kUnzoomItem =506; - kIncLevItem =507; - kSetItem =504; - kEraseItem =508; - kLev8Item =509; - - kNetworkMenuID =600; - kNodeItem =601; - kServerItem =602; - - kPaletteMenuID =700; - kPal1Item =701; - kPal2Item =702; - kPal3Item =703; - kPal4Item =704; - kPal5Item =705; - kPal6Item =706; - kPal7Item =707; - kCycleInItem =708; - kCycleOutItem =709; - - { Window IDs } - kWindow1ResID = 1000; - - kSTop =14; {coords for screen} - kSBot =142; - kSLeft =32; - kSRight =288; - kSWidth =256; - kSHeight =128; - - kLN4 =1.386294; - kLN2 =0.69314718; - - -VAR gMyMemoryID: Integer; - gStartStopRef: Ref; - - gMainEvent: EventRecord; - gDone: Boolean; - - gMainWindow: WindowPtr; - gMainRect: rect; - - gAppleMenu: str255; - gFileMenu: str255; - gMandelMenu: str255; - gNetworkMenu: str255; - gPaletteMenu: str255; - - gPlane: plane; {complex coords of screen} - gLastPlane: array [1..20] of SaveStuff; - gNumPlanes: integer; - - gMaxIterations: integer; - gMirror: boolean; {if x-axis is in center} - - gPlotting: boolean; - - gZoomed: boolean; {gZoomRect currently - displayed?} - gLastCount: integer; - - TmpSaveHndl : handle; - SHRPtr: ptr; - PictPtr: ptr; - - gMaxIter : integer; - gColorInc : integer; {number of values/color} - gDwell : integer; {square of escape distance} - gEventRecord : EventRecord; - gNetwork : boolean; - - modem : text; - -procedure DoAbout; FORWARD; -procedure DoOpen; FORWARD; -procedure DoClose; FORWARD; -procedure DoQuit; FORWARD; -procedure SetUpMenus; FORWARD; -procedure SetUpWindows; FORWARD; -function DoCalc (origx, origy : extended) : integer; FORWARD; -procedure DoErase; FORWARD; -procedure DrawContentProc1; FORWARD; -function B2I (b : boolean) : integer; FORWARD; -procedure InitPalettes; FORWARD; -procedure DoCycleIn; FORWARD; -procedure DoCycleOut; FORWARD; -procedure PlotPoint (cycles : integer; x, y : extended); FORWARD; -procedure GetZoom; FORWARD; -procedure DoZoom; FORWARD; -procedure SetPalette (palette : integer); FORWARD; -procedure DoLev8; FORWARD; -procedure SaveScreen (desthndl : handle); FORWARD; -procedure RestoreScreen (srchndl : handle); FORWARD; -procedure SavePic (desthndl : handle); FORWARD; -procedure RestorePic (srchndl : handle); FORWARD; - -IMPLEMENTATION - -procedure SaveScreen {(desthndl : handle)}; -begin - HideCursor; - MoveLeft (SHRPtr^, desthndl^^, 32768); - ShowCursor -end; - -procedure RestoreScreen {(srchndl : handle)}; -begin - HideCursor; - MoveLeft (srchndl^^, SHRPtr^, 32768); - ShowCursor -end; - -procedure SavePic {(desthndl : handle)}; -begin - HideCursor; - MoveLeft (PictPtr^, desthndl^^, 128*160); - ShowCursor -end; - -procedure RestorePic {(srchndl : handle)}; -begin - HideCursor; - MoveLeft (srchndl^^, PictPtr^, 128*160); - ShowCursor -end; - -procedure IncLev; external; - -procedure DoCycleOut; -var i, temp : integer; -begin - repeat - temp := GetColorEntry (0, 1); - for i := 2 to 14 do - SetColorEntry (0, i-1, GetColorEntry (0, i)); - SetColorEntry (0, 14, temp); - for i := 1 to 6000 do; - until (Button (0)); - {i := GetNextEvent;} -end; - -procedure DoCycleIn; -var i, temp : integer; -begin - repeat - temp := GetColorEntry (0, 14); - for i := 13 downto 1 do - SetColorEntry (0, i+1, GetColorEntry (0, i)); - SetColorEntry (0, 1, temp); - for i := 1 to 6000 do; - until (Button (0)); -{ i := GetNextEvent;} -end; -procedure DoAbout; -var ignore: Integer; - aboutDlog : DialogPtr; - r : rect; - -begin - SetRect (r, 60, 30, 235, 170); - aboutDlog := NewModalDialog (r, true, 0); - SetPort (aboutDlog); - SetRect (r, 130, 110, 165, 125); - NewDItem (aboutDlog, 1, r, 10, @'OK', 0, 0, nil); - SetForeColor (0); - SetBackColor (15); - MoveTo (20, 15); DrawString ('MandelNET v0.3') - MoveTo (20, 35); DrawString ('A Mandlebrot set'); - MoveTo (20, 46); DrawString ('generator utilizing'); - MoveTo (20, 57); DrawString ('parallel processing'); - MoveTo (20, 76); DrawString ('throoph@jacobs.cs.orst.edu.'); - ignore := ModalDialog (nil); - CloseDialog (aboutDlog); - SetPort (gMainWindow); - SetPortRect (gMainWindow^.portRect); -end; - - -procedure DoErase; -var r : rect; -begin - SetRect (r, kSLeft, kSTop, kSRight+1, kSBot); - EraseRect (r); -end; - -function B2I {(b : boolean) : integer}; -begin - if b = true then - B2I := 1 - else - B2I := 0 -end; - -procedure DoClose; -var theWindow: WindowPtr; -begin - theWindow := FrontWindow; - if theWindow <> nil then - if GetWKind (theWindow) <> 0 then - CloseNDAByWinPtr (theWindow) - else - begin - CloseWindow(theWindow); - gPlotting := false; - DisableMItem (kStartItem); - DisableMItem (kStopItem); - DisableMItem (kContItem); - DisableMItem (kIncLevItem); - DisableMItem (kSetItem); - DisableMItem (kCloseItem); - DisableMItem (kZoomItem); - EnableMItem (kOpenItem) - end; -end; - - -procedure DoQuit; -begin - {DoClose;} - gDone := true; -end; - -procedure PlotPoint {(cycles : integer; x, y: extended)}; -var r: rect; - temp : integer; - sx, sy : integer; {screen x/y coords for UL corner of pt} - oldpt : point; - by : integer; {bottom coords} -begin - sx := kSLeft + round (((x-gPlane.minx)/(gPlane.maxx-gPlane.minx))*kSWidth); - sy := kSTop + round (((y-gPlane.miny)/(gPlane.maxy-gPlane.miny))*kSHeight); - SetSolidPenPat((cycles div gColorInc) mod 14 + 1); - if cycles = gMaxIter then - SetSolidPenPat (0); - SetPenSize (1, gPlane.sizey); - if gPlane.countx = 0 then MoveTo (sx, sy); - GetPen (oldpt); - SetPenMode (modeXOR); - LineTo (sx, sy); - SetPenMode (modeCopy); - MoveTo (oldpt.h, oldpt.v); - LineTo (sx, sy); - if gMirror then - begin - if gPlane.y >= 0 then - begin - with gPlane do begin - countx := 600; county := 600; {SetPenSize (0,0);} end; - end - else - begin - by := kSTop+(ksBot-(oldpt.v+gPlane.sizey)); - SetPenMode (modeXOR); - MoveTo (oldpt.h, by); - LineTo (sx, by); - SetPenMode (modeCopy); - LineTo (oldpt.h, by); - MoveTo (sx, sy) - end; - end; -end; - -procedure GetZoom; -var r : rect; - OldLoc, NewLoc, Temp : point; - temp2 : boolean; - option : integer; -begin - if gZoomed then FrameRect (gPlane.ZoomRect); {clear old rect} - GetMouse (OldLoc); - NewLoc := OldLoc; - SetSolidPenPat ($f); - SetPenSize (1,1); - SetPenMode (modeXOR); - while (StillDown(0)) do - begin - r.top := OldLoc.v*B2I(OldLoc.v<NewLoc.v)+NewLoc.v* - B2I(OldLoc.v>NewLoc.v); - r.bottom := OldLoc.v*B2I(NewLoc.v<OldLoc.v)+NewLoc.v* - B2I(NewLoc.v>OldLoc.v); - r.left := OldLoc.h*B2I(OldLoc.h<NewLoc.h)+NewLoc.h* - B2I(OldLoc.h>NewLoc.h); - r.right := OldLoc.h*B2I(NewLoc.h<OldLoc.h)+NewLoc.h* - B2I(NewLoc.h>OldLoc.h); - if r.right > kSRight then r.right := kSRight; - if r.left < kSLeft then r.left := kSLeft; - if r.top < kSTop then r.top := kSTop; - if r.bottom > kSBot then r.bottom := kSBot; - {now test for all cases and adjust rect so horizontal is 2x vertical - size so magnifications isn't distorted} - temp2 := GetNextEvent (-1, gEventRecord); - option := BAND (optionkey, gEventRecord.modifiers); - if option <> optionKey then {if option isn't down then constrain rect} - begin - if ((newloc.h>oldloc.h)and(newloc.v>oldloc.v)) then {bottom right} - if 2*(r.bottom-r.top)>(r.right-r.left) then - r.bottom := r.top+round(0.5*(r.right-r.left)) - else r.right := r.left+round(2*(r.bottom-r.top)) - else if ((newloc.h>oldloc.h)and(newloc.v<oldloc.v)) then {upper right} - if 2*(r.bottom-r.top)>(r.right-r.left) then - r.top := r.bottom-round(0.5*(r.right-r.left)) - else r.right := r.left+round(2*(r.bottom-r.top)) - else if ((newloc.h<oldloc.h)and(newloc.v<oldloc.v)) then {upper left} - if 2*(r.bottom-r.top)>(r.right-r.left) then - r.top := r.bottom-round(0.5*(r.right-r.left)) - else r.left := r.right-round(2*(r.bottom-r.top)) - else if ((newloc.h<oldloc.h)and(newloc.v>oldloc.v)) then {lower left} - if 2*(r.bottom-r.top)>(r.right-r.left) then - r.bottom := r.top+round(0.5*(r.right-r.left)) - else r.left := r.right-round(2*(r.bottom-r.top)) - end; - FrameRect(r); - repeat - GetMouse (Temp) - until ((Temp.h <> NewLoc.h) or (Temp.v <> NewLoc.v) or - (not Button(0))); - NewLoc := Temp; - FrameRect(r); - end; - if ((r.right > r.left) and (r.bottom > r.top)) - then {if it's a valid rect} - begin - gPlane.ZoomRect := r; - FrameRect (gPlane.ZoomRect); - EnableMItem (kZoomItem); - EnableMItem (kContItem); - gPlotting := false; - gZoomed := true - end - else - begin - gZoomed := false; - DisableMItem (kZoomItem) - end; -end; - -procedure DoZoom; -var height, width, oldx, oldy : extended; -begin - if gNumPlanes < 20 then {save current plane for UnZoom} - begin - gLastPlane[gNumPlanes+1].data := gPlane; - gNumPlanes := gNumPlanes + 1; - EnableMItem (kUnzoomItem); - FrameRect (gPlane.ZoomRect); {xor out old rect} - gLastPlane[gNumPlanes].hndl := NewHandle (128*160, gMyMemoryID, - attrNoPurge, nil); - SavePic (gLastPlane[gNumplanes].hndl); - end; - DisableMItem (kZoomItem); - with gPlane do - begin - oldx := minx; - oldy := miny; - width := maxx - minx; - height := maxy - miny; - minx := oldx + width*((gPlane.ZoomRect.left-kSLeft)/kSWidth); - maxx := oldx + width*((gPlane.ZoomRect.right-kSLeft)/kSWidth); - miny := oldy + height*((gPlane.ZoomRect.top-kSTop)/kSHeight); - maxy := oldy + height*((gPlane.ZoomRect.bottom-kSTop)/kSHeight); - level := 0; - end; - gPlotting := true; - gZoomed := false; - IncLev; {initializes for new level} - EnableMItem (kIncLevItem); - if gPlane.miny <> -(gPlane.maxy) then - gMirror := false - else - gMirror := true; - EraseRect (gMainRect); -end; - -procedure SetUpMenus; -var height : integer; -begin - gAppleMenu := concat ('>>@\XN300\0', - '==About MandelNET...\N301\0', - '==-\N999D\0.'); - gFileMenu := concat ('>> File \N400\0', - '==Open\N401*Oo\0', - '==Close\N402*Ww\0', - '==Quit\N403*Qq\0.'); - gMandelMenu := concat ('>> Mandel \N500\0', - '==Start\N501*Tt\0', - '==Stop\N502*. \0', - '==Continue\N503*Cc\0', - '==Zoom\N505*Zz\0', - '==Unzoom\N506*Uu\0', - '==Next Level\N507*Nn\0', - '==Level 8\N509*8 \0', - '==Erase\N508*Ee\0', - '==-\N999D\0', - '==Settings...\N504*Ee\0.'); - gNetworkMenu := concat ('>> Network \N600\0', - '==Node...\N601D\0', - '==Server...\N602\0.'); - gPaletteMenu := concat ('>> Palettes \N700\0', - '==#1\N701*1 \0', - '==#2\N702*2 \0', - '==#3\N703*3 \0', - '==#4\N704*4 \0', - '==#5\N705*5 \0', - '==#6\N706*6 \0', - '==#7\N707*7 \0', - '==-\N999D\0', - '==Cycle in\N708\0', - '==Cycle out\N709\0.'); - - SetMTitleStart (10); - InsertMenu(NewMenu(@gPaletteMenu[1]),0); - InsertMenu(NewMenu(@gNetworkMenu[1]),0); - InsertMenu(NewMenu(@gMandelMenu[1]),0); - InsertMenu(NewMenu(@gFileMenu[1]),0); - InsertMenu(NewMenu(@gAppleMenu[1]),0); - FixAppleMenu (kAppleMenuID); - height := FixMenuBar; - DrawMenuBar; -end; - -procedure SetUpWindows; -begin - gMainWindow := NewWindow2 (nil, 0,@DrawContentProc1, nil, - refIsResource, Ref(kWindow1ResID), rWindParam1); - SetPort (gMainWindow); - SetPortRect (gMainWindow^.portRect); - TmpSaveHndl := NewHandle (32768, gMyMemoryID, attrNoPurge, nil); - SHRPtr := pointer ($e12000); - PictPtr := pointer ($e12000+38*160) -end; - -procedure DrawContentProc1; -begin - {MoveRight (savehand^^, e1^, 32768)} -end; -procedure DoSettings; begin end; -procedure DoSave; begin end; -Procedure DoOpen; -var theReply: SFReplyRec2; - nameC1OutputStr: ResultBuf255Hndl; - pathC1OutputStr: ResultBuf255Hndl; - pFileNameHndl: String255Hndl; - parmsOpen : OpenRecGS; - parmsRead : IORecGS; - parmsClose : RefNumRecGS; - pict : handle; - TypeList : SFTypeList2; - prompt : Str255; - i : integer; -begin - SaveScreen (TmpSaveHndl); - prompt := 'Load what pic?'; - theReply.nameDesc := refIsNewHandle; - theReply.pathDesc := refIsNewHandle; - TypeList.numEntries := 1; - TypeList.fileTypeEntries[1].flags := $8000; - TypeList.fileTypeEntries[1].fileType := $00C1; - TypeList.fileTypeEntries[1].auxType := $00000000; - SFGetFile2 (20, 20, RefIsPointer, Ref (@prompt), nil, @TypeList, theReply); - if theReply.good then - begin - WaitCursor; - nameC1OutputStr := ResultBuf255Hndl (theReply.nameRef.refIsNewHandle); - pathC1OutputStr := ResultBuf255Hndl (theReply.pathRef.refIsNewHandle); - pFileNameHndl := String255Hndl (NewHandle ( - nameC1OutputStr^^.bufstring.length+1, - gMyMemoryID, attrNoCross+attrLocked, Ptr (0))); - GS2PString (nameC1OutputStr^^.bufstring, pFileNameHndl^^); - parmsOpen.pCount := 2; - parmsOpen.pathname := @pathC1OutputStr^^.bufstring; - OpenGS (parmsOpen); - if _ToolErr <> noerror then begin i := _ToolErr; GrafOff; - writeln ('open ', i); readln; Grafon end; - {gTempHandle := NewHandle ($00008000, gMyMemoryID, attrlocked, nil); - }parmsRead.pCount := 4; - parmsRead.refnum := parmsOpen.refnum; - parmsRead.databuffer := TmpSaveHndl^; - parmsRead.requestCount := $00007dc8; - ReadGS (parmsRead);if _ToolErr <> noerror then begin i := _ToolErr; GrafOff; - writeln ('read ', i); readln; Grafon end; - - - parmsClose.pCount := 1; - parmsClose.refnum := parmsOpen.refnum; - CloseGS (parmsClose); - if _ToolErr <> noerror then begin i := _ToolErr; GrafOff; - writeln ('close ', i); readln; Grafon end; - - DisposeHandle (Handle (nameC1OutputStr)); - DisposeHandle (handle (pathC1OutputStr)); - DisposeHandle (handle (pFileNameHndl)); - - InitCursor; gPlotting := false;{ - if (FrontWindow <> nil) then CloseWindow (gMainWindow); - gMainWindow := NewWindow2 - (@theReply.filename,0, @DrawContentProc1, - nil, refIsResource, Ref(kWindow1ResID), rWindParam1); - SetPort (gMainWindow); - EraseRect (gMainRect);} - EnableMItem (kCloseItem); - EnableMItem (kStartItem); - end; RestoreScreen (TmpSaveHndl); -end; - -procedure InitPalettes; -var temp : ColorTable; -begin - StuffHex (pointer($E19F20), {RAINBOW} - '0000D00FB00F900F400F000F080F0F0F0F0B0F070F008F00F004F00BF00FFF0F'); - StuffHex (pointer($E19F40), {SUNSET} - '0000E80EB00F800E510E310E120D140D170D2A0E3D0E4E0C4E0A5E086F07FF0F'); - StuffHex (pointer($E19F60), {ABALONE} - '0000F40FE309D202B602AA0159000800190329063A094B0C6A0D8A0EAA0FFF0F'); - StuffHex (pointer($E19F80), {PARROT} - '0000D200B400960078005A003C000F000D020B0409060708050A030C010EFF0F'); - StuffHex (pointer($E19FA0), {TUT} - '000059054804270215010400100320043005400640076108720A930DC50FFF0F'); - StuffHex (pointer($E19FC0), {GREY SCALE} - '0000110122023303440455056606770788089909AA0ABB0BCC0CDD0DEE0EFF0F'); - StuffHex (pointer($E19FE0), {RED SCALE} - '0000000100020003000400050006000700080009000A000B000C000D000E000F'); - GetColorTable (9, temp); - SetColorTable (0, temp); - (* - StuffHex (pointer($E19E00), '0000770741082C070F008000700F000D'); - StuffHex (pointer($E19E10), 'A90FF00FE000DF04AF0D8F07CC0CFF0F'); - StuffHex (pointer($E19E20), '0000FD00EF007F000F060F0A0F0E080F'); - StuffHex (pointer($E19E30), '000F500FA00FF00FF008D200CA00FF0F'); - StuffHex (pointer($E19EA0), '0000E80ECA0C8D0C8F096F039E009D03'); - StuffHex (pointer($E19EB0), '7B055A074208400B820D800EF40FFF0F'); - StuffHex (pointer($E19EC0), '0000B00F500E010D050C0A0D0D0B0E07'); - StuffHex (pointer($E19ED0), '2E048E04DE07FD09FD0CFB0DFB0FFF0F'); - StuffHex (pointer($E19F20), '00001101220233034404550566067707') - *) -end; - -procedure SetPalette {(palette : integer)}; -var i : integer; -temp : colortable; -begin - for i := kPal1Item to kPal7Item do - CheckMItem (false, i); - GetColorTable (palette-kPal1Item+9, temp); - SetColorTable (0, temp); - CheckMItem (true, palette); -end; - - -procedure DoLev8; -begin - gPlane.level := 7; - IncLev; - gPlotting := true; -end; - - -Function DoCalc (origx, origy : extended) : integer; -var i : integer; - xo, yo, xi, yi, temp : longint; -begin - xo := round (origx*1024); xi := xo; - yo := round (origy*1024); yi := yo; - i := 0; - while (((xi*xi+yi*yi)<2097152) and (i <= 50)) do - begin - temp := (xi*xi) div 1024 - (yi*yi) div 1024; - yi := (2*yi*xi) div 1024; - xi := temp; - i := i + 1; - end; - DoCalc := i; -end; - -end. - =part_2 - - -{ - Henry Throop - Oregon State University - Computer Science Deptartment - throoph@jacobs.cs.orst.edu -} - - -PROGRAM Mandel; - -USES TYPES, { GS Toolbox Units } - - Locator, { Tool 1 } - Memory, { Tool 2 } - MiscTool, { Tool 3 } - QuickDraw, { Tool 4 } - - Events, { Tool 6 } - Desk, { Tool 5 } - IntMath, { Tool 11 } - - Controls, { Tool 16 } - Windows, { Tool 14 } - Menus, { Tool 15 } - - LineEdit, { Tool 20 } - Dialogs, { Tool 21 } - - StdFile, { Tool 23 } - - GSOS, { OS } - Resources, { Resource Mgr } - QDAux, - TMLUtils, - mandelstuf; - -TYPE - CursorType = record - height : integer; - width : integer; - data : array [1..9] of packed array [1..8] of byte; - mask : array [1..9] of packed array [1..8] of byte; - HotSpot : point; - end; - (* - complex = record - x, y : extended - end; - - plane = record {complex plane} - x : extended; - y : extended; - minx : extended; - maxx : extended; - miny : extended; - maxy : extended; - incx : extended; - incy : extended; - sizex : integer; - sizey : integer; - countx : integer; - county : integer; - pprx : integer; - ppry : integer; - level : integer; - end; - -CONST { Resource IDs } - kStartStopResID = 1; - kMenuBarResID = 1; - - { Menu / Menu item IDs } - kAppleMenuID = 300; - kAboutItem = 301; - kFileMenuID = 400; - kOpenItem = 401; - kCloseItem = 402; - kQuitItem = 403; - - kMandelMenuID =500; - kStartItem =501; - kStopItem =502; - kContItem =503; - kZoomItem =505; - kUnzoomItem =506; - kIncLevItem =507; - kSetItem =504; - - kNetworkMenuID =600; - kNodeItem =601; - kServerItem =602; - - kPaletteMenuID =700; - kPal1Item =701; - kPal2Item =702; - kPal3Item =703; - kPal4Item =704; - kPal5Item =705; - kPal6Item =706; - kPal7Item =707; - - { Window IDs } - kWindow1ResID = 1000; - - kSTop =10; {coords for screen} - kSBot =138; - kSLeft =32; - kSRight =288; - kSWidth =256; - kSHeight =128; - - kLN4 =1.386294; - kLN2 =0.69314718; - - -VAR gMyMemoryID: Integer; - gStartStopRef: Ref; - - gMainEvent: EventRecord; - gDone: Boolean; - - gMainWindow: WindowPtr; - - gAppleMenu: str255; - gFileMenu: str255; - gMandelMenu: str255; - gNetworkMenu: str255; - gPaletteMenu: str255; - - gPlane: plane; {complex coords of screen} - gLastPlane: array [1..20] of plane; - gNumPlanes: integer; - - gMaxIterations: integer; - gMirror: boolean; {if x-axis is in center} - - gPlotting: boolean; - - gZoomRect: rect; - gZoomed: boolean; {gZoomRect currently - displayed?} - gLastCount: integer; - - - *) -var gOffScreenPort : GrafPortPtr; - gOffScreenPixImage : ptr; - gOnScreenPixImage : ptr; - gOffScreenLocInfo : locInfo; - gOnScreenLocInfo : LocInfo; - gOldsy : integer; - gZoomCursor : CursorType; - gInZoom : boolean; {cursor in drawing region?} - gUseLevels : boolean; - -procedure DoStart; FORWARD; -procedure DoStop; FORWARD; -procedure DoCont; FORWARD; -procedure DoUnzoom; FORWARD; -procedure IncLev; FORWARD; -procedure DoSettings; FORWARD; - -procedure InitializeGlobals; FORWARD; -procedure MainEventLoop; FORWARD; -procedure HandleMenu; FORWARD; -procedure DoNextPoint; FORWARD; -procedure SetUpCursor; FORWARD; -procedure CheckCursor; FORWARD; -procedure SetNetwork; FORWARD; -procedure DoNextLine; FORWARD; -procedure PlotLine; FORWARD; - -procedure SetUpCursor; -begin - gZoomCursor.height := 9; - gZoomCursor.width := 4; - gZoomCursor.Hotspot.v := 6; - gZoomCursor.Hotspot.h := 6; - - StuffHex(@gZoomCursor.Data[1], '0000000000000000'); - StuffHex(@gZoomCursor.Data[2], '0000000000000000'); - StuffHex(@gZoomCursor.Data[3], '0000000000000000'); - StuffHex(@gZoomCursor.Data[4], 'F000000000F00000'); - StuffHex(@gZoomCursor.Data[5], '0000000000000000'); - StuffHex(@gZoomCursor.Data[6], 'F0000F0000F00000'); - StuffHex(@gZoomCursor.Data[7], '00000F0000000000'); - StuffHex(@gZoomCursor.Data[8], '00000F0000000000'); - StuffHex(@gZoomCursor.Data[9], '0000FFF000000000'); - StuffHex(@gZoomCursor.Mask[1], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[2], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[3], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[4], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[5], 'FFFFF0FFFFF00000'); - StuffHex(@gZoomCursor.Mask[6], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[7], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[8], '00000F0000000000'); - StuffHex(@gZoomCursor.Mask[9], '00000F0000000000'); - gInZoom := false; - - gUseLevels := true; - gNetwork := true; - CheckMItem (false, kServerItem); - rewrite (modem, '.DEV4');{ - writeln (modem, 'ato0');} - writeln (modem, chr (3)); - writeln (modem, 'a.out'); - readln (modem); -end; - -procedure SetNetwork; -begin - gNetwork := not gNetwork; - CheckMItem (gNetwork, kServerItem); -end; - -procedure DoUnzoom; -begin - gPlotting := true; - gZoomed := false; - gPlane.level := 1; - EnableMItem (kZoomItem); - gPlane := gLastPlane [gNumPlanes].data; - if gPlane.miny = -(gPlane.maxy) then - gMirror := true - else - gMirror := false; - gNumPlanes := gNumPlanes - 1 ; - if gNumPlanes = 0 then DisableMItem (kUnZoomItem); - RestorePic (gLastPlane[gNumPlanes+1].hndl); - DisposeHandle (gLastPlane[gNumPlanes+1].hndl); - gZoomed := true; - EnableMItem (kContItem); - gPlotting := false; - SetPenMode (modeXOR); - SetPenSize (1,1); - SetSolidPenPat ($f); - FrameRect (gPlane.ZoomRect); - MoveTo (0, 155); write (gPlane.minx:4:4); - MoveTo (140, 9); write (gPlane.miny:4:4); - MoveTo (250, 155); write (gPlane.maxx:4:4); - MoveTo (140, 160); write (gPlane.maxy:4:4); - MoveTo (0, 171); write ('Level: ',gPlane.level); - MoveTo ( - kSLeft + round (((gPlane.x-gPlane.minx)/(gPlane.maxx-gPlane.minx))*kSWidth) , - kSTop + round (((gPlane.y-gPlane.miny)/(gPlane.maxy-gPlane.miny))*kSHeight )); -end; - -procedure InitializeGlobals; -begin - with gPlane do - begin - minx := -2.0; {complex coords} - maxx := 1.0; - miny := -1.25; - maxy := 1.25; - level := 0; - end; - - gZoomed := false; - SetRect (gMainRect , kSLeft, kSTop, kSRight+1, kSBot); - gMaxIter := 20; - gDwell := 2; - gColorInc := 1; - gPlotting := false; - if gPlane.miny = -gPlane.maxy then - gMirror := true; - - gNumPlanes := 0; - SetPalette (kPal1Item); - IncLev; - DisableMItem (kUnzoomItem); - DisableMItem (kZoomItem); - DisableMItem (kContItem); - EnableMItem (kOpenItem); - EnableMItem (kIncLevItem); - CheckMItem (true, kPal1Item) -end; - -procedure CheckCursor; -var r : rect; - loc : point; - -begin - SetRect (r, kSLeft, kSTop, kSRight, kSBot); - GetMouse (loc); - if ((PtInRect (loc, r)) and (not gInZoom)) then - begin - {SetCursor (CursorPtr (@gZoomCursor)^); - }gInZoom := true - end - else if (not (PtInRect (loc, r)) and (gInZoom)) then - begin - InitCursor; - gInZoom := false - end; -end; -procedure MainEventLoop; -var code: Integer; -begin - gMainEvent.wmTaskMask := $001FFFFF; - gDone := false; - - repeat - code := TaskMaster($FFFF,gMainEvent); - case code of - wInGoAway: DoClose; - wInSpecial, - wInMenuBar: HandleMenu; - wInContent: if gPlane.level > 1 then GetZoom; - end; - if gPlotting then - if gNetwork then DoNextLine - else DoNextPoint; - until gDone; -end; - -function s2r (s : str255) : extended; -const kLN10 = 2.30258509299; -var i : integer; - decimal : boolean; - expo : boolean; - negative : boolean; - ans : extended; - level : integer; - len : integer; -begin - len := length (s); - i := 1; - decimal := false; - expo := false; - negative := false; - ans := 0; - while ((i <= len) and (not decimal)) do - begin - if s[i] in ['0'..'9'] then - ans := ans * 10 + ord (s[i])-48; - if s[i] = '-' then negative := true; - i := i + 1; - if s[i] = '.' then decimal := true; - end; - level := i; - i := i + 1; - while ((i <= len) and (not expo)) do - begin - if s[i] in ['0'..'9'] then - begin - ans := ans + (ord (s[i])-48)*exp ((level - i)*kLN10); - end; - if s[i] = 'e' then expo := true; - i := i + 1; - end; - if expo then - case s[i] of - '+' : ans := ans * exp((ord (s[i+1])-48)*kLN10); - '-' : ans := ans * exp(-(ord (s[i+1])-48)*kLN10) - end; - if negative then ans := -ans; - S2R := ans; - end; -procedure DoSettings; -var r : rect; - setDlog : DialogPtr; - itemHit : integer; - iterations : str255; - minx, maxx, miny, maxy : str255; - redraw : boolean; - minxo, maxxo, minyo, maxyo : str255; - dwell : str255; - colorinc : str255; - level, levelo : str255; - -begin - SaveScreen (TmpSaveHndl); - redraw := false; - minx := real2string (gPlane.minx); minxo := minx; - miny := real2string (gPlane.miny); minyo := miny; - maxy := real2string (gPlane.maxy); maxyo := maxy; - maxx := real2string (gPlane.maxx); maxxo := maxx; - iterations := int2string (gMaxIter); - colorinc := int2string (gColorInc); - level := int2string (gPlane.level); levelo := level; - dwell := int2string (gDwell); - SetRect (r, 16, 20, 300, 190); - setDlog := NewModalDialog (r, true, 0); - SetPort (windowPtr(Ord4(setDlog))); - SetRect (r, 50, 142, 0,0); - NewDItem (setDlog, 1, r, 10, @'OK', 0, 0, nil); - SetRect (r, 130, 142, 0,0); - NewDItem (setDlog, 2, r, 10, @'Cancel', 0, 0, nil); - SetRect (r, 20, 10, 140, 21); - NewDItem (setDlog, 3, r, 15, @'Left coord', 0, 0, nil); - SetRect (r, 20, 21, 140, 35); - NewDItem (setDlog, 4, r, 15, @'Top coord', 0, 0, nil); - SetRect (r, 20, 35, 140, 49); - NewDItem (setDlog, 5, r, 15, @'Right coord', 0, 0, nil); - SetRect (r, 20, 49, 140, 63); - NewDItem (setDlog, 6, r, 15, @'Bottom coord', 0, 0, nil); - SetRect (r, 20, 67, 140, 81); - NewDItem (setDlog, 7, r, 15, @'Iteration limit', 0, 0, nil); - SetRect (r, 145, 67, 195, 81); - NewDItem (setDlog, 8, r, 17, @iterations, 3, 0, nil); - SetRect (r, 145, 10, 275, 21); - NewDItem (setDlog, 9, r, 17, @minx, 255, 0, nil); - SetRect (r, 145, 21, 275, 35); - NewDItem (setDlog, 10, r, 17, @miny, 255, 0, nil); - SetRect (r, 145, 35, 275, 49); - NewDItem (setDlog, 11, r, 17, @maxx, 255, 0, nil); - SetRect (r, 145, 49, 275, 63); - NewDItem (setDlog, 12, r, 17, @maxy, 255, 0, nil); - SetRect (r, 20, 124, 200,137); - NewDItem (setDlog, 13, r, 11, @'Use Levels', ord (gUseLevels), 0, nil); - SetRect (r, 20, 81, 140, 95); - NewDItem (setDlog, 14, r, 15, @'Color increment', 0, 0, nil); - SetRect (r, 20, 95, 140, 109); - NewDItem (setDlog, 15, r, 15, @'Dwell', 0, 0, nil); - SetRect (r, 145, 81, 195, 95); - NewDItem (setDlog, 16, r, 17, @colorinc, 255, 0, nil); - SetRect (r, 145, 95, 195, 109); - NewDItem (setDlog, 17, r, 17, @dwell, 4, 0, nil); - SetRect (r, 20, 109, 140, 124); - NewDItem (setDlog, 18, r, 15, @'Level', 0, 0, nil); - SetRect (r, 145, 109, 175, 124); - NewDItem (setDlog, 19, r, 17, @level, 1, 0, nil); - repeat - itemHit := ModalDialog (nil); - if itemHit = 13 then SetDItemValue (abs(1-GetDItemValue (setDlog, 13)), setDlog, 13) - until itemHit < 3; - gUseLevels := (GetDItemValue (setDlog, 13)=1); - if itemHit = 1 then - begin - WaitCursor; - GetIText (setDlog, 9, minx); - GetIText (setDlog, 10, miny); - GetIText (setDlog, 11, maxx); - GetIText (setDlog, 12, maxy); - GetIText (setDlog, 8, iterations); - GetIText (setDlog, 16, colorinc); - GetIText (setDlog, 17, dwell); - GetIText (setDlog, 19, level); - if maxxo <> maxx then begin gPlane.maxx := S2R(maxx); redraw := true end; - if minxo <> minx then begin gPlane.minx := S2R(minx); redraw := true end; - if maxyo <> maxy then begin gPlane.maxy := S2R(maxy); redraw := true end; - if minyo <> miny then begin gPlane.miny := S2R(miny); redraw := true end; - gMaxIter := String2Int (iterations); - gDwell := String2Int (dwell); - gColorInc := String2Int (colorinc) + B2I (gColorInc = 0); - end; - gMirror := (gPlane.miny=-gPlane.maxy); - CloseDialog (setDlog); - SetPort (gMainWindow); - RestoreScreen (TmpSaveHndl); - if redraw then - begin - DoErase; - gPlane.level := 0; - IncLev; - end; - if level <> levelo then - begin - gPlane.level := (String2Int (level)) - 1; - IncLev - end; - if ((not gUseLevels) and (gPlane.level <> 8)) then IncLev; - InitCursor; -end; - -procedure DoCont; -begin - gPlotting := true; - if gZoomed then FrameRect (gPlane.ZoomRect); - gZoomed := false; - DisableMItem (kZoomItem); - DisableMItem (kContItem); - EnableMItem (kStopItem); -end; - -Procedure DoStop; -begin - if gZoomed then - begin - gZoomed := false; - FrameRect (gPlane.ZoomRect); - DisableMItem (kZoomItem) - end; - gPlotting := false; - DisableMItem (kStopItem); - EnableMItem (kContItem); -end; - - -Procedure IncLev; -var r : rect; - info, info2 : locInfo; -begin - if not gUseLevels then gPlane.level := 8; - if gZoomed then - begin - FrameRect (gPlane.ZoomRect); - DisableMItem (kZoomItem); - gZoomed := false; - end; - gPlane.level := gPlane.level + 1; - if gPlane.level > 8 then - begin - DisableMItem (kIncLevItem); - gPlane.level := 8; - end; - gPlotting := true; - with gPlane do - begin - pprx := round (exp (((level-1)/2)*kLN4))*2; - ppry := round (exp (((level-1)/2)*kLN4)); - incx := (maxx-minx)/pprx; - incy := (maxy-miny)/ppry; - sizex := round ((kSWidth/exp((level-1)*kLN2))); - sizey := round ((kSHeight/exp((level-1)*kLN2))); - countx := 0; - county := 0; - x := minx; - y := miny; - end; - MoveTo (0, 155); write (gPlane.minx:4:4); - MoveTo (140, 9); write (gPlane.miny:4:4); - MoveTo (250, 155); write (gPlane.maxx:4:4); - MoveTo (140, 160); write (gPlane.maxy:4:4); - MoveTo (0, 171); write ('Level: ',gPlane.level); - MoveTo (kSLeft, kSTop); - gLastCount := DoCalc (gPlane.minx, gPlane.miny); -end; - -Procedure DoStart; {restarts new plot} -var level, i : integer; - r : rect; -begin - InitializeGlobals; {sets level to 1}; - gPlotting := true; - EnableMItem (kStopItem); - DisableMItem (kContItem); - EraseRect (gMainRect); - SetPenMode (modeCOPY); - SetPenSize (1, 1); - SetSolidPenPat ($0); - SetRect (r, kSLeft-1, kSTop-1, kSRight+2, kSBot+1); - FrameRect (r); - for i := 0 to 15 do - begin - SetSolidPenPat (i); - SetRect (r, 3, i*8+17, 20, i*8+25); - PaintRect (r) - end; -end; - -procedure PlotLine; -var x, y : real; - cycles, i : integer; - datai : array [1..256] of string [15]; - data : array [1..256] of integer; - lx, ly : integer; -begin - i := 1; - for i := 0 to 5 do - readln (modem, datai[i]); - i := 1; - repeat - readln (modem, datai [i]); - i := i + 1; - until i > gPlane.pprx; - {GrafOff; for i := 1 to gPlane.pprx do writeln (i, datai[i]); readln; GrafOn;} - {for i := 1 to gPlane.pprx do writeln ('datai [',i, '] ',datai [i]); - }for i := 1 to gPlane.pprx do data [i] := String2Int (datai[i]); - {GrafOff; - writeln ('i ', i); - writeln ('y, minx, maxx, pprx, maxiter ', gPlane.y, gPlane.minx, gPlane.maxx, - gPlane.pprx, gMaxIter); - readln; GrafOn; - }SetPenSize (1, gPlane.sizey); - SetPenMode (modeCOPY); - i := 2; - ly := kSTop+round ((((gPlane.y-gPlane.incy)-gPlane.miny)/(gPlane.maxy-gPlane.miny))*kSHeight); - MoveTo (kSLeft, ly); - repeat - if ((data [i] <> data [i-1]) or (i>=gPlane.pprx-2))then - begin - SetSolidPenPat ((data [i-1] div gColorInc) mod 14 + 1); - if data [i-1] >= gMaxIter-1 then SetSolidPenPat (0); - x := gPlane.minx+i*gPlane.incx; - lx := kSLeft+round(((x-gPlane.minx)/(gPlane.maxx-gPlane.minx))*kSWidth); - LineTo (lx, ly) - end; - {GrafOff; writeln ('lx, ly, color ', lx, ' ', ly, ' ', data [i]); GrafOn; - }i := i + 1 - until i > gPlane.pprx + 1; -end; - -procedure DoNextLine; -var count : integer; -begin -with gPlane do - if (county < ppry div (1+(B2I(gMirror)))) then - begin - y := y + incy; - county := county + 1; - writeln (modem, y); - writeln (modem, minx); - writeln (modem, maxx); - writeln (modem, pprx); - writeln (modem, gMaxIter); - writeln (modem, gDwell); - PlotLine; - end - else - begin - if gPlane.level = 8 then gPlotting := false - else - begin - IncLev; - IncLev - end; - end; -end; - - -procedure DoNextPoint; -var count : integer; -begin -with gPlane do - if (county < ppry div (1+(B2I(gMirror)))) then - begin - if (countx <= pprx) then - begin - count := DoCalc (x+incx/2,y+incy/2); - if count <> gLastCount then - PlotPoint (gLastCount, x, y) - else if ((countx = pprx) or (countx = 0)) then - PlotPoint (count, x, y); - gLastCount := count; - x := x + incx; - countx := countx + 1; - end - else - begin - x := minx; - y := y + incy; - county := county + 1; - countx := 0; - end; - end - else - begin - if gPlane.level = 8 then gPlotting := false - else - begin - IncLev; - IncLev - end; - end; -end; - - -procedure HandleMenu; -var theMenu: Integer; - theItem: Integer; -begin - theMenu := HiWrd(gMainEvent.wmTaskData); - theItem := LoWrd(gMainEvent.wmTaskData); - - case theItem of - kAboutItem: DoAbout; - kOpenItem: DoOpen; - kCloseItem: DoClose; - kQuitItem: DoQuit; - kStartItem: DoStart; - kStopItem: DoStop; - kContItem: DoCont; - kZoomItem: DoZoom; - kUnzoomItem: DoUnzoom; - kIncLevItem: IncLev; - kSetItem: DoSettings; - kLev8Item: DoLev8; - kEraseItem: DoErase; - kCycleInItem: DoCycleIn; - kCycleOutItem: DoCycleOut; - kServerItem: SetNetwork; - end; - if ((theMenu = kPaletteMenuID) and (theItem < kCycleInItem)) then - SetPalette (theItem); - HiliteMenu (false,theMenu); -end; - -begin - gMyMemoryID := MMStartUp; - - gStartStopRef := StartupTools(gMyMemoryId,RefIsResource, - Ref(kStartStopResID)); - - if _ToolErr = noError then begin - SetUpMenus; - SetUpWindows; - SetUpCursor; - InitializeGlobals; - InitPalettes; - InitCursor; - DoStart; - MainEventLoop; - DisposeHandle (TmpSaveHndl); - end; - - ShutDownTools (refIsHandle, gStartStopRef); -end. - - + END OF ARCHIVE