Отдельная папка для папоротника

This commit is contained in:
2024-11-09 18:56:31 +03:00
parent af18cc7b28
commit 77f2be8eac
4 changed files with 0 additions and 0 deletions

42
lab2/fern/fern.hs Normal file
View File

@@ -0,0 +1,42 @@
import System.Random (randomRIO)
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 :: (Ord a, Fractional a) => Point -> a -> Point
applyTransformation point random
| random < 0.01 = transformation1 point
| random < 0.86 = transformation2 point
| random < 0.93 = transformation3 point
| otherwise = transformation4 point
genNextPoint :: Point -> IO Point
genNextPoint point = do
random <- randomRIO (0.0, 1.0 :: Float)
return $ applyTransformation point random
barnsleyFern :: Point -> Int -> IO [Point]
barnsleyFern _ 0 = return []
barnsleyFern start n = do
x' <- genNextPoint start
xs <- barnsleyFern x' (n - 1)
return (start : xs)
main :: IO ()
main = do
putStrLn "Укажите количество шагов рекурсии:"
input <- getLine
let n = read input :: Int
fractal <- barnsleyFern (0, 0) n
print fractal