<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3013373563559680826</id><updated>2011-05-15T21:36:02.083+03:00</updated><category term='C#'/><category term='fractals'/><category term='мандельброт'/><category term='фракталы'/><title type='text'>Vladimir Sinkov's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sinkov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3013373563559680826/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sinkov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vladimir</name><uri>http://www.blogger.com/profile/06560093645359459054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3013373563559680826.post-378008144885830671</id><published>2011-03-22T23:09:00.012+02:00</published><updated>2011-03-23T08:51:19.719+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='фракталы'/><category scheme='http://www.blogger.com/atom/ns#' term='мандельброт'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='fractals'/><title type='text'>Немного фракталов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;1й пост будет о фракталах.&lt;br /&gt;Небольшая справка: &lt;b&gt;Фрактал&lt;/b&gt;&amp;nbsp; — сложная геометрическая фигура, обладающая свойством самоподобия, то есть составленная из нескольких частей, каждая из которых подобна всей фигуре целиком.&lt;br /&gt;Рассмотрим один из самых простых примеров - &lt;b&gt;множество Мандельброта&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Оно описывается итеративной последовательностью на комплексной плоскости.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/math/7/6/e/76ec70ba23fba8fdcc2a766aa06af7cc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/math/7/6/e/76ec70ba23fba8fdcc2a766aa06af7cc.png" /&gt;&lt;/a&gt;&lt;/div&gt;где С для множества Мандельброта это &lt;span id="goog_875998578"&gt;&lt;/span&gt;&lt;span id="goog_875998579"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/math/6/9/4/694f954cd41cfc590719cc72fe0dd624.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/math/6/9/4/694f954cd41cfc590719cc72fe0dd624.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;x,y координаты текущей точки.&lt;br /&gt;Алгоритм построения до смешного прост, благодаря найденному ещё в начале 20 века условию,&amp;nbsp; как только модуль &lt;img alt="z_n\!" class="tex" src="http://upload.wikimedia.org/math/5/3/f/53f94d9d78d69ee44c88566ae140f8c8.png" /&gt; окажется больше 2, последовательность станет стремиться к бесконечности, т.е. когда сумма квадратов действительной и мнимой частей станут больше 4.&lt;br /&gt;Приведу пример метода на &lt;b&gt;C#&lt;/b&gt; который реализует метод построения данного фрактала, вывод происходит в объект img класса &lt;b&gt;Bitmap&lt;/b&gt;.&lt;br /&gt;&lt;pre&gt;&lt;code class="language-cs"&gt;&lt;br /&gt;public void GenerateMandelbrot(int Radius,int MaxIter,double step)&lt;br /&gt;{&lt;br /&gt;//Помещаем начало координат в середину изображения&lt;br /&gt;int Mx = img.Width / 2;&lt;br /&gt;int My = img.Height / 2;&lt;br /&gt;//Производим проход по каждой точке и определяем принадлежит ли она множеству&lt;br /&gt;for (int y = -My; y &amp;lt; My; y++)&lt;br /&gt;{              &lt;br /&gt;for (int x = -Mx; x &amp;lt; Mx; x++)&lt;br /&gt;{&lt;br /&gt;double r=x*step,im=y*step;// при изменении положения изменяем начальные значения действительной и мнимой частей&lt;br /&gt;int iterations = 0;//обнуляем итерации при перемещении&lt;br /&gt;while (r * r + im * im &amp;lt; Radius * Radius &amp;amp;&amp;amp; iterations&amp;lt;MaxIter)&lt;br /&gt;{&lt;br /&gt;double tmpR = r * r - im * im + x*step;&lt;br /&gt;double tmpIm = 2 * r * im + y*step;&lt;br /&gt;r = tmpR;&lt;br /&gt;im = tmpIm;&lt;br /&gt;iterations++;&lt;br /&gt;}&lt;br /&gt;if (iterations &amp;lt; MaxIter)//В случае если множество ушло в бесконечность делаем пиксель белым&lt;br /&gt;img.SetPixel(Mx + x, My + y, Color.FromArgb(255, 255, 255));&lt;br /&gt;else img.SetPixel(Mx + x, My + y, Color.Black);//Если же он приналежит множеству - чёрным&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Radius&lt;/b&gt; задаёт как раз тот предел выше которого множество уходит в бесконечность;&lt;br /&gt;&lt;b&gt;MaxIter&lt;/b&gt; - максимальное количество итераций после которого мы прерываем наш цикл. Это нужно для нахождения точек принадлежащих множеству, а это точки которые никогда не достигнут предела и не уйдут в бесконечность.&lt;br /&gt;&lt;b&gt;step&lt;/b&gt; - позволяет нам выбирать "увеличение" нашего фрактала. т.к. если мы будем работать с реальными масштабами, то уже на 2м пикселе от начала координат наше множество закончиться.&lt;br /&gt;В цикле мы считаем &lt;b&gt;Z&lt;/b&gt; пока множество не уйдёт в бесконечность или не пройдёт достаточное количество итераций.&lt;br /&gt;В результате для &lt;b&gt;Radius=2,MaxIter=1000,step=0.003&lt;/b&gt; мы получим такую картину&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-CLGeWQ8M7-g/TYkaL3Ns0iI/AAAAAAAAAAM/cTDZduhR1Cg/s1600/2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://lh5.googleusercontent.com/-CLGeWQ8M7-g/TYkaL3Ns0iI/AAAAAAAAAAM/cTDZduhR1Cg/s320/2.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Естественно чем больше количество итераций, тем более точно наше множеству будет соответствовать правильному множеству.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь же я предлагаю расширить наш метод.&lt;br /&gt;И вместо &lt;a href="http://upload.wikimedia.org/math/6/9/4/694f954cd41cfc590719cc72fe0dd624.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/math/6/9/4/694f954cd41cfc590719cc72fe0dd624.png" /&gt;&amp;nbsp;&lt;/a&gt;&lt;br /&gt;подставить&lt;b&gt; С=a+b*i,&lt;/b&gt; которое будет сохранятся константным на всей продолжительности. Также несколько изменим метод окраски. Теперь мы будет красить в 16 оттенков серого. Для этого немного изменим код&lt;br /&gt;&lt;pre&gt;&lt;code class="language-cs"&gt;&lt;br /&gt;public void GenerateMandelbrot(double a,double b,int Radius,int MaxIter,double step)&lt;br /&gt;        {&lt;br /&gt;            int Mx = img.Width / 2;&lt;br /&gt;            int My = img.Height / 2;&lt;br /&gt;            for (int y = -My; y &amp;lt; My; y++)&lt;br /&gt;            {&lt;br /&gt;                &lt;br /&gt;                for (int x = -Mx; x &amp;lt; Mx; x++)&lt;br /&gt;                {&lt;br /&gt;                    double r=x*step,im=y*step;&lt;br /&gt;                    int iterations = 0;&lt;br /&gt;                    while (r * r + im * im &amp;lt; Radius * Radius &amp;amp;&amp;amp; iterations&amp;lt;MaxIter)&lt;br /&gt;                    {&lt;br /&gt;                        double tmpR = r * r - im * im + a;&lt;br /&gt;                        double tmpIm = 2 * r * im + b;&lt;br /&gt;                        r = tmpR;&lt;br /&gt;                        im = tmpIm;&lt;br /&gt;                        iterations++;&lt;br /&gt;                    }&lt;br /&gt;                    if (iterations &amp;lt; MaxIter)&lt;br /&gt;                    //Раскраска 16 оттенками серого&lt;br /&gt;                        img.SetPixel(Mx + x, My + y, Color.FromArgb(255 -&lt;br /&gt;(iterations % 16) * 16, 255 - (iterations % 16) * 16, 255 - (iterations % 16) * 16));&lt;br /&gt;                    else img.SetPixel(Mx + x, My + y, Color.Black);&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Теперь, для&lt;b&gt; a=-1,b=0Radius=2,MaxIter=1000,step=0.003&lt;/b&gt;, мы уже имеем довольно интересный фрактал&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-coxTZNuK11M/TYkeXM0XWQI/AAAAAAAAAAQ/71R-8mZBLWU/s1600/2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://lh5.googleusercontent.com/-coxTZNuK11M/TYkeXM0XWQI/AAAAAAAAAAQ/71R-8mZBLWU/s320/2.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если же ещё немного поиграть со значениями(&lt;b&gt;a=0,b=1,Radius=2,MaxIter=1000,step=0.003&lt;/b&gt;) то можно получить, например, такое&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-d2gyPnbeSqE/TYkeyTYIrrI/AAAAAAAAAAU/2ATB6Gl_Ugk/s1600/2.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="https://lh3.googleusercontent.com/-d2gyPnbeSqE/TYkeyTYIrrI/AAAAAAAAAAU/2ATB6Gl_Ugk/s320/2.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Можно ещё долго эспериментировать со значениями и получать множество красивых фракталов. В следующей статье я попробую рассказать о разных методах раскраски фракталов, для получения действительно красивых изображений.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3013373563559680826-378008144885830671?l=sinkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sinkov.blogspot.com/feeds/378008144885830671/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sinkov.blogspot.com/2011/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3013373563559680826/posts/default/378008144885830671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3013373563559680826/posts/default/378008144885830671'/><link rel='alternate' type='text/html' href='http://sinkov.blogspot.com/2011/03/blog-post.html' title='Немного фракталов'/><author><name>Vladimir</name><uri>http://www.blogger.com/profile/06560093645359459054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-CLGeWQ8M7-g/TYkaL3Ns0iI/AAAAAAAAAAM/cTDZduhR1Cg/s72-c/2.bmp' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
