packages feed

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