fern
This commit is contained in:
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
*.exe
|
||||||
|
*.hi
|
||||||
|
*.o
|
||||||
|
*.json
|
||||||
|
other
|
||||||
|
tmp
|
||||||
|
*.txt
|
||||||
|
*.pdf
|
||||||
1
lab2/.ghci
Normal file
1
lab2/.ghci
Normal file
@@ -0,0 +1 @@
|
|||||||
|
:set -interactive-print=UnescapingPrint.uprint
|
||||||
63
lab2/draw_fern.ipynb
Normal file
63
lab2/draw_fern.ipynb
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import matplotlib.pyplot as plt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"with open('test.txt', 'r', encoding='utf-16') as file:\n",
|
||||||
|
" data_str = file.read()\n",
|
||||||
|
"\n",
|
||||||
|
"x, y = list(zip(*eval(data_str)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"plt.figure(figsize=(10, 10))\n",
|
||||||
|
"plt.scatter(x, y, s=0.2, color=\"green\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.11.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 2
|
||||||
|
}
|
||||||
39
lab2/fern.hs
Normal file
39
lab2/fern.hs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
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
|
||||||
|
fractal <- barnsleyFern (0, 0) 1000
|
||||||
|
print fractal
|
||||||
33
lab2/fern_with_mod.hs
Normal file
33
lab2/fern_with_mod.hs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
-- Не работает, потому что важно именно в случайном порядке применять трансформации
|
||||||
|
|
||||||
|
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 -> Int -> Point
|
||||||
|
applyTransformation (x, y) n
|
||||||
|
| r == 0 = transformation1 (x, y)
|
||||||
|
| r <= 85 = transformation2 (x, y)
|
||||||
|
| r <= 92 = transformation3 (x, y)
|
||||||
|
| otherwise = transformation4 (x, y)
|
||||||
|
where
|
||||||
|
r = n `mod` 100
|
||||||
|
|
||||||
|
barnsleyFern :: Point -> Int -> [Point]
|
||||||
|
barnsleyFern _ 0 = []
|
||||||
|
barnsleyFern point n = point : barnsleyFern (applyTransformation point n) (n - 1)
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
let fractal = barnsleyFern (0, 0) 1000
|
||||||
|
print fractal
|
||||||
BIN
lab2/task.jpg
Normal file
BIN
lab2/task.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 153 KiB |
Reference in New Issue
Block a user