! use sin and cos with parameters? amplitude, frequency, phase? !! File: PhaseAndTime !! September 20, 2003 Hubert Hohn PUBLIC PCFlag,Mac5Flag,M68KFlag,UnixFlag,xmax,ymax PUBLIC toolLft,toolRgt,toolBas,toolTop,toolhdr,toolHgt,toolWid ! tool boundaries PUBLIC winLft,winRgt,winBas,winTop,winHgt,winWid ! window PUBLIC workLft,workRgt,workBas,workTop,workMidx ! work area PUBLIC backclr,black,drkgry,drkmid,midgry,litmid,litgry,white PUBLIC red,yellow,green,cyan,blue,magenta,pink,colorscheme PUBLIC planeclr,gridclr,rimclr,axisclr,axislabelclr,titleclr,rightsclr PUBLIC numberlineclr,slotdrkclr,slotlgtclr,slideclr PUBLIC largefonts, title$, SLUmode LET toolHgt= 560 LET toolWid= 780 LET window$= "The d'Arbeloff Interactive Math Project" LET title$ = "Phase Plane and Time Series" SUB ThisProgram CALL PhaseAndTime CLEAR END SUB !! --------------------------------------------------------- !! ------ Start TB4 Mac Header and Subs ------ !LET M68KFlag = 1 !LIBRARY "MacTools*", "HHLib.trc" !ASK PIXELS winWid,winHgt !LET winLft= 0 !LET winTop= 0 !LET winRgt= winWid-1 !LET winBas= winHgt-1 !SET WINDOW 0,winRgt,winBas,0 !CALL Palette !CLEAR ! !CALL ToolPanel !CALL ThisProgram ! !END !EXTERNAL ! !MODULE Mac4Parts ! SUB SetTextFont(font,size,style$) ! CALL MacTextFont(font) ! CALL MacTextSize(size) ! CALL MacTextFace(style$) ! END SUB ! ! SUB StringWidth(sw$,sl) ! DECLARE DEF MacStringWidth ! LET sl= MacStringWidth(sw$) ! END SUB ! ! SUB SetLineWeight(wgt) ! CALL MacPenSize(wgt,wgt) ! END SUB ! ! SUB BoxDisk(Lft,Rgt,Bas,Top) ! CALL MacPaintOval(Lft,Rgt,Bas,Top) ! END SUB !END MODULE !! --- End TB4 Mac Header and Subs --- !!--------------------------------------------------------- !!--- Start TB5 Cross-Platform header and subs --- LIBRARY "c:\TB Gold\TBLibs\TrueCtrl.trc" ! windows LIBRARY "c:\TB Gold\TBLibs\HHLib.trc" !LIBRARY ":TBLibs:TrueCtrl.trc" ! macintosh !LIBRARY "HHLib.trc" PUBLIC WinID DECLARE PUBLIC OBJM_SET,OBJM_SYSINFO LET winHgt= toolHgt LET winWid= toolWid DIM values(1) CALL TC_Init CALL Object(OBJM_SYSINFO,WinID,"MACHINE",system$,values()) IF system$="MAC" then LET Mac5Flag= 1 ELSE IF system$="WIN32" then LET PCFlag = 1 END IF CALL TC_SetUnitsToPixels ! 5.1 and up needs this CALL TC_GetScreenSize(scrnLft,scrnRgt,scrnBas,scrnTop) LET winLft= int((scrnRgt-scrnLft-winWid)/2) LET winRgt= winLft+winWid-1 LET winTop= int((scrnBas-scrnTop-winHgt)/2) + 10 LET winBas= winTop+winHgt-1 CALL TC_Win_Create (WinID,"TITLE",winLft,winRgt,winBas,winTop) LET values(1)= 2 CALL Object(OBJM_SET, WinID, "TYPE", "", values()) IF PCFlag=1 then ! kill dithering LET values(1)= 1 CALL Object(OBJM_SET, WinID, "SOLID MIX", "", values()) END IF LET values(1)= 0 CALL TC_SetRect(WinID,winLft,winRgt,winBas,winTop) CALL TC_Win_SetTitle(WinID,window$) CALL TC_Show(WinID) SET Mode "COLORSTANDARD" ASK PIXELS winWid,winHgt ! must follow set DrawMode LET winLft= 0 LET winTop= 0 LET winRgt= winWid-1 LET winBas= winHgt-1 SET WINDOW 0,winRgt,winBas,0 CALL Palette IF PCFlag=1 then LET values(1)= 0 ! now force solid colors CALL Object(OBJM_SET, WinID, "SOLID MIX", "", values()) CALL TC_Win_RealizePalette(WinID) ! some PCs need this CALL TC_Win_SetFont(WinID,"arial",9,"plain") CALL StringWidth("0",sw) IF sw>7 then LET largefonts=1 else LET largefonts=0 END IF CALL TC_Win_Switch(WinID) CALL ToolPanel CALL ThisProgram CALL SetTextFont(1,12,"bold") ! now shut down and clean up LET quit$= "click the mouse or press a key to close..." CALL PlotTextCJ(workmidx,(workbas+worktop)/2,quit$,yellow) CALL TC_CleanUp END EXTERNAL MODULE TB5Parts SUB StringWidth(sw$,sl) DECLARE PUBLIC WinID LET sl= StrWidth(WinID,sw$) END SUB SUB SetLineWeight(wgt) DECLARE PUBLIC OBJM_SET DECLARE PUBLIC WinID DIM values(1) LET values(1)= wgt CALL Object(OBJM_SET,WinID, "WIDTH", "", values()) END SUB SUB SetTextFont(font,size,style$) DECLARE PUBLIC WinID,Mac5Flag,PCFlag,largefonts IF Mac5Flag=1 then SELECT CASE font CASE 4 LET font$= "Courier" CASE 16 LET font$= "Times" CASE else LET font$= "Geneva" END SELECT ELSE IF PCFlag=1 then IF largefonts=1 then IF size<12 then LET size= 6 ELSE IF size=14 then LET size= 10 ELSE IF size=18 then LET size= 12 ELSE IF size=24 then LET size= 14 ELSE IF size=12 then LET size= 8 ELSE LET size= round(72/96 * size * .8) END IF ELSE IF size<12 then LET size= 7 ELSE IF size=14 then LET size= 12 ELSE IF size=12 then LET size= 9 ELSE IF size=18 then LET size= 14 ELSE IF size=24 then LET size= 18 ELSE LET size= round(72/96 * size) END IF END IF SELECT CASE font CASE 4 LET font$= "Courier New" CASE 16 LET font$= "Times New Roman" CASE else LET font$= "Verdana" END SELECT END IF IF style$= "normal" then LET style$= "plain" CALL TC_Win_SetFont(WinID,font$,size,style$) END SUB SUB BoxDisk(Lft,Rgt,Bas,Top) BOX DISK Lft,Rgt,Bas,Top END SUB END MODULE ! --- End TB5 Cross-platform header and subs --- !! --------------------------------------------------------- !! --- Start Unix Header and Subs --- !LIBRARY "HHLib.trc" !LET UnixFlag= 1 !ASK PIXELS winWid,winHgt !LET winLft= 0 !LET winTop= 0 !LET winRgt= winWid-1 !LET winBas= winHgt-1 !SET WINDOW 0,winRgt,winBas,0 !CALL Palette ! !CALL ToolPanel !CALL ThisProgram ! !END !EXTERNAL ! !MODULE UnixParts ! SHARE CharWidth ! ! SUB SetTextFont(font,size,style$) ! LET font$= "-adobe-courier-" ! IF style$= "normal" then ! LET style$= "medium-r-normal--" ! ELSE ! LET style$= "bold-r-normal--" ! END IF ! IF size=9 then ! LET size$= str$(10) ! ELSE ! LET size$= str$(size) ! END IF ! LET test= SetFont(font$&style$&size$&"*") ! ! IF size=9 then ! LET CharWidth= 7 ! ELSE IF size=12 then ! numeric output - axis labels ! LET CharWidth= 8 ! ELSE IF size=14 then ! rare ! LET CharWidth= 9 ! ELSE IF size=18 then ! rare ! LET CharWidth= 10 ! END IF ! END SUB ! ! SUB StringWidth(sw$,sl) ! string width in pixels ! ! LET sl= StrWidth(sw$) ! LET chars= len(sw$) ! LET sl = chars*CharWidth ! END SUB ! ! SUB SetLineWeight(wgt) ! ! CALL PenSize(wgt,wgt) ! END SUB ! ! SUB BoxDisk(Lft,Rgt,Bas,Top) ! CALL Fill_Circle(Lft,Rgt,Bas,Top) ! END SUB !END MODULE !! ------ End of TB Unix Header and Subs ------ ! ----------------------------------------------------------- ! *** SUB PhaseAndTime DECLARE PUBLIC worklft,workrgt,workbas,worktop,workmid ! work area DECLARE PUBLIC black,drkgry,drkmid,midgry,litmid,litgry,white DECLARE PUBLIC red,yellow,green,cyan,blue,magenta,colorscheme DECLARE PUBLIC slideclr,axisclr,axislabelclr,true,false DECLARE DEF InfoWithin, QuitWithin ! --- help screen array --- DIM info$(1:2) MAT READ info$ DATA "Parametric and Cartesian" DATA "" ! --- colors --- LET xtClr = green LET ytClr = cyan LET xyClr = yellow LET axisclr= drkmid ! ------- Utility functions ------ DECLARE DEF clamp,roundn,e ! --- functions and parameters --- DEF fx(eqnum,t) SELECT CASE eqnum CASE 1 LET fx= cos(t) CASE 2 LET fx= sin(t) END SELECT END DEF DEF fy(eqnum,t) SELECT CASE eqnum CASE 1 LET fy= sin(t) CASE 2 LET fy= sin(t) END SELECT END DEF ! --- graphing window parameters --- LET wspace= 50 ! --- w1 graph window --- DECLARE PUBLIC w1Lft,w1Rgt,w1Bas,w1Top,w1Midx,w1Midy DECLARE PUBLIC w1fLft,w1fRgt,w1fBas,w1fTop,w1x0,w1y0 DECLARE PUBLIC w1xFirst, w1xSTik, w1xLTik, w1xLabel, w1xGridstep DECLARE PUBLIC w1yFirst, w1ySTik, w1yLTik, w1yLabel, w1yGridstep DECLARE PUBLIC w1wWid,w1wHgt,w1fWid,w1fHgt DECLARE PUBLIC w1fxRatio,w1fyRatio,w1wxRatio,w1wyRatio,w1Aspect DECLARE PUBLIC w1xPiFlag, w1xMult, w1yPiFlag, w1yMult LET w1Flag = 1 LET w1xPiFlag= 0 LET w1xMult = 1 LET w1yPiFlag= 0 LET w1yMult = 1 LET w1Lft = worklft+120 LET w1Rgt = w1Lft+180 LET w1Top = workBas - 205 LET w1Bas = w1Top+180 LET w1fsize= 1.5 LET w1fLft = -w1fsize LET w1fRgt = w1fsize LET w1fTop = w1fsize LET w1fBas = -w1fsize LET w1xAx$ = "x" ! axis labels LET w1yAx$ = "y" LET w1xGridstep= 0 ! horizontal grid intervals LET w1yGridstep= 0 ! vertical grid intervals LET w1xSTik = 0 ! horizontal axis Tik marks LET w1xLTik = 0.5 LET w1xLabel= 0.5 LET w1xFirst= w1fLft LET w1ySTik = 0 ! vertical axis Tik marks LET w1yLTik = 0.5 LET w1yLabel= 0.5 LET w1yFirst= w1fBas ! --- w1 methods --- DECLARE DEF w1fncx,w1fncy,w1wndx,w1wndy ! window/function transforms CALL w1Variables LET r= 1 LET w1cLft= w1Wndx(-r) LET w1cRgt= w1Wndx( r) LET w1cBas= w1Wndy(-r) LET w1cTop= w1Wndy( r) SUB w1Init CALL w1DrawPlane(1,1,1) CALL SetTextFont(1,12,"bold") CALL PlotTextLJ(w1Rgt+8,w1y0+3,w1xAx$,xtClr) CALL PlotTextCJ(w1x0,w1Top-10,w1yAx$,ytClr) CALL w1KeepGridLayer CALL w1KeepGraphLayer END SUB SUB w1DrawGraph SET COLOR xyClr SELECT CASE eqnum CASE 1 BOX CIRCLE w1cLft,w1cRgt,w1cBas,w1cTop CASE 2 LET wx1= w1Wndx(-1) LET wy1= w1Wndy(-1) LET wx2= w1Wndx( 1) LET wy2= w1Wndy( 1) PLOT wx1,wy1; wx2,wy2 END SELECT CALL w1KeepGraphLayer END SUB ! --- w2 graph window --- ! --- w2 data --- DECLARE PUBLIC w2Lft,w2Rgt,w2Bas,w2Top,w2Midx,w2Midy DECLARE PUBLIC w2fLft,w2fRgt,w2fBas,w2fTop,w2x0,w2y0 DECLARE PUBLIC w2xFirst, w2xSTik, w2xLTik, w2xLabel, w2xGridstep DECLARE PUBLIC w2yFirst, w2ySTik, w2yLTik, w2yLabel, w2yGridstep DECLARE PUBLIC w2wWid,w2wHgt,w2fWid,w2fHgt DECLARE PUBLIC w2fxRatio,w2fyRatio,w2wxRatio,w2wyRatio,w2Aspect DECLARE PUBLIC w2xPiFlag, w2xMult, w2yPiFlag, w2yMult LET w2Flag = 1 LET w2xPiFlag= 1 LET w2xMult = pi ! use Pi Symbols LET w2yPiFlag= 0 LET w2yMult = 1 LET w2Lft = w1Rgt + wspace + 15 LET w2Rgt = w2Lft + 240 LET w2Top = w1Top LET w2Bas = w1Bas LET w2fLft= 0 LET w2fRgt= 4 LET w2fTop= w1fTop LET w2fBas= w1fBas LET w2xAx$= "t" ! axis labels LET w2yAx$= "y" LET w2xGridstep= 0 ! horizontal grid intervals LET w2yGridstep= 0 ! vertical grid intervals LET w2xSTik = 1/4 ! horizontal axis Tik marks LET w2xLTik = 1/2 LET w2xLabel = 1 LET w2xFirst = w2fLft LET w2ySTik = 0 ! vertical axis Tik marks LET w2yLTik = 0.5 LET w2yLabel = 0.5 LET w2yFirst = w2fBas ! --- w2 methods --- DECLARE DEF w2Fncx,w2Fncy,w2Wndx,w2Wndy CALL w2Variables SUB w2Init CALL w2DrawPlane(1,1,1) CALL SetTextFont(1,12,"bold") CALL PlotTextLJ(w2Rgt+8,w2y0+3,w2xAx$,white) CALL PlotTextCJ(w2x0,w2Top-10,w2yAx$,ytClr) CALL w2KeepGridLayer CALL w2KeepGraphLayer END SUB SUB w2DrawGraph SET COLOR ytClr FOR wx= w2Lft to w2Rgt LET x = w2Fncx(wx) LET y = fy(eqnum,x) LET wy= w2Wndy(y) PLOT wx,wy; NEXT wx PLOT CALL w2KeepGraphLayer END SUB ! --- w3 graph window --- DECLARE PUBLIC w3Lft,w3Rgt,w3Bas,w3Top,w3Midx,w3Midy DECLARE PUBLIC w3fLft,w3fRgt,w3fBas,w3fTop,w3x0,w3y0 DECLARE PUBLIC w3xFirst, w3xSTik, w3xLTik, w3xLabel, w3xGridstep DECLARE PUBLIC w3yFirst, w3ySTik, w3yLTik, w3yLabel, w3yGridstep DECLARE PUBLIC w3wWid,w3wHgt,w3fWid,w3fHgt DECLARE PUBLIC w3fxRatio,w3fyRatio,w3wxRatio,w3wyRatio,w3Aspect DECLARE PUBLIC w3xPiFlag, w3xMult, w3yPiFlag, w3yMult LET w3Flag = 1 LET w3xPiFlag= 0 LET w3xMult = 1 ! use Pi Symbols LET w3yPiFlag= 1 LET w3yMult = pi ! use Pi Symbols LET w3Lft = w1Lft LET w3Rgt = w1Rgt LET w3Bas = w1Top - wspace LET w3Top = w3Bas - 240 LET w3fLft= w1fLft LET w3fRgt= w1fRgt LET w3fTop= 4 LET w3fBas= 0 LET w3xAx$= "x" ! axis labels LET w3yAx$= "t" LET w3xGridstep= 0 ! horizontal grid intervals LET w3yGridstep= 0 ! vertical grid intervals LET w3xSTik = 0 ! horizontal axis Tik marks LET w3xLTik = 0.5 LET w3xLabel = 0.5 LET w3xFirst = w3fLft LET w3ySTik = 1/4 ! vertical axis Tik marks LET w3yLTik = 1/2 LET w3yLabel = 1 LET w3yFirst = w3fBas ! --- w3 Plane methods --- DECLARE DEF w3Fncx,w3Fncy,w3Wndx,w3Wndy CALL w3Variables SUB w3Init CALL w3DrawPlane(1,1,1) CALL SetTextFont(1,12,"bold") CALL PlotTextLJ(w3Rgt+8,w3y0+3,w3xAx$,xtClr) CALL PlotTextCJ(w3x0,w3Top-10,w3yAx$,white) CALL w3KeepGridLayer CALL w3KeepGraphLayer END SUB SUB w3DrawGraph SET COLOR xtClr FOR wy= w3Top to w3Bas LET y = w3Fncy(wy) LET x = fx(eqnum,y) LET wx= w3Wndx(x) PLOT wx,wy; NEXT wy PLOT CALL w3KeepGraphLayer END SUB ! ------------- popup menus ------------- ! --- m1 menu - equations --- ! --- m1 data --- DECLARE PUBLIC m1Lft, m1Rgt, m1Bas, m1Top DECLARE PUBLIC m1Equation, m1Prefix$, m1Menu1$(), m1tClr DECLARE DEF m1Within MAT redim m1Menu1$(1:2) MAT READ m1Menu1$ DATA "x= cos(t) y= sin(t)" DATA "x= sin(t) y= sin(t)" LET m1Prefix$ = "" LET m1Lft = w2Lft LET m1Top = w3Top LET m1tClr = xyClr LET m1Equation= 1 ! ! --- m2 menu - equations --- ! ! --- m2 data --- ! ! DECLARE PUBLIC m2Lft, m2Rgt, m2Bas, m2Top ! DECLARE PUBLIC m2Equation, m2Prefix$, m2Menu1$(), m2tClr ! DECLARE DEF m2Within ! ! MAT redim m2Menu1$(1:3) ! MAT READ m2Menu1$ ! DATA "sin(x+t) + sin(x-t)" ! DATA "sin(x+t) + sin(2x-t)" ! DATA "sin(x+t) + sin(4x-t)" ! ! LET m2Prefix$ = "y = " ! LET m2Lft = w3Rgt + 60 ! LET m2Top = w3Top ! LET m2tClr = xyClr ! LET m2Equation= 1 ! --- buttons --- LET bhgt = 18 LET bstep= bhgt + 2 LET bwid = 105 LET bcnt = 3 LET hgt = (bcnt-1)*bstep + bhgt ! LET blft = worklft + 25 ! LET brgt = blft + bwid ! LET btop = w1Top ! LET bbas = btop + hgt LET blft = m1Lft LET brgt = blft + bwid LET btop = w3Midy LET bbas = btop + hgt LET pclft= brgt - 75 LET pcrgt= brgt LET pctop= w1Bas-bstep-bhgt LET pcbas= pctop+bhgt SUB Buttons CALL SetTextFont(1,12,"bold") FOR button= 0 to bcnt-1 LET bt= btop + button*bstep LET bb= bt+bhgt SELECT CASE button CASE 0 LET label$= "draw x" CASE 1 LET label$= "draw y" CASE 2 LET label$= "draw x and y" END SELECT CALL DrawButton(blft,brgt,bb,bt,6,label$) NEXT button END SUB SUB PauseButtonDraw CALL SetTextFont(1,12,"bold") CALL DrawButton(pclft,pcrgt,pcbas,pctop,6,"pause") END SUB SUB ContinueButtonDraw CALL SetTextFont(1,12,"bold") CALL DrawButton(pclft,pcrgt,pcbas,pctop,6,"continue") END SUB SUB PauseButtonClear BOX CLEAR pclft,pcrgt,pcbas,pctop END SUB ! --- radio buttons --- DECLARE PUBLIC r1cnt,r1stp,r1siz DECLARE PUBLIC r1lft,r1rgt,r1bas,r1top,r1Name$,r1NameClr DECLARE PUBLIC r1NameList$(),r1ColorList() MAT redim r1NameList$(1:2) MAT READ r1NameList$ DATA "Phase Plane to Time Series","Time Series to Phase Plane" MAT redim r1ColorList(1:2) MAT READ r1ColorList DATA 21,21 LET r1cnt = 2 LET r1Lft = blft LET r1Top = bBas+30 LET r1Name$ = "" LET r1NameClr= 21 DECLARE DEF r1Within CALL r1SetVars ! --- default parameters --- LET r1num = 1 LET DrawMode= r1num LET eqnum,m1Equation= 1 LET btn = -1 CALL InitScreen CALL m1InitMenu1 CALL SetTimer ! --- init screen --- SUB InitScreen BOX CLEAR worklft,workrgt,workbas,worktop CALL w1Init CALL w2Init CALL w3Init CALL SetPlanes CALL r1DrawCheckBoxes CALL r1SetCheckBox(r1num) CALL Buttons CALL m1ResetMenu(menuState) END SUB ! --- event manager --- DO IF ms<>2 then CALL MouseDown(mx,my,ms) END IF IF mx>blft and mxbtop and mypclft and mxpctop and mypclft and mxpctop and my