Scripts/QuadExplorer
< Scripts
Jump to navigation
Jump to search
Download this script: File:Quadexplorer.ijs
NB. quadexplorer.ijs Quadratic Equation Explorer NB. See INFOTEXT at end of this file. NB. Things we need... require 'files isigraph numeric plot' NB. Define this class (see end of script for invocation) coclass 'quadExplorer' NB. ========================================================= NB. NB. 2005-02-06 1.00 KF Initial Release NB. 2005-02-07 1.01 KF Plot reset and other fixes suggested NB. by Oleg Kobchenko on J Forum NB. (Actually a major refactoring, NB. and coding style change. NB. also much faster due to pd reset) NB. 2005-02-09 1.02 KF Minor improvement, enterable data NB. runs under Java version NB. 2005-02-14 1.03 KF Format equation display and NB. factorized display NB. 2007-06-02 2.00 KF J6.01 NB. ========================================================= NB. QUADVER=: 2.00 TITLE=: 'Quadratic Explorer V',(4j2 ": QUADVER) NB. ========================================================= NB. Form definition QUADFORM=: 0 : 0 pc quadform closeok; menupop "&Options"; menu reset "&Reset" "" "" ""; menusep; menu clip "&Copy to Clipboard" "" "" ""; menu saveeps "Save as &EPS" "" "" ""; menu savepdf "Save as &PDF" "" "" ""; menu print "P&rint" "" "" ""; menusep; menu about "&About" "" "" ""; menusep; menu exit "E&xit" "" "" ""; menupopz; xywh 0 0 260 260;cc plotq isigraph; xywh 276 70 130 70;cc quadtext static;cn ""; xywh 276 142 160 8;cc eqninfo1 static;cn ""; xywh 276 152 160 8;cc eqninfo2 static;cn ""; xywh 276 162 160 8;cc eqninfo3 static;cn ""; xywh 276 172 160 8;cc discrinfo static;cn ""; xywh 276 182 160 8;cc rootinfo1 static;cn ""; xywh 276 192 160 8;cc rootinfo2 static;cn ""; xywh 276 202 160 8;cc focallen static;cn ""; xywh 276 212 160 8;cc focalpt static;cn ""; xywh 276 222 160 8;cc vertexpt static;cn ""; xywh 267 4 8 8;cc ax static;cn ""; xywh 274 4 12 8;cc spina spin; xywh 286 2 180 10;cc avalue trackbar tbs_autoticks tbs_both tbs_enableselrange tbs_top; xywh 468 2 30 10;cc avalx edit; xywh 267 16 8 8;cc bx static;cn ""; xywh 274 16 12 8;cc spinb spin; xywh 286 14 180 10;cc bvalue trackbar tbs_autoticks tbs_both tbs_enableselrange tbs_top; xywh 468 14 30 10;cc bvalx edit; xywh 267 28 8 8;cc cx static;cn ""; xywh 274 28 12 8;cc spinc spin; xywh 286 26 180 10;cc cvalue trackbar tbs_autoticks tbs_both tbs_enableselrange tbs_top; xywh 468 26 30 10;cc cvalx edit; xywh 267 40 8 8;cc hx static;cn ""; xywh 274 40 12 8;cc spinh spin; xywh 286 38 180 10;cc hvalue trackbar tbs_autoticks tbs_both tbs_enableselrange tbs_top; xywh 468 38 30 10;cc hvalx edit; xywh 267 52 8 8;cc kx static;cn ""; xywh 274 52 12 8;cc spink spin; xywh 286 50 180 10;cc kvalue trackbar tbs_autoticks tbs_both tbs_enableselrange tbs_top; xywh 468 50 30 10;cc kvalx edit; pas 0 0;pcenter; rem form end; ) NB. ========================================================= NB. Constructor create=: 3 : 0 wd QUADFORM HWND=: wd'qhwndp' wd 'pn *',TITLE NB. Create plot object pl=: conew 'jzplot' PForm__pl=: 'quadform' PFormhwnd__pl=: HWND NB. connect to plot on form PId__pl=: 'plotq' PShow__pl=: 0 wd 'set quadtext *',TEXT1 wd 'set ax *a' wd 'set bx *b' wd 'set cx *c' wd 'set hx *h' wd 'set kx *k' NB. trackbar data tsteps=: 0.1 tcount=: 4 titems=: 2 * tcount % tsteps thighv=: tcount tlowv=: - thighv tmid=: -: titems toffset=: - tmid reset_values '' do_quadratic '' wd 'pshow;' ) NB. ========================================================= NB. Destructor destroy=: 3 : 0 wd 'pclose' codestroy '' ) NB. ========================================================= NB. Formatters - formats sign based on value plusf=: 3 : '((y<0){''+-''),'' '',": |y' minusf=: 3 : '((y<0){''-+''),'' '',": |y' plusfx=: 3 : '((y<0){'' -''),": |y' NB. ========================================================= NB. Reset values reset_values=: 3 : 0 NB. Initial values a=: +: tsteps b=: 0 c=: 0 h=: 0 k=: 0 ) NB. ========================================================= NB. Display Quadratic do_quadratic=: 3 : 0 pd__pl 'reset' set_trackbars '' focalL=: 1 % 4 * a NB. Focal Length focalPY=: k + focalL NB. Focal Point (Y axis) focalL=: | focalL NB. Now make abs value discrim=: (*: b) - (4 * a * c) NB. Discriminant sqrdisc=: %: discrim NB. Square root of Discriminant roota=: ((-b) + sqrdisc) % +: a NB. Roots rootb=: ((-b) - sqrdisc) % +: a wd 'set eqninfo1 *Equation: y = ',(plusfx a),'x^2 ',(plusf b),'x ',(plusf c),' - or -' wd 'set eqninfo2 *Equation: y = ',(plusfx a),'(x ',(minusf h),')^2 ',(plusf k) if. (discrim < 0) +. (a = 0) do. wd 'set eqninfo3 *Not factored, no real roots' else. polyr=: p. c,b,a fx=: >0{polyr fa=: 0{ >1{polyr fb=: 1{ >1{polyr wd 'set eqninfo3 *Factored: y = ',(plusfx fx),'(x ',(minusf fa),')(x ',(minusf fb),')' end. wd 'set discrinfo *Discriminant: = ',(": discrim) wd 'set rootinfo1 *Root 1: = ',(": roota) wd 'set rootinfo2 *Root 2: = ',(": rootb) wd 'set focallen *Focal length: = ',(": focalL) wd 'set focalpt *Focal point: ( ',(": h),' , ',(": focalPY),' )' wd 'set vertexpt *Vertex: ( ',(": h),' , ',(": k),' )' NB. ploting... pd__pl 'textfont arial 36 bold italic' pd__pl 'textcolor darkslateblue' pd__pl 'textc 500 _10x Quadratic Explorer' pd__pl 'new 40x 20x -40x -70x' pd__pl 'xrange _8 8' pd__pl 'yrange _8 8' pd__pl 'ytic 0.5 1' pd__pl 'xtic 0.5 1' x=. steps _8 8 320 pd__pl 'color green,blue,red' pd__pl 'type line;color green' pd__pl x;c + (b * x) + a * *:x pd__pl 'type line;color blue' pd__pl (h,h);(k,focalPY) pd__pl 'type marker;color red' pd__pl (h,h);(focalPY,focalPY) pd__pl 'show' ) NB. ========================================================= NB. set trackbars based on values a,b,c,h,k set_trackbars=: 3 : 0 wd 'set avalx *',(0j5": a) wd 'set bvalx *',(0j5": b) wd 'set cvalx *',(0j5": c) wd 'set hvalx *',(0j5": h) wd 'set kvalx *',(0j5": k) apos=: 0 >. titems <. tmid + a % tsteps bpos=: 0 >. titems <. tmid + b % tsteps cpos=: 0 >. titems <. tmid + c % tsteps hpos=: 0 >. titems <. tmid + h % tsteps kpos=: 0 >. titems <. tmid + k % tsteps wd 'set avalue 0 ', (4j0":apos) ,' ', (0":titems) ,' 1 1' wd 'set bvalue 0 ', (4j0":bpos) ,' ', (0":titems) ,' 1 1' wd 'set cvalue 0 ', (4j0":cpos) ,' ', (0":titems) ,' 1 1' wd 'set hvalue 0 ', (4j0":hpos) ,' ', (0":titems) ,' 1 1' wd 'set kvalue 0 ', (4j0":kpos) ,' ', (0":titems) ,' 1 1' ) NB. ========================================================= NB. Exit buttons quadform_close=: quadform_exit_button=: destroy NB. ========================================================= NB. About message quadform_about_button=: 3 : 0 ver=. 'Quadratic Explorer V',(4j2 ": QUADVER),INFOTEXT wdinfo 'Quadratic Explorer';ver ) NB. ========================================================= NB. Slide controls quadform_avalue_button=: 3 : 0 apos=: ".avalue a=: tsteps * toffset + apos recalc_hk '' do_quadratic '' ) quadform_bvalue_button=: 3 : 0 bpos=: ".bvalue b=: tsteps * toffset + bpos recalc_hk '' do_quadratic '' ) quadform_cvalue_button=: 3 : 0 cpos=: ".cvalue c=: tsteps * toffset + cpos recalc_hk '' do_quadratic '' ) quadform_hvalue_button=: 3 : 0 hpos=: ".hvalue h=: tsteps * toffset + hpos recalc_bc '' do_quadratic '' ) quadform_kvalue_button=: 3 : 0 kpos=: ".kvalue k=: tsteps * toffset + kpos recalc_bc '' do_quadratic '' ) NB. ========================================================= NB. Recalcs recalc_hk=: 3 : 0 NB. implicit change to h and/or k when a,b or c change h=: (-b) % +: a k=: c + (b * h) + a * *:h ) recalc_bc=: 3 : 0 NB. implicit change to b and/or c when h or k change b=: _2 * a * h c=: k + a * *:h ) NB. ========================================================= NB. Spin controls quadform_spina_button=: 3 : 0 apos=: 0 >. titems <. (".avalue) + ".spina a=: tsteps * toffset + apos recalc_hk '' do_quadratic '' ) quadform_spinb_button=: 3 : 0 bpos=: 0 >. titems <. (".bvalue) + ".spinb b=: tsteps * toffset + bpos recalc_hk '' do_quadratic '' ) quadform_spinc_button=: 3 : 0 cpos=: 0 >. titems <. (".cvalue) + ".spinc c=: tsteps * toffset + cpos recalc_hk '' do_quadratic '' ) quadform_spinh_button=: 3 : 0 hpos=: 0 >. titems <. (".hvalue) + ".spinh h=: tsteps * toffset + hpos recalc_bc '' do_quadratic '' ) quadform_spink_button=: 3 : 0 kpos=: 0 >. titems <. (".kvalue) + ".spink k=: tsteps * toffset + kpos recalc_bc '' do_quadratic '' ) NB. ========================================================= NB. Field entry quadform_avalx_button=: 3 : 0 a=: tlowv >. thighv <. 0".avalx recalc_hk '' do_quadratic '' ) quadform_bvalx_button=: 3 : 0 b=: tlowv >. thighv <. 0".bvalx recalc_hk '' do_quadratic '' ) quadform_cvalx_button=: 3 : 0 c=: tlowv >. thighv <. 0".cvalx recalc_hk '' do_quadratic '' ) quadform_hvalx_button=: 3 : 0 h=: tlowv >. thighv <. 0".hvalx recalc_bc '' do_quadratic '' ) quadform_kvalx_button=: 3 : 0 k=: tlowv >. thighv <. 0".kvalx recalc_bc '' do_quadratic '' ) NB. ========================================================= NB. Reset button quadform_reset_button=: 3 : 0 reset_values '' do_quadratic '' ) NB. ========================================================= NB. Output formats NB. do a refresh first (do_quadratic) quadform_clip_button=: 3 : 0 do_quadratic '' pd__pl 'clip' ) quadform_saveeps_button=: 3 : 0 do_quadratic '' pd__pl 'eps' ) quadform_savepdf_button=: 3 : 0 do_quadratic '' pd__pl 'pdf' ) quadform_print_button=: 3 : 0 do_quadratic '' pd__pl 'print' ) NB. ========================================================= NB. Resize quadform_plot_size=: 3 : 0 isi_show__pl 0 ) NB. ========================================================= NB. Key bindings quadform_f1_fkey=: quadform_about_button quadform_f10_fkey=: quadform_saveeps_button quadform_f11_fkey=: quadform_savepdf_button NB. ========================================================= NB. Text block TEXT1=: 0 : 0 Quadratic equations can be expressed as: y =. c + (b * x) + a * *:x i.e. y = ax^2 + bx + c or in the vertex form of y =. k + a * *:(x - h) i.e. y = a(x - h)^2 + k This explorer also shows the vertex (h,k), focal length and focal point of the parabola described by the quadratic equation. Move the slides to change the values of a,b,c,h and k. ) NB. ========================================================= NB. INFOTEXT INFOTEXT=: 0 : 0 A simple tool for exploring quadratic equations. See: http://www.farnik.com Copyright (c) 2005,2007 Kym Farnik (kym@farnik.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS. ) NB. ========================================================= NB. Instantiate the class cocurrent 'base' '' conew 'quadExplorer' NB. end.