module Lib
( points
, slopeField
) where
import Numeric.MathExpr
import Data.Default.Class
type Range = (Int, Int)
points :: Range -> [(Double, Double)]
points (lower, upper) =
let range = [lower..upper]
in [ (fromIntegral x, fromIntegral y) | x <- range, y <- range ]
slopeField :: String -> [(Double, Double)] -> Double -> [((Double, Double), (Double, Double))]
slopeField math pts diff =
let d x y = evaluate def math [("x", x), ("y", y)]
half = diff / 2
res = map (\(x, y) -> ((x half, y), (half, d x y * diff))) pts
inf = 1/0
noinf = filter (\((x0, y0), (x, y)) -> x < inf && y < inf && x > inf && y > inf) res
(minx, miny) = head pts
(maxx, maxy) = last pts
limitX = min maxx . max minx
limitY = min maxy . max miny
in map (\((x0, y0), (x1, y1)) -> ((limitX x0, limitY y0), (limitX x1, limitY y1))) noinf