accelerate-examples-0.13.0.0: examples/n-body/Gloss/Draw.hs
--
-- Drawing the world as a gloss picture.
--
module Gloss.Draw ( draw )
where
import Config
import Common.Type
import Common.World
import Gloss.Simulate
import Data.Label
import Graphics.Gloss
import qualified Data.Array.Accelerate as A
-- | Draw the simulation, optionally showing the Barnes-Hut tree.
--
draw :: Config -> Simulate -> Picture
draw conf universe
= let
shouldDrawTree = get simulateDrawTree universe
world = get simulateWorld universe
picPoints = Color (makeColor 1 1 1 0.4)
$ Pictures
$ map (drawBody conf)
$ A.toList
$ worldBodies world
picTree = Blank
-- picTree = drawBHTree
-- $ L.buildTree
-- $ map massPointOfBody
-- $ V.toList
-- $ worldBodies world
in Pictures [ if shouldDrawTree
then Color (makeColor 0.5 1.0 0.5 0.2) $ picTree
else Blank
, picPoints ]
{--
-- | Draw a list version Barnes-Hut tree.
drawBHTree :: L.BHTree -> Picture
drawBHTree bht
= drawBHTree' 0 bht
drawBHTree' depth bht
= let
-- The bounding box
L.Box left down right up = L.bhTreeBox bht
[left', down', right', up'] = map realToFrac [left, down, right, up]
picCell = lineLoop [(left', down'), (left', up'), (right', up'), (right', down')]
-- Draw a circle with an area equal to the mass of the centroid.
centroidX = realToFrac $ L.bhTreeCenterX bht
centroidY = realToFrac $ L.bhTreeCenterY bht
centroidMass = L.bhTreeMass bht
circleRadius = realToFrac $ sqrt (centroidMass / pi)
midX = (left' + right') / 2
midY = (up' + down') / 2
picCentroid
| _:_ <- L.bhTreeBranch bht
, depth >= 1
= Color (makeColor 0.5 0.5 1.0 0.4)
$ Pictures
[ Line [(midX, midY), (centroidX, centroidY)]
, Translate centroidX centroidY
$ ThickCircle
(circleRadius * 4 / 2)
(circleRadius * 4) ]
| otherwise
= Blank
-- The complete picture for this cell.
picHere = Pictures [picCentroid, picCell]
-- Pictures of children.
picSubs = map (drawBHTree' (depth + 1))
$ L.bhTreeBranch bht
in Pictures (picHere : picSubs)
--}
-- | Draw a single body. Set the size of the body depending on it's mass, in
-- five size categories.
--
drawBody :: Config -> Body -> Picture
drawBody conf ((position, mass), _, _)
= let sizeMax = get configBodyMass conf / 5
size = 1 `max` mass / sizeMax
in
drawPoint position (size + 1)
-- | Draw a point using a filled circle.
--
drawPoint :: Position -> R -> Picture
drawPoint (x, y, _) size
= Translate (realToFrac x) (realToFrac y)
$ ThickCircle (size / 2) size