2011-07-10 11:06:37 +00:00
<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "fr" xml:lang = "fr" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" / >
2011-10-26 08:49:00 +00:00
< meta name = "keywords" content = "mandelbrot, haskell, ASCII, golfed" >
2011-07-10 11:06:37 +00:00
< link rel = "shortcut icon" type = "image/x-icon" href = "/Scratch/img/favicon.ico" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/assets/css/main.css" / >
2012-04-02 21:43:39 +00:00
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/solarized.css" / >
2011-07-10 11:06:37 +00:00
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/idc.css" / >
2012-05-02 15:43:56 +00:00
< link href = 'http://fonts.googleapis.com/css?family=Inconsolata' rel = 'stylesheet' type = 'text/css' >
2011-07-10 11:06:37 +00:00
< link rel = "alternate" type = "application/rss+xml" title = "RSS" href = "http://feeds.feedburner.com/yannespositocomfr" / >
< link rel = "alternate" lang = "fr" xml:lang = "fr" title = "Mandelbrot avec haskell" type = "text/html" hreflang = "fr" href = "/Scratch/fr/blog/Haskell-Mandelbrot/" / >
< link rel = "alternate" lang = "en" xml:lang = "en" title = "ASCII Haskell Mandelbrot" type = "text/html" hreflang = "en" href = "/Scratch/en/blog/Haskell-Mandelbrot/" / >
< script type = "text/javascript" src = "/Scratch/js/jquery-1.3.1.min.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/jquery.cookie.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/index.js" > < / script >
2012-05-02 15:43:56 +00:00
< script type = "text/javascript" src = "/Scratch/js/highlight/highlight.pack.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/article.js" > < / script >
2011-07-10 11:06:37 +00:00
<!-- [if lt IE 9]>
< script src = "http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" > < / script >
<![endif]-->
< title > Mandelbrot avec haskell< / title >
< / head >
2011-10-18 22:30:00 +00:00
< body lang = "fr" class = "article" >
2011-07-10 11:06:37 +00:00
< script type = "text/javascript" > / / < ! [ C D A T A [
document.write('< div id = "blackpage" > < img src = "/Scratch/img/loading.gif" alt = "Chargement en cours..." / > < / div > ');
// ]]>
< / script >
< div id = "content" >
< div id = "choix" >
< div class = "return" > < a href = "#entete" > ↓ Menu ↓ < / a > < / div >
< div id = "choixlang" >
< a href = "/Scratch/en/blog/Haskell-Mandelbrot/" onclick = "setLanguage('en')" > in English< / a >
< / div >
2011-09-28 16:05:55 +00:00
< div class = "flush" > < / div >
2011-07-10 11:06:37 +00:00
< / div >
< div id = "titre" >
< h1 >
Mandelbrot avec haskell
< / h1 >
< / div >
< div class = "flush" > < / div >
< div class = "flush" > < / div >
< div id = "afterheader" >
< div class = "corps" >
2012-05-03 09:21:34 +00:00
< p > Voici le code “ obfusqué” :< / p >
2012-05-02 15:43:56 +00:00
< div class = "codefile" > < a href = "/Scratch/fr/blog/Haskell-Mandelbrot/code/animandel.hs" > ➥ animandel.hs< / a > < / div >
< pre > < code class = "haskell" > a=27;b=79;c=C(-2.0,-1.0);d=C(1.0,1.0);e=C(-2.501,-1.003)
newtype C = C (Double,Double) deriving (Show,Eq)
instance Num C where C(x,y)*C(z,t)=C(z*x-y*t,y*z+x*t);C(x,y)+C(z,t)=C(x+z,y+t);abs(C(x,y))=C(sqrt(x*x+y*y),0.0)
r(C(x,y))=x;i(C(x,y))=y
f c z 0=0;f c z n=if(r(abs(z))> 2)then n else f c ((z*z)+c) (n-1)
h j k = map (\z-> (f (C z) (C(0,0)) 32,(fst z> l - q/2))) [(x,y)|y< -[p,(p+((o-p)/a))..o],x< -[m,(m + q)..l]] where o=i k;p=i j;m=r j;l=r k;q=(l-m)/b
u j k = concat $ map v $ h j k where v (i,p)=(" .,`'°\":;-+oO0123456789=!%*§& $@#"!!i):rst p;rst True="\n";rst False=""
main = putStrLn $ im 0 where cl n (C (x,y))=let cs=(1.1**n-1) in C ((x+cs*(r e))/cs+1,(y+cs*(i e))/cs+1);bl n=cl n c;tr n=cl n d;im n=u (bl n) (tr n)++"\x1b[H\x1b[25A"++im (n+1)
< / code > < / pre >
2011-07-10 11:06:37 +00:00
< p > Pour le lancer, < a href = "http://haskell.org" > haskell< / a > doit être installé. Puis vous devez écrire dans un terminal :< / p >
2012-05-02 15:43:56 +00:00
< pre > < code class = "zsh" > ghc --make animandel.hs & & animandel< / code > < / pre >
2011-07-10 11:06:37 +00:00
< p > Voici le résultat après 50 itérations.< / p >
2011-07-30 23:44:55 +00:00
< pre >
###@@@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & WWOOClbUOWW& & $$$$$$$$$$$$$$
##@@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & &WWUCUb; ,jUOWW& & & $$$$$$$$$$$$
#@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & WWWWWUb ooCWW& & & & & & $$$$$$$$
@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & WWWWWWWWOU uUOWWWW& & & & & & $$$$$
@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & WOUObUOOOUUUCbi rbCUUUOWWWWWOUW& $$$
@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & WWWUcr,iiCb o wUUUUUC;OW& $$
$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & WWWWOUC, j llW& & $
$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & & & WWWWWWOCCbi bWWW& &
$$$$$$$$$$$$$$$$$& & WWWWWWW& & & WWWWWWWWOUo jUOWW& &
$$$$$$$$$$$$$$& & & WWOwOOWWWOUUOWWWWWOOUbw j.blW&
$$$$$$$$$$$& & & & & WWWObiijbUCl bCiUUUUUCj, bOW&
2012-01-11 20:40:22 +00:00
$$$$$$$$$& & & & & & & WWWOUbw ; oobCbl jUWW&
2011-07-30 23:44:55 +00:00
$$$$$$$& & & & & & & WWWWOcbi ij jUW& &
$$$$$& & WWWWWWWOwUUCbw WW& &
WWWOWWWWWWWWWUUbo UWWW& &
: wbUOWW& & &
WWWOWWWWWWWWWUUbo UWWW& &
$$$$$& & WWWWWWWOwUUCbw WW& &
$$$$$$$& & & & & & & WWWWOcbi ij jUW& &
2012-01-11 20:40:22 +00:00
$$$$$$$$$& & & & & & & WWWOUbw ; oobCbl jUWW&
2011-07-30 23:44:55 +00:00
$$$$$$$$$$$& & & & & WWWObiijbUCl bCiUUUUUCj, bOW&
$$$$$$$$$$$$$$& & & WWOwOOWWWOUUOWWWWWOOUbw j.blW&
$$$$$$$$$$$$$$$$$& & WWWWWWW& & & WWWWWWWWOUo jUOWW& &
$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & & & WWWWWWOCCbi bWWW& &
$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & WWWWOUC, j llW& & $
@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & WWWUcr,iiCb o wUUUUUC;OW& $$
2011-07-10 11:06:37 +00:00
< / pre >
< p > Here is the more readable version. I believe with this far more readable version, no more explanation is needed.< / p >
2012-05-02 15:43:56 +00:00
< pre > < code class = "haskell" > nbvert = 30
2011-07-10 11:06:37 +00:00
nbhor = 79
2011-07-12 14:52:43 +00:00
zoomfactor = 1.01
2012-05-02 15:43:56 +00:00
init_bottom_left = C (-2.0,-2.0)
init_top_right = C (3.0,2.0)
interrest = C (-1.713,-0.000)
newtype Complex = C (Float,Float) deriving (Show,Eq)
instance Num Complex where
fromInteger n = C (fromIntegral n,0.0)
C (x,y) * C (z,t) = C (z*x - y*t, y*z + x*t)
C (x,y) + C (z,t) = C (x+z, y+t)
abs (C (x,y)) = C (sqrt (x*x + y*y),0.0)
signum (C (x,y)) = C (signum x , 0.0)
real :: Complex -> Float
real (C (x,y)) = x
im :: Complex -> Float
im (C (x,y)) = y
cabs :: Complex -> Float
cabs = real.abs
f :: Complex -> Complex -> Int -> Int
2011-07-12 14:52:43 +00:00
f c z 0 = 0
2012-05-02 15:43:56 +00:00
f c z n = if (cabs z > 2) then n else f c ((z*z)+c) (n-1)
2011-07-12 14:52:43 +00:00
2011-07-10 11:06:37 +00:00
2012-05-02 15:43:56 +00:00
bmandel bottomleft topright = map (\z -> (f (C z) (C(0,0)) 32, (fst z > right - hstep/2 ))) [(x,y) | y < - [bottom,(bottom + vstep)..top], x< -[left,(left + hstep)..right]]
where
2011-07-10 11:06:37 +00:00
top = im topright
bottom = im bottomleft
left = real bottomleft
right = real topright
vstep=(top-bottom)/nbvert
hstep=(right-left)/nbhor
2012-05-02 15:43:56 +00:00
mandel :: (Complex,Complex) -> String
mandel (bottomleft,topright) = concat $ map treat $ bmandel bottomleft topright
where
treat (i,jump) = " .,:;rcuowijlbCUOW& $@#" !! (div (i*22) 32):rst jump
rst True = "\n"
rst False = ""
2011-07-10 11:06:37 +00:00
2012-05-02 15:43:56 +00:00
cdiv :: Complex -> Float -> Complex
cdiv (C(x,y)) r = C(x/r, y/r)
cmul :: Complex -> Float -> Complex
cmul (C(x,y)) r = C(x*r, y*r)
2011-07-12 14:52:43 +00:00
2012-05-02 15:43:56 +00:00
zoom :: Complex -> Complex -> Complex -> Float -> (Complex,Complex)
2011-07-12 14:52:43 +00:00
zoom bl tr center magn = (f bl, f tr)
2012-05-02 15:43:56 +00:00
where
f point = ((center `cmul` magn) + point ) `cdiv` (magn + 1)
2011-07-12 14:52:43 +00:00
2012-05-02 15:43:56 +00:00
main = do
x < - getContents
putStrLn $ infinitemandel 0
where
2011-07-12 14:52:43 +00:00
window n = zoom init_bottom_left init_top_right interrest (zoomfactor**n)
2012-05-02 15:43:56 +00:00
infinitemandel n = mandel (window n) ++ "\x1b[H\x1b[25A" ++ infinitemandel (n+1)
< / code > < / pre >
2011-07-10 11:06:37 +00:00
< / div >
2012-04-10 13:56:34 +00:00
< div id = "social" >
< div class = "left" > < a href = "https://twitter.com/share" class = "twitter-share-button" data-via = "yogsototh" > Tweet< / a >
< script > ! function ( d , s , id ) { var js , fjs = d . getElementsByTagName ( s ) [ 0 ] ; if ( ! d . getElementById ( id ) ) { js = d . createElement ( s ) ; js . id = id ; js . src = "//platform.twitter.com/widgets.js" ; fjs . parentNode . insertBefore ( js , fjs ) ; } } ( document , "script" , "twitter-wjs" ) ; < / script >
< / div >
< div class = "left" > < div class = "g-plusone" data-size = "medium" data-annotation = "inline" data-width = "106" > < / div >
< script type = "text/javascript" >
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
< / script >
< / div >
< div class = "flush" > < / div >
< / div >
2011-07-10 11:06:37 +00:00
< div id = "choixrss" >
< a id = "rss" href = "http://feeds.feedburner.com/yannespositocomfr" >
s'abonner
< / a >
< / div >
< script type = "text/javascript" >
$(document).ready(function(){
$('#comment').hide();
$('#clickcomment').click(showComments);
});
function showComments() {
$('#comment').show();
$('#clickcomment').fadeOut();
}
2012-04-10 13:56:34 +00:00
document.write('< div id = "clickcomment" > Commentaires & Partage< / div > ');
2011-07-10 11:06:37 +00:00
< / script >
< div class = "flush" > < / div >
2012-04-10 13:56:34 +00:00
2011-07-10 11:06:37 +00:00
< div class = "corps" id = "comment" >
< h2 class = "first" > commentaires< / h2 >
< noscript >
Vous devez activer javascript pour commenter.
< / noscript >
< script type = "text/javascript" >
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
var idcomments_post_id = '/Scratch/fr/blog/Haskell-Mandelbrot/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/fr/blog/Haskell-Mandelbrot/';
< / script >
< span id = "IDCommentsPostTitle" style = "display:none" > < / span >
< script type = 'text/javascript' src = '/Scratch/js/genericCommentWrapperV2.js' > < / script >
< / div >
< div id = "entete" class = "corps_spaced" >
< div id = "liens" >
< ul > < li > < a href = "/Scratch/fr/" > Bienvenue< / a > < / li >
< li > < a href = "/Scratch/fr/blog/" > Blog< / a > < / li >
< li > < a href = "/Scratch/fr/softwares/" > Softwares< / a > < / li >
< li > < a href = "/Scratch/fr/about/" > À propos< / a > < / li > < / ul >
< / div >
< div class = "flush" > < / div >
< hr / >
< div id = "next_before_articles" >
< div id = "previous_articles" >
articles précédents
< div class = "previous_article" >
< a href = "/Scratch/fr/blog/Password-Management/" > < span class = "nicer" > «< / span > Password Management< / a >
< / div >
< div class = "previous_article" >
< a href = "/Scratch/fr/blog/2011-04-20-Now-hosted-on-github/" > < span class = "nicer" > «< / span > Hébergement github< / a >
< / div >
< div class = "previous_article" >
< a href = "/Scratch/fr/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/" > < span class = "nicer" > «< / span > Pourquoi je n'utiliserai pas CoffeeScript (malheureusement)< / a >
< / div >
< / div >
< div id = "next_articles" >
articles suivants
2011-08-17 12:26:41 +00:00
< div class = "next_article" >
< a href = "/Scratch/fr/blog/A-more-convenient-diff/" > Un diff plus pratique < span class = "nicer" > »< / span > < / a >
< / div >
2011-07-10 11:06:37 +00:00
2011-08-24 22:33:06 +00:00
< div class = "next_article" >
2011-08-26 14:42:13 +00:00
< a href = "/Scratch/fr/blog/Learn-Vim-Progressively/" > Apprenez Vim Progressivement < span class = "nicer" > »< / span > < / a >
2011-08-24 22:33:06 +00:00
< / div >
2011-07-10 11:06:37 +00:00
2011-09-06 06:59:30 +00:00
< div class = "next_article" >
2011-09-30 08:16:57 +00:00
< a href = "/Scratch/fr/blog/programming-language-experience/" > Mon expérience avec les languages de programmation < span class = "nicer" > »< / span > < / a >
2011-09-06 06:59:30 +00:00
< / div >
2011-07-10 11:06:37 +00:00
< / div >
< div class = "flush" > < / div >
< / div >
< / div >
< div id = "bottom" >
2012-04-02 21:43:39 +00:00
< div >
2012-04-10 13:56:34 +00:00
< a href = "https://twitter.com/yogsototh" > Follow @yogsototh< / a >
2012-04-02 21:43:39 +00:00
< / div >
2011-07-10 11:06:37 +00:00
< div >
< a rel = "license" href = "http://creativecommons.org/licenses/by-sa/3.0/deed.fr" > Droits de reproduction ©, Yann Esposito< / a >
< / div >
< div id = "lastmod" >
Écrit le : 10/07/2011
2011-11-16 12:14:39 +00:00
modifié le : 26/10/2011
2011-07-10 11:06:37 +00:00
< / div >
< div >
Site entièrement réalisé avec
< a href = "http://www.vim.org" > Vim< / a >
et
< a href = "http://nanoc.stoneship.org" > nanoc< / a >
< / div >
< / div >
< div class = "clear" > < / div >
< / div >
< / body >
< / html >