module Main where
import qualified Data.Number.ER.Real as AERN
import qualified Data.Number.ER.RnToRm as AERNFunc
import qualified Data.Number.ER.RnToRm.Plot.FnView as FNV
import Control.Concurrent as Concurrent
import Control.Concurrent.STM as STM
import qualified Graphics.UI.Gtk as Gtk
import Graphics.UI.Gtk (AttrOp((:=)))
import qualified Graphics.UI.Gtk.Glade as Glade
import qualified Graphics.UI.Gtk.OpenGL as GtkGL
import qualified Graphics.UI.GLUT as GLUT
type B = AERN.BM
--type B = AERN.BMPFR
type RA = AERN.RA B
type IRA = AERN.IRA B
type FA = AERNFunc.FAPWP B
type Box a = AERNFunc.Box a
type VarID = AERNFunc.VarID
main =
do
AERN.initialiseBaseArithmetic (0 :: RA)
initGtkGL
fadataTV <- newTVarIO faData
fndataTV <- newTVarIO FNV.defaultFnData
fnviewWindow <- FNV.new (fadataTV, fndataTV) Nothing
forkIO $ signalData fndataTV
Gtk.mainGUI
faData =
FNV.defaultFaData
{
FNV.dataFAs = [f1,f2]
}
f1 = AERNFunc.tuple [f11,f12,f13]
f2 = AERNFunc.tuple [f21,f22,f23]
ix1 = 6
ix2 = 12
ix3 = 18
g = AERNFunc.scale 10 x
f11 = AERN.cos ix1 $ g -- cos(10x)
f12 = AERN.cos ix2 $ g -- cos(10x)
f13 = AERN.cos ix3 $ g -- cos(10x)
f21 = AERNFunc.integrateUnary 3 f11 dom 0 [-1] -- integ(cos(10x)) - 1
f22 = AERNFunc.integrateUnary 3 f12 dom 0 [-1] -- integ(cos(10x)) - 1
f23 = AERNFunc.integrateUnary 3 f13 dom 0 [-1] -- integ(cos(10x)) - 1
x :: FA
x =
AERNFunc.bisectUnbisectDepth 5 $
AERNFunc.setMaxDegree 3 $
AERNFunc.proj xdom 0
xdom = AERNFunc.fromAscList [(0, dom)]
const01 :: FA
const01 =
AERNFunc.const xdom [0 AERN.\/ 1]
dom = domL AERN.\/ domR
(domL, domR) = (-1, 1)
(valLO, valHI) = (-2,2)
fnData =
setExtents domL domR valLO valHI $
FNV.defaultFnData
{
FNV.dataFAsUpdated = True,
FNV.dataDomName = "x",
FNV.dataFnNames = ["f1","f2"],
FNV.dataResultNames = [["f11", "f12", "f13"],["f21", "f22", "f23"]],
FNV.dataDefaultEvalPoint = 0
}
setExtents left right bot top fnData =
fnData
{
FNV.dataDomL = td left,
FNV.dataDomR = td right,
FNV.dataValLO = td bot,
FNV.dataValHI = td top,
FNV.dataDefaultPlotParams =
FNV.defaultPlotParams
{
FNV.pltprmCoordSystem =
FNV.CoordSystemLinear $
FNV.Rectangle
(tr $ top + 0.1)
(tr $ bot - 0.1)
(tr $ left - 0.1)
(tr $ right + 0.1)
}
}
where
tr = toRational . td
td = fst . AERN.doubleBounds
initGtkGL =
do
Gtk.initGUI
-- enable multithreaded GUI:
Gtk.timeoutAddFull
(Concurrent.yield >> Concurrent.yield >> Concurrent.yield >> return True)
Gtk.priorityDefaultIdle 20
-- see http://haskell.org/gtk2hs/archives/2005/07/24/writing-multi-threaded-guis/
GtkGL.initGL
GLUT.initialize "AERN Function View" [] -- needed for text in GL canvas
signalData fndataTV =
do
threadDelay 200000 -- 0.2s
atomically $
do
writeTVar fndataTV fnData