{-# OPTIONS_GHC -Wall #-} module Main where import SpatialMath ( Xyz(..) ) import Vis ( animate , VisObject(..) , Color , red , blue ) import Physics.Learn.CarrotVec ( Vec , xComp , yComp , zComp , vec , magnitude , (<.>) ) pointList :: [Double] pointList = [-2,0,2] -- samplePoints :: [Vec] -- samplePoints = [vec x y z | x <- [0], y <- [0], z <- [-4,-3.6..4]] samplePoints :: [Vec] samplePoints = [vec x y z | x <- [-2,0,2], y <- [-2,0,2], z <- [-4,-3.6..4]] xyzFromVec :: Vec -> Xyz Double xyzFromVec v = Xyz x y z where x = xComp v y = yComp v z = zComp v thinArrow :: Double -> (Xyz Double) -> Color -> VisObject Double thinArrow l = Arrow (l,10*l) metersPerVPM :: Double metersPerVPM = 1 eArrows :: Double -> [VisObject Double] eArrows t = [Trans (xyzFromVec r) $ thinArrow (metersPerVPM * magnitude e) (xyzFromVec e) blue | (r,e) <- eFields t] eFields :: Double -> [(Vec,Vec)] eFields t = [(r,eField r t) | r <- samplePoints] bArrows :: Double -> [VisObject Double] bArrows t = [Trans (xyzFromVec r) $ thinArrow (metersPerVPM * magnitude b) (xyzFromVec b) red | (r,b) <- bFields t] bFields :: Double -> [(Vec,Vec)] bFields t = [(r,bField r t) | r <- samplePoints] drawFun :: Float -> VisObject Double drawFun time = VisObjects $ eArrows t ++ bArrows t where t = realToFrac time c :: Double c = 1 k :: Vec k = vec 0 0 1 e0 :: Double e0 = 1 eField :: Vec -> Double -> Vec eField r t = vec (e0 * cos (k <.> r - c * magnitude k * t)) 0 0 bField :: Vec -> Double -> Vec bField r t = vec 0 (e0 / c * cos (k <.> r - c * magnitude k * t)) 0 main :: IO () main = animate Nothing "Plane Wave" drawFun