{-# LANGUAGE NoMonomorphismRestriction #-} import qualified Data.Set as S main = narisavatKvadratiki narisavatKvadratiki = flip mapM_ [razmer,razmer-odin.. -razmer] $ \yKoordinata -> flip mapM_ [-razmer..razmer] (\xKoordinata -> putStr [if S.member [xKoordinata,yKoordinata] treugolnichki then chornayaTochka else pusto ,pusto]) >> putChar novayaLiniya where treugolnichki = S.fromList $ popravitj $ zaeboshitTreugolnichki 3 [[razmer*cos ugol,razmer*sin ugol] | ugol <- [pi/2,pi/2+2*pi/3,pi/2+4*pi/3]] zaeboshitTreugolnichki glubina koordinati@[verx,levo,pravo] | glubina==nolj = [] | otherwise = (obzmeitj koordinati >>= uncurry zaeboshitLiniyu) ++ ([[verx,verxlevo,pravoverx], [verxlevo,levo,levopravo], [pravoverx,levopravo,pravo]] >>= zaeboshitTreugolnichki (glubina-odin)) where [verxlevo,levopravo,pravoverx] = map (uncurry srednyaaTochka) (obzmeitj koordinati) zaeboshitLiniyu odin dva = [zipWith (+) odin [dlina*cos ugol,dlina*sin ugol] | dlina <- [nolj,prirashenie..rasstojanie]] where ugol = vicheslitUgol odin dva rasstojanie = vicheslitRasstoyanie odin dva vicheslitRasstoyanie [xKoordinata1,yKoordinata1] [xKoordinata2,yKoordinata2] = sqrt $ (xKoordinata1-xKoordinata2)^dva + (yKoordinata1-yKoordinata2)^dva vicheslitUgol [xKoordinata1,yKoordinata1] [xKoordinata2,yKoordinata2] = atan2 (yKoordinata2-yKoordinata1) (xKoordinata2-xKoordinata1) srednyaaTochka [xKoordinata1,yKoordinata1] [xKoordinata2,yKoordinata2] = [(xKoordinata1+xKoordinata2)/dva,(yKoordinata1+yKoordinata2)/dva] obzmeitj spisok = zip spisok (tail spisok) ++ [(head spisok,last spisok)] popravitj = map (map round) razmer = 20 prirashenie = 0.3 nolj:odin:dva:_ = [0..] nachalo = [nolj,nolj] [chornayaTochka,pusto,novayaLiniya] = "# \n"