Koch curve: Difference between revisions
m
→{{header|Haskell}}: Tidied.
(Added XPL0 example.) |
m (→{{header|Haskell}}: Tidied.) |
||
Line 653:
import Text.Printf (printf)
------------------------ KOCH CURVE ----------------------
kochSnowflake :: Int -> (Float, Float) -> (Float, Float) -> [(Float, Float)]▼
kochSnowflake ::
kochSnowflake n a b = concat $ zipWith (kochCurve n) points (xs ++ [x])▼
Int ->
(Float, Float) ->
(Float, Float) ->
[(Float, Float)]
kochSnowflake n a b =
concat $
where
points@(x : xs) = [a, equilateralApex a b, b]
kochCurve ::
Int ->
(Float, Float) ->
(Float, Float) ->
[(Float, Float)]
kochCurve n ab xy = ab : go n (ab, xy)
where
Line 664 ⟶ 675:
go n (ab, xy) =
let (mp, mq) = midThirdOfLine ab xy
points@(_ : xs) =
mp,
equilateralApex mp mq,
mq,
xy
]
in go (pred n) =<< zip points xs
equilateralApex ::
(Float, Float) ->
(Float, Float) ->
(Float, Float)
equilateralApex = rotatedPoint (pi / 3)
rotatedPoint ::
Float ->
(Float, Float) ->
(Float, Float) ->
(Float, Float)
rotatedPoint theta (ox, oy) (a, b) = (ox + dx, oy - dy)
where
Line 677 ⟶ 701:
rotatedVector :: Float -> (Float, Float) -> (Float, Float)
rotatedVector angle (x, y) =
( x * cos angle - y * sin angle,
x * sin angle + y * cos angle
)
midThirdOfLine ::
midThirdOfLine (a, b) (x, y) = (p, f p)
where
Line 690 ⟶ 717:
-------------------------- TEST ---------------------------
main :: IO ()
main =
main = putStrLn $ svgFromPoints 1024 $ kochSnowflake 4 (200, 600) (800, 600)▼
putStrLn $
svgFromPoints 1024 $
-------------------------- SVG ----------------------------
Line 696 ⟶ 726:
svgFromPoints w xys =
unlines
[ "<svg xmlns=\"http://www.w3.org/2000/svg\"",
unwords
sw,
, "stroke-width=\"2\" stroke=\"red\" fill=\"transparent\"/>"▼
"\"> "
],
"<path d=\"M" <> points <> "\" ",
unwords [
"stroke-width=\"2\"",
"stroke=\"red\"",
],
"</svg>"
]
where
Line 706 ⟶ 745:
showN = printf "%.2g"
points =
( unwords
(unwords . fmap (((++) . showN . fst) <*> ((' ' :) . showN . snd))) xys</lang>▼
. fmap
( ((<>) . showN . fst)
)
)
xys</lang>
=={{header|IS-BASIC}}==
|