aUCBLogo Demos and Tests / xygraphtest3


be xygraphtest3
   
xy
end

be XYGraph frm width height ~
xmin xmax ymin ymax ticksx ticksy mode
   
local [g mx my mw mh x0 y0 w0 h0 zx zy zx0 zy0 p0 p pz 
      
mouseleft mouseright inmotion c
      
xa ya xxa yya
      
xmin0 xmax0 ymin0 ymax0
      
maxx maxy]
   
g=(Graph frm
      
wxDefault_Frame_Style+wxFull_Repaint_on_Resize ;+wxStay_on_Top 
      
[0 0List width height [Graph])
;g=[]
   
setUpdateGraph false
   
hideTurtle

   
mx=0
   
my=0
   
x0=0
   
y0=0
   
mw=0
   
mh=0
   
w0=0
   
h0=0
   
zx=1
   
zy=1
   
zx0=1
   
zy0=1
   
c=0
   
p0=[0 0 0]
   
p=[0 0 0]
   
pz=[0 0 0]
   
mouseleft=false
   
mouseright=false
   
inmotion=false
   
   
yminh=ymax
   
ymax=ymin
   
ymin=yminh
   
   
xminh=xmax
   
xmax=xmin
   
xmin=xminh
   
   
xmin0=xmin
   
xmax0=xmax
   
ymin0=ymin
   
ymax0=ymax
   
maxx=330
   
maxy=250
   
   
be init
      
WindowOnLeftDown g
      
[
         
if not mouseleft
         
[   GraphSetCurrent g
            
p0=MousePos+p
            
x0=p0.1+mx
            
y0=p0.2+my
            
mouseleft=true
         
]
      
]
      
WindowOnLeftUp g
      
[
         
mouseleft=false
         
GraphSetCurrent g
         
p0=p0-MousePos+p
         
mx=p.1
         
my=p.2
      
]
      
WindowOnRightDown g
      
[
         
if not mouseright
         
[   GraphSetCurrent g
            
p0=MousePos+pz
            
w0=p0.1+mw
            
h0=p0.2+mh
            
mouseright=true
         
]
      
]
      
WindowOnRightUp g
      
[
         
mouseright=false
         
GraphSetCurrent g
         
p0=p0-MousePos+pz
         
mw=p.1
         
mh=p.2
         
zx0=zx0*(1+mw/800)
         
zy0=zy0*(1+mh/600)
      
]
;comment [
      
WindowOnMotion g
      
[
         
if mouseleft and2 not inmotion
         
[   GraphSetCurrent g
            
p=p0-MousePos
            
mx=p.1
            
my=p.2
            
xmin=(xmin0+xmax0)/2-(xmax0-xmin0)/2*zx-mx/maxx*(xmax0-xmin0)
            
xmax=(xmin0+xmax0)/2+(xmax0-xmin0)/2*zx-mx/maxx*(xmax0-xmin0)
            
ymin=(ymin0+ymax0)/2-(ymax0-ymin0)/2*zy-my/maxy*(ymax0-ymin0)
            
ymax=(ymin0+ymax0)/2+(ymax0-ymin0)/2*zy-my/maxy*(ymax0-ymin0)
            
clearScreen
            
drawplot
            
updateGraph
         
]
         
if mouseright and2 not inmotion
         
[   GraphSetCurrent g
            
pz=p0-MousePos
            
mw=pz.1
            
mh=pz.2
            
zx=zx0*(1+mw/800)
            
zy=zy0*(1+mh/600)
            
xmin=(xmin0+xmax0)/2-(xmax0-xmin0)/2*zx-mx/maxx*(xmax0-xmin0)
            
xmax=(xmin0+xmax0)/2+(xmax0-xmin0)/2*zx-mx/maxx*(xmax0-xmin0)
            
ymin=(ymin0+ymax0)/2-(ymax0-ymin0)/2*zy-my/maxy*(ymax0-ymin0)
            
ymax=(ymin0+ymax0)/2+(ymax0-ymin0)/2*zy-my/maxy*(ymax0-ymin0)
            
clearScreen
            
drawplot
            
updateGraph
         
]
      
]
;]
   
end
   
   
be plot xa_ ya_ c_
      
xa=xa_
      
ya=ya_
      
c=c_
      
drawplot
   
end
      
   
be drawplot
      
local [x y y2 i w hq wq hx hy rx ry]
      
WindowMode
      
setPenSize [.5 .5]
      
setPC 0
      
PenUp
      
setXY -maxx -maxy
      
PenDown
      
setY  maxy
      
setX  maxx
      
setY -maxy
      
setX -maxx
      
tick=10
      
txtx=25
      
setH 90
      
setLabelSize [25 25]
      
setLabelAlign 0 0
      
setPrintPrecision 4
      
setLabelFont "Times
      
h=ymax-ymin
      
hq=(ymax0-ymin0)*2^(round -0.5+(ln abs h/(abs ymax0-ymin0))/ln 2)
      
w=xmax-xmin
      
wq=(xmax0-xmin0)*2^(int -0.5+(ln abs w/(abs xmax0-xmin0))/ln 2)
      
for [-ticksy ticksy]
      
[   
         
hy=-hq*(y/ticksy-0.5)
         
hy=hy+(remainder -(ymax+ymin)/hq/ticksy)
         
ry=hy+(ymax+ymin)/2
         
hy=-hy*maxy*2/h
         
if hy maxy or2 hy < -maxy [continueLoop]
;(pr maxy h hy)
;if this == xy::g3 [pr hy]
         
setY hy
         
PenDown
         
setX -maxx+tick
         
setX -maxx
         
PenUp
         
setX maxx-tick 
         
PenDown
         
setX maxx
         
PenUp
         
setX -maxx-txtx
         
Label ry
;pr ry
         
setX -maxx
      
]
      
setY -maxy
      
for [-ticksx 2*ticksx]
      
[   hx=-wq*(x/ticksx-0.5)
         
hx=hx+(remainder -(xmax+xmin)/wq/ticksx)
         
rx=hx+(xmax+xmin)/2
         
hx=-hx*maxx*2/w
         
if hx maxx or2 hx < -maxx [continueLoop]
         
setX hx
         
PenDown
         
setY -maxy+tick
         
setY -maxy
         
PenUp
         
setY maxy-tick
         
PenDown
         
setY maxy
         
PenUp
         
setY -maxy-txtx
         
label rx
         
setY -maxy
      
]
      
setPenSize [0 0]
      
x=(xmax+xmin)/2
      
y=(ymax+ymin)/2
      
fx=2/(xmax-xmin)*maxx
      
fy=2/(ymax-ymin)*maxy      
      
xxa=saturateBelow -maxx saturateAbove maxx (-xa+x)*fx
      
yya=saturateBelow -maxy saturateAbove maxy (-ya+y)*fy
      
ifelse mode == "pixels
      
[   setPixelXY xxa yya c
      
][
         
setPC c
         
PenUp
      
;   x=maxx
      ;   repeat count xxa
      ;   [   j=repcount
      ;      if xxa.j < x [x=xxa.j y=yya.j]
      ;   ]
      ;   setXY x y
         
setXY xxa.1 yya.1
         
PenDown
         
setXY xxa yya
         
PenUp
      
]
      
updateGraph
;pause
   
end
   
be clean
      
GraphSetCurrent g
      
clearScreen
   
end
end

be xy
;g3=XYGraph frm 400 300  -400 400 0 10 8 4 "lines
;g3'init
;comment [
   
if not Name? "frm
   
[
      
frm=Frame [][MyFrame]
         
wxResize_Border+wxCaption+wxSystem_Menu+wxClose_Box
         
+wxFull_Repaint_on_Resize
         
;wxDefault_Frame_Style+wxStay_on_Top)
         
[100 100][400 300] 

      
g=XYGraph frm 400 300  -400 400 -300 300 8 6 "lines
      
norefresh
      
g'init
      
box
      
      
g2=XYGraph frm 400 300  -400 400 -150 150 8 4 "lines
      
norefresh
      
g2'init
      
;      g3=XYGraph frm 400 300  -400 400 0 12 8 4 "lines
;      norefresh
;      g3'init

      
;      g4=XYGraph frm 400 300  0 100 0 8000 5 5 "lines
;      norefresh
;      g4'init

      
      
txtRe1=StaticText frm [ContrastRe]
      
txtRe2=StaticText frm [dCRe]
      
txtRe3=StaticText frm [SNRe]
      
txtAbs1=StaticText frm [ContrastAbs]
      
txtAbs2=StaticText frm [dCAbs]
      
txtAbs3=StaticText frm [SNAbs]

      
bs=BoxSizer wxVertical
      
bsh=BoxSizer wxHORIZONTAL
      
BoxSizerAdd bs bsh 400 wxExpand+wxALIGN_CENTER 0
      
bsv=BoxSizer wxVertical
      
bsv2=BoxSizer wxVertical
      
BoxSizerAdd bsh bsv 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsh bsv2 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsv g2'100 wxExpand+wxALIGN_CENTER 0
;      BoxSizerAdd bsv g3'g 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsv2 g'100 wxExpand+wxALIGN_CENTER 0
;      BoxSizerAdd bsv2 g4'g 100 wxExpand+wxALIGN_CENTER 0
      
bst=BoxSizer wxHORIZONTAL
      
BoxSizerAdd bs bst 20 wxExpand+wxALIGN_CENTER 0
      
bsRe =BoxSizer wxVertical
      
bsAbs=BoxSizer wxVertical
      
BoxSizerAdd bst bsRe  20 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bst bsAbs 20 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsRe txtRe1 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsRe txtRe2 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsRe txtRe3 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsAbs txtAbs1 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsAbs txtAbs2 100 wxExpand+wxALIGN_CENTER 0
      
BoxSizerAdd bsAbs txtAbs3 100 wxExpand+wxALIGN_CENTER 0
      
FrameSetSizer frm bs
      
FrameSetClientSize frm 800 800
;      WindowFit frm

      
running=true
      
stopping=false
      
FrameOnClose frm
      
[   running=false
      
]
      
FrameOnChar frm
      
[   running=false
      
]
   
]
;]
   
imax=10000
   
filterpara=imax/10
   
tau=0.1
   
t0=0
   
f=imax*0.182
   
amplitude=10
   
t=rSeqFA -1 1 imax
   
Us=FloatArray imax
   
x=t*400
   
tcmax=100
   
contrastRe=FloatArray tcmax
   
dCRe=0
   
SNRe=0
   
contrastAbs=FloatArray tcmax
   
dCAbs=0
   
SNAbs=0
   
avg=10
   
avnr=0
   
tc=1
   
tca=rseqFA tcmax tcmax
   
setPrintPrecision 3
   
sig=true
   
while [running]
   
[
      
avnr=avnr+0.5
      
ifelse sig
      
[   U=(cos t*360*f)*(exp -sqr (t-t0)/tau)*amplitude
            
+(FloatArray (random iSeqIA 400 400 imax)-200)
         
U.1=0
         
Us=Us+U
      
][   U=(-cos t*360*f)*(exp -sqr (t-t0)/tau)*amplitude
            
+(FloatArray (random iSeqIA 400 400 imax)-200)
         
U.1=0
         
Us=Us-U
      
]
      
Usm=Us/avnr
      
Uqre=lowPassFilter2 Usm*(sin t*360*ffilterpara
      
Uqim=lowPassFilter2 Usm*(cos t*360*ffilterpara
      
Uq  =sqrt (sqr Uqre )+(sqr Uqim )
      
sig=not sig

      
GraphSetCurrent g'g
      
clean
      
(g'plot x Usm HSBA 0 1 0 0.2)

      
GraphSetCurrent g2'g
      
(g2'plot x Uq HSBA 0 1 1 0.1)
      
(g2'plot x Uqre HSBA 240 1 1 0.1)
      
(g2'plot x Uqim HSBA 120 1 1 0.1)

      
dispatchMessages
      
GC
   
]
   
stopping=true
   
pr [;OK] 
   
erase [[][frm g g2]] 
   
GC
end