The following is a ( at present unfinished) project to make a graphic-displaying, complex-number calculator, using both the ( a +ib) and ( r, theta) polar notations. It is designed to be self-documanting, rather than for concise efficiency. (ie it 'just grew', and should really be re-written now I know what can be done. I'd love to receive helpful suggestions!
Follow up posts at LB Conforum and LB Community Wiki.
' Complexity3.bas - display of one or two vectors, and various complex functions ' To-do's ' Check all results ' Enable editing of ( r,theta) form to work. ' Correct all displays to "##.##". ' error trap for eg division where both =0 ' Add graphic printout ' Show V1 & V2 along with sum, difference, product, quotient ' Show V1 along with conj. V1, cexp and cln. ' Add ability to rotate V1 by chosen angle ' Add a routine to use mouse to create V1 &/or V2 rather than textboxes ' Add [AboutComplexNumbers] file and link to http://en.wikipedia.org/wiki/Complex_number ' Add [Usage] section ' Add scale factor up/down *2 buttons, and superpose x/y/r min/max ' Add ln/exp possibly. NB Multiple values of roots, etc, eg 1^(1/3) ' Add r theta display of v1 and v2 Done 01/06/10 ' If v2 empty, disable ops needing two vectors nomainwin UpperLeftX = 10 UpperLeftY = 10 WindowWidth =950 WindowHeight =630 menu #w, "Help", "About complex numbers", [AboutComplexNums], "Using this program", [Usage] statictext #w.st1, "Vector 1", 50, 34, 80, 30 statictext #w.st2, "Vector 2", 50, 62, 80, 30 statictext #w.st3, "( a+ib) form ( r, theta) form", 150, 2, 300, 26 textbox #w.tb1, 150, 30, 110, 30 textbox #w.tb2, 150, 60, 110, 30 textbox #w.tb3, 280, 30, 140, 30 textbox #w.tb4, 280, 60, 140, 30 texteditor #w.te, 10, 130, 470, 280 graphicbox #w.g1, 500, 10, 400, 400 button #w.b1, "Read the displayed vectors", [ReadVectors], UL, 150, 96 button #w.b2, "Vector 1", [DisplayV1], UL, 20, 440 button #w.b3, "Vector 2", [DisplayV2], UL, 190, 440 button #w.b4, "Conj. Vector 1", [ConjV1], UL, 20, 480, 90, 30 button #w.b9, "Exp( Vector 1)", [ExpV1], UL, 20, 510, 90, 30 button #w.b10,"Ln( Vector 1) ", [LnV1], UL, 20, 540, 90, 30 button #w.b5, "Sum vectors", [V1PlusV2], UL, 320, 440, 90, 30 button #w.b6, "Diff'ce vectors", [V1MinusV2], UL, 450, 440, 90, 30 button #w.b7, "V1 times V2", [V1TimesV2], UL, 600, 440, 90, 30 button #w.b8, "V1 divided by V2", [V1DivV2], UL, 720, 440, 90, 30 open "Complex numbers- display and calculate" for window as #w #w, "trapclose [quit]" #w.g1, "when leftButtonMove [paint]" #w.te, "!font courier 14 bold" #w.st1, "!font arial 16" #w.st2, "!font arial 16" #w.st3, "!font arial 16" #w.tb1, "!font arial 16" #w.tb2, "!font arial 16" #w.tb3, "!font arial 16" #w.tb4, "!font arial 16" #w.tb1, "2+i3" #w.tb2, "3+i-5" #w.tb3, "3.6,0.98" #w.tb4, "5.83,-1.03" #w.b2, "!disable" #w.b3, "!disable" #w.b4, "!disable" #w.b5, "!disable" #w.b6, "!disable" #w.b7, "!disable" #w.b8, "!disable" #w.b9, "!disable" #w.b10,"!disable" gosub [axes] wait [paint] #w.g1, "set "; MouseX; " "; MouseY ' This will become routine to drag to new end-point... wait [ReadVectors] #w.g1, "drawbmp display 0 0" #w.tb1, "!contents? a$"; #w.tb2, "!contents? b$"; #w.te, "" #w.te, " Magnitude of vector 1 is "; mag$( a$) #w.te, " Real part of vector 1 is "; real( a$) #w.te, " Imag. part of vector 1 is "; imag( a$) #w.te, " Angle acw. of vector 1 is "; theta( a$); " radians." #w.te, "" #w.te, " Magnitude of vector 2 is "; mag$( b$) #w.te, " Real part of vector 2 is "; real( b$) #w.te, " Imag. part of vector 2 is "; imag( b$) #w.te, " Angle aw. of vector 2 is "; theta( b$); " radians." #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( a$); " "; 200 -20 *imag( a$); " ; up" #w.g1, " goto 200 200 ; color darkblue ; down ; goto "; 200 +20 *real( b$); " "; 200 -20 *imag( b$); " ; up" #w.b2, "!enable" #w.b3, "!enable" #w.b4, "!enable" #w.b5, "!enable" #w.b6, "!enable" #w.b7, "!enable" #w.b8, "!enable" #w.b9, "!enable" #w.b10,"!enable" wait [DisplayV1] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Vector 1 only" #w.te, " Vector 1 equals "; a$ #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( a$); " "; 200 -20 *imag( a$); " ; up" wait [DisplayV2] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Vector 2 only" #w.te, " Vector 2 equals "; b$ #w.g1, " goto 200 200 ; color darkblue ; down ; goto "; 200 +20 *real( b$); " "; 200 -20 *imag( b$); " ; up" wait [ConjV1] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Conjugate of vector 1" #w.te, " Conj. "; a$; " equals "; using( "##.##", real( conj$( a$))); "+i"; using( "##.##", imag( conj$( a$))) #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( a$); " "; 200 +20 *imag( a$); " ; up" wait [ExpV1] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Exp( vector 1)" #w.te, " Exp( "; a$; ") equals "; using( "##.##", real( cexp$( a$))); "+i"; using( "##.##", imag( cexp$( a$))) #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( cexp$( a$)); " "; 200 +20 *imag( cexp$(a$)); " ; up" wait [LnV1] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Ln( vector 1)" #w.te, " Ln( "; a$; ") equals "; using( "##.##", real( cln$( a$))); "+i"; using( "##.##", imag( cln$( a$))) #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( cln$( a$)); " "; 200 +20 *imag( cln$(a$)); " ; up" wait [V1PlusV2] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Sum of vectors 1 and 2" #w.te, " "; a$; " plus "; b$; " equals "; real #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( cadd$( a$, b$)); " "; 200 +20 *imag( cadd$( a$, b$)); " ; up" wait [V1MinusV2] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Vector 1 minus vector 2" #w.te, " "; a$; " minus "; b$; " equals "; csub$( a$, b$) #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( csub$( a$, b$)); " "; 200 +20 *imag( csub$( a$, b$)); " ; up" wait [V1TimesV2] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Product of vector 1 and 2" #w.te, " "; a$; " times "; b$; " equals "; cmul$( a$, b$) #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( cmul$( a$, b$)); " "; 200 +20 *imag( cmul$( a$, b$)); " ; up" wait [V1DivV2] #w.g1, "drawbmp display 0 0" #w.te, "!cls" #w.te, " Vector 1 divided by vector 2" #w.te, " "; a$; " div'd by "; b$; " equals "; cdiv$( a$, b$) #w.g1, "size 4 ; goto 200 200 ; color red ; down ; goto "; 200 +20 *real( cdiv$( a$, b$)); " "; 200 +20 *imag( cdiv$( a$, b$)); " ; up" wait [quit] close #w end [axes] #w.g1, "color lightgray ; down ; size 2 ; fill cyan" for y =-10 to 10 #w.g1, "up ; goto 0 "; 200 +y *20; " 0 ; down ; goto 400 "; 200 +y *20 next y for x =-10 to 10 #w.g1, "up ; goto "; 200 +x *20; " 0 ; down ; goto "; 200 +x *20; " 400" next x #w.g1, "size 6 ; goto 400 200 ; down ; color black ; goto 200 200 ; size 2" for radius =1 to 10 #w.g1, " circle "; radius *20 next radius #w.g1, "getbmp display 0 0 400 400" bmpsave "display", "display.bmp" return ' Use atan2 so angles are not ambiguous function atan2( y, x) if x >0 then at =atn( y /x) if y >=0 and x <0 then at =atn( y /x) +pi if y <0 and x <0 then at =atn( y /x) -pi if y >0 and x =0 then at = pi /2 if y <0 and x =0 then at = 0 -pi /2 if y =0 and x =0 then notice "undefined": end atan2 =at end function ' ___________ functions of one complex number __________________ function real( c$) ' Separate out the real value p =instr( c$, "+") r =val( left$( c$, p -1)) real =r end function function imag( c$) ' and the complex one. p =instr( c$, "+") i =val( mid$( c$, p +2)) imag =i end function function theta( c$) ' Find acw angle to the vector. p =instr( c$, "+") r =val( left$( c$, p -1)) i =val( mid$( c$, p +2)) theta =atan2( i, r) theta =0.01 *int( 100 *theta) end function function conj$( c$) ' Conjugate of a+ib is a-ib. p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) conj$ =str$( realc) +"+i" +str$( -1 *imagc) end function function mag$( c$) ' Magnitude is the length of the vector p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) mag =( realc^2 +imagc^2)^0.5 mag$ =using( "##.###", mag) end function function cexp$( c$) ' exp( a +ib) =exp( a) *exp( ib) ????? p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) cexp$ =str$( exp( realc) *cos( imagc)) +"+i" +str$( exp( realc) *sin( imagc)) end function function cln$( c$) ' ??????? p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) cln$ ="" end function ' _____________________ functions of two complex numbers ___________________________________ function cmul$( c$, d$) p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) p =instr( d$, "+") reald =val( left$( d$, p -1)) imagd =val( mid$( d$, p +2)) cmul$ =str$( realc *reald -imagc *imagd) +"+i" +str$( 2 *imagc +imagd) end function function cdiv$( c$, d$) p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) p =instr( d$, "+") reald =val( left$( d$, p -1)) imagd =val( mid$( d$, p +2)) q =reald^2 +imagd^2 rp =( realc *reald +imagc *imagd) /q ip =( imagc *reald -realc *imagd) /q cdiv$ =str$( rp) +"+i" +str$( ip) end function function cadd$( c$, d$) p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) p =instr( d$, "+") reald =val( left$( d$, p -1)) imagd =val( mid$( d$, p +2)) cadd$ =str$( realc +reald) +"+i" +str$( imagc +imagd) end function function csub$( c$, d$) p =instr( c$, "+") realc =val( left$( c$, p -1)) imagc =val( mid$( c$, p +2)) p =instr( d$, "+") reald =val( left$( d$, p -1)) imagd =val( mid$( d$, p +2)) csub$ =str$( realc -reald) +"+i" +str$( imagc -imagd) end function