From 0d29c786dbfa412a836e590cdf2ff847836ad118 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Thu, 14 Nov 2024 15:46:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D0=BF=D0=BE=D1=80=D0=BE=D1=82?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=20=D0=B1=D0=B5=D0=B7=20=D0=BC=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/fern/fern_simple.hs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 lab2/fern/fern_simple.hs diff --git a/lab2/fern/fern_simple.hs b/lab2/fern/fern_simple.hs new file mode 100644 index 0000000..6e9ff44 --- /dev/null +++ b/lab2/fern/fern_simple.hs @@ -0,0 +1,39 @@ +import System.Random (StdGen, mkStdGen, randomR) + +type Point = (Float, Float) + +transformation1 :: Point -> Point +transformation1 (_, y) = (0, 0.16 * y) + +transformation2 :: Point -> Point +transformation2 (x, y) = (0.85 * x + 0.04 * y, -0.04 * x + 0.85 * y + 1.6) + +transformation3 :: Point -> Point +transformation3 (x, y) = (0.2 * x - 0.26 * y, 0.23 * x + 0.22 * y + 1.6) + +transformation4 :: Point -> Point +transformation4 (x, y) = (-0.15 * x + 0.28 * y, 0.26 * x + 0.24 * y + 0.44) + +applyTransformation :: Point -> Float -> Point +applyTransformation point random + | random < 0.01 = transformation1 point + | random < 0.86 = transformation2 point + | random < 0.93 = transformation3 point + | otherwise = transformation4 point + +genNextPoint :: StdGen -> Point -> (Point, StdGen) +genNextPoint gen point = + let (random, newGen) = randomR (0.0, 1.0 :: Float) gen + in (applyTransformation point random, newGen) + +barnsleyFern :: StdGen -> Point -> Int -> [Point] +barnsleyFern _ _ 0 = [] +barnsleyFern gen startPoint n = + let (nextPoint, newGen) = genNextPoint gen startPoint + in startPoint : barnsleyFern newGen nextPoint (n - 1) + + +n = 1000 + +main :: IO () +main = print $ barnsleyFern (mkStdGen 42) (0, 0) n