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 ([email protected])
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.