شما فقط می توانید تا این حد و بدون ذکر فراکتال به هنر ریاضی وارد شوید! به عنوان یک بررسی ، Fractal تصویری است که برای آن Structre در هر سطح وضوح مشهود است.
شاید ساده ترین فراکتال ها با فرآیند بازگشتی یک الگوی خاص ایجاد شوند. بیایید برخی از این تصاویر فریبنده ساده را بررسی کنیم. شما به احتمال زیاد در این کلاس وقت نخواهید داشت تا نقاشی بازگشتی خود را کدگذاری کنید ، اما به شما تشویق می شوید یکی از الگوهای زیر را انتخاب کنید و چند پارامتر را تغییر دهید. هشدار داده شود: هرچه عمق بازگشتی بیشتر باشد ، کد برای اجرای بیشتر طول می کشد!
ساختار اساسی برای هر یک از این برنامه ها بسیار مشابه است ، بنابراین بیایید ابتدا به آن برویم. شما با تابعی شروع می کنید که هر متغیر جهانی را محاسبه کرده و محاسبه می کند و هر مؤلفه غیر معتبری نقاشی را محاسبه می کند. بیایید این عملکرد اصلی را بنامیم. در عملکرد اصلی ، شما یک تابع دوم را یک عملکرد فرعی می نامید. بیایید آن را در برنامه مثال زیر آن را طراحی کرده و آن را به رنگ آبی رنگ کنید. DrainingFunction وظیفه ترسیم ساختار بازگشتی شما را انجام می دهد و به عنوان ورودی تعداد اعلان های مورد نظر شما را می گیرد. سپس ، مهمتر از همه ، Drawing Function خود را صدا می کند. تنها تفاوت این است که خود را با یک تکرار کمتر صدا می کند. بنابراین ، با یک تماس ساده به عملکرد اصلی می توانید یک ساختار فراکتال را ترسیم کنید!
توجه داشته باشید که "کد" که در اینجا می بینید اصلاً کد نیست. این همان چیزی است که ما آن را شبه کد می نامیم. این ساختار برنامه ای را که می خواهیم بنویسیم به ما نشان می دهد ، اما اجرا نمی شود زیرا جزئیات پر نشده است.
عملکرد اصلی عملکرد (TotalNumberOfiterations) متغیرها ممکن است چیزی را ترسیم کنند (TotalNumberOfIterations)
عملکرد طراحی (باقیمانده) کار را ترسیم کرد DraindFunction (باقیماند ه-1) پایان پایان
مثلث فراکتالی
برای این مثال ، ما دوباره قدرت چرخش را مهار می کنیم! ما می خواهیم یک مثلث با محوریت منشاء [0] بکشیم. از آنجا که می دانیم که سه نقطه مثلث دو طرفه با 120 درجه از هم جدا شده است ، می توانیم به سادگی اولین امتیاز خود را بچرخانیم تا امتیازهای دوم و سوم خود را بدست آوریم. سپس ما به سادگی خطوط بین آنها را با استفاده از دستور plot ترسیم می کنیم.
خوب ، پس حالا بیایید این را یک فراکتال کنیم. ما می خواهیم مثلث را با هر تکرار بچرخانیم و همچنین آن را کمی کوچک کنیم. بنابراین زیر عملکرد ما بر اساس پارامترهای طول و زاویه فعلی ، سه نقطه مثلث فعلی را محاسبه می کند و مثلث را در بالای مثلث های موجود ترسیم می کند. ما باید چیزی داشته باشیم که به این شکل باشد:
ورودی های Fractaltriangle در کد زیر شرح داده شده است. نگاهی بیندازید و اگر سوالی دارید به من اطلاع دهید!
عملکرد Fractaltriangle (R ، زاویه ، طول ، شفافیت) ٪ یک مثلث فراکتال را با ورودی های زیر ترسیم می کند: ٪ r = int ؛تعداد تکرارها ٪ زاویه ای = شماره ؛مقدار مثلث هر تکرار ٪ طول = تعداد را می چرخاند. مثلث مقدار هر تکرار ٪ شفافیت = تعداد بین 0 تا 1 را کاهش می دهد. شفافیت هر مثلث
شکل قرعه کشی (1،0 ، زاویه ، R ، R ، طول ، شفافیت) محور برابر است
عملکرد قرعه کشی (لن ، زاویه ، زاویه ، تکرارها ، طولانی تر ، شفافیت) ٪ مثلث را برای هر تکرار ترسیم می کند و خود را صدا می کند. ورودی ها: ٪ len = شماره ؛طول یک طرف مثلث ٪ زاویه = تعداد ؛مقدار مثلث نسبت به ٪ قبلی تکرار ٪ زاویه ای = تعداد می چرخد. مقدار مثلث هر تکرار ٪ تکرار = int را می چرخاند. تعداد باقیمانده تکرار ٪ r = int ؛تعداد کل تکرارها ٪ طولانی مدت = تعداد ؛مقدار LEN هر تکرار ٪ شفافیت = تعداد بین 0 تا 1 را تغییر می دهد. شفافیت مثلث
if iterations-1>0 قرعه کشی (len-len*طول ، زاویه+anginc. anginc ، iterations-1 ، r ، طول ، شفافیت) ؛پایان پایان
مارپیچ
ما با یک مثال ساده ادامه خواهیم داد: ترسیم یک مارپیچ. با هر تکرار ، یک دایره ترسیم خواهیم کرد و به سادگی زاویه ، موقعیت و اندازه دایره را با هر تکرار تغییر خواهیم داد. در اینجا چگونه می خواهیم به نظر برسد:
عملکرد Fractalcirclesimple (R) ٪ این عملکرد یک مارپیچ فراکتال با تکرار R ایجاد می کند
٪ تماس با عملکرد ترسیم Crawcircles ([R/2 ، R/2] ، R ، 90 ، R)
محور از محور برابر است
تابع عملکرد (PT ، تکرار ، initangle ، r) ٪ این عملکرد دایره فعلی را در مارپیچ ترسیم می کند و خود را ٪ می کند تا دایره بعدی را در مارپیچ ترسیم کند ، تا زمانی که تمام تکرارها ٪ ترسیم شوند. ورودی ها عبارتند از: ٪ pt = [x ، y] ؛گوشه سمت چپ پایین دایره که باید ٪ تکرار شود = int ؛باقیمانده تکرار ٪ initiangle = تعداد ؛زاویه فعلی مارپیچ ٪ r = int ؛تعداد کل تکرارها
٪ از مثلثات برای تعیین اجزای x و y x2 = len*cosd (initangle)+pt (1) استفاده کنید. y2 = len*sind (initangle)+pt (2) ؛
Circle R1 = Rectangle ("موقعیت" ، [x2 ، y2 ، len ، len] را بکشید. 0 0 0]) ؛r1. facecolor (4) = 0. 5 ؛
% draw the next circle if more iterations remain if iterations-1>0 Drawcircles ([x2 ، y2] ، iterations-1 ، initangle+20 ، r) ؛پایان پایان
در اینجا با تکرارهای زیادی به نظر می رسد! سعی کنید زاویه را تغییر دهید و ببینید که چگونه این بر مارپیچی که ایجاد می کنید تأثیر می گذارد!
یادداشتی در مورد رنگ ها:
متوجه خواهید شد که با کوچکتر شدن حلقه ها ، رنگ مارپیچ تغییر می کند. این توسط ویژگی "صورت" عملکرد مستطیل کنترل می شود. در MATLAB ، شما با استفاده از مقادیر RGB که از 0 تا 1 متغیر است ، تنظیم می کنید. به عبارت دیگر ، [1 1 1] سفید و [0 0 0] سیاه است. بنابراین ، اگر ما یکی از رنگ ها را به عنوان (تکرار فعلی)/(تکرارهای کل) تنظیم کنیم ، عددی دریافت خواهیم کرد که به راحتی بین صفر و یک متفاوت است!
همچنین توجه داشته باشید که هر دو "FaceColor" و "Edgecolor" را می توان روی "None" تنظیم کرد. سعی کنید "Edgecolor" را برابر با "None" تنظیم کنید و ببینید که چگونه این مارپیچ شما را تغییر می دهد!
سرانجام ، توجه داشته باشید که یک جنبه چهارم "پنهان" برای رنگ وجود دارد. به این مقدار آلفا گفته می شود و شفافیت آنچه را که می خواهید تعیین می کند. ما این را با خط r1. facecolor (4) = 0. 5 تنظیم کردیم. و مانند سایر پارامترهای رنگ ، می تواند بین 0 تا 1 متفاوت باشد.
یادداشتی در مورد اشکال:
به نظر می رسد عجیب به نظر می رسد که ما از عملکرد مستطیل برای تولید دایره استفاده می کنیم ، اما این فقط روشی است که Matlab این کار را انجام می دهد! می توانید با تغییر پارامتر "انحنای" در مستطیل ، از یک دایره به یک مستطیل منتقل شوید. این بین 0 تا 1 متفاوت است ، با 0 به شما یک مستطیل می دهد ، 1 به شما یک دایره (یا بیضوی) می دهد و هر چیزی که بین شما یک مستطیل گرد باشد. آیا مارپیچ خود را با دایره یا مستطیل بهتر دوست دارید؟
اضافه کردن دایره های بیشتر!
خوب ، مارپیچ ها خوب هستند ، اما بیایید اکنون پیچیدگی هایی را به نقاشی خود اضافه کنیم! چگونه می توانیم یک دایره دوم را با زاویه دیگری از آن دایره اول اضافه کنیم؟سپس ما یک نقاشی خواهیم داشت که چیزی شبیه به آن است:
توجه کنید که با افزایش تعداد تکرارها ، می توانید شاهد ظهور برخی ساختار باشید!
عملکرد fractalcircles (r) شکل drawcircles ([0،0] ، r ، 90 ، r) محور از محور برابر است
ما با یک مثال ساده "ساده" ادامه خواهیم داد: یک درخت شاخه. الگوی تکراری این است که هر بار که به انتهای یک شاخه "در درخت برسید ، دو شاخه دیگر با زاویه های مساوی چنگ می زنند. ما می خواهیم چیزی شبیه به تصویر زیر باشد.
شما می خواهید کد زیر را در MATLAB کپی و چسباندن کنید و سعی کنید آن را اجرا کنید. با زاویه و تعداد تکرارها بازی کنید. توجه کنید که رنگ در حال حاضر به طور تکراری تعریف شده است. یعنی کوچکترین شاخه ، صورتی بیشتر است. آیا می توانید به جای آن شاخه ها سبز شود؟در مورد رنگ های دیگر چطور؟
عملکرد Fractaltreebasic (R ، Angle ، Fade) ٪ این عملکرد یک درخت فراکتال را با ورودی های زیر ترسیم می کند: ٪ r = int ؛تعداد تکرار ٪ زاویه = شماره ؛زاویه جانبی هر یک از دو شاخه ٪ fade = 1 یا 0 ؛اگر می خواهید شاخه ها شفاف باشند = R+1 مقدار را روی 1 تنظیم کنید. شکل ("موقعیت" ، [10،10،700،700]) ؛
٪ شروع فرآیند تکراری در ترسیم شاخه ها (90 ، 0. 0] ، Totaliterations-1 ، Angle ، Totalierations ، Fade).
عملکرد قرعه کشی (initangle ، pt ، تکرار ، زاویه ، توتال ها ، محو) ٪ این زیر عملکرد شاخه ها را به صورت بازگشتی با ورودی ها ترسیم می کند: ٪ initangle = number ؛زاویه فعلی "تنه" ٪ pt = [x ، y] ؛نقطه پایانی "تنه" ٪ تکرار = شماره ؛تعداد دفعات تکرار ٪ زاویه = شماره ؛مقدار هر شاخه در یک طرف ٪ r = int پاشیده می شود. تعداد کل تکرارها (از عملکرد اصلی) ٪ محو = 1 یا 0 ؛برای به دست آوردن شاخه های شفاف روی 1 تنظیم کنید
٪ طول شاخه فعلی len = 1. 2^(تکرار) ؛x1 = pt (1) ؛y1 = pt (2) ؛ang1 = initangle+angle ؛angle angle angle شاخه چپ = initangle-ange ؛٪ زاویه شاخه راست ٪ ٪ از مثلثات برای یافتن نقاط انتهایی شاخه جدید y2 = len*sind (ang1)+y1 استفاده کنید. y3 = len*sind (ang2)+y1 ؛x2 = len*cosd (ang1)+x1 ؛x3 = len*cosd (ang2)+x1 ؛
٪ رنگ را بر اساس تکرار فعلی C2 = [1-entrations/(Totaliterations) 0 1-entrations/(totaliterations)] تنظیم کنید.٪ عرض شاخه را بر اساس تکرار فعلی w = تکرار^0. 6 تنظیم می کند.٪ یک خط بین تنه و نقطه انتهایی شاخه سمت چپ P1 = طرح ([x1 ، x2] ، [y1 ، y2] ، 'linewidth' ، w ، 'color' ، c2) ؛٪ یک خط بین تنه و نقطه انتهایی شاخه راست P2 = طرح ([x1 ، x3] ، [y1 ، y3] ، 'linewidth' ، w ، 'color' ، c2) ؛
در صورت محو کردن 1 در صورت محو شدن == 1 C4 = 1- (توتالیتر-ایتالیا)/توتالیتاسیون ، شاخه ها را شفاف می کنند. P1. Color (4) = C4 ؛P2. Color (4) = C4 ؛پایان
% If you're not done iterating, draw branches at the end of each % of the two branches you just created. if iterations-1>0 Drawbranches (Ang1 ، [x2 ، y2] ، iterations-1 ، angle ، totaliteration ها ، محو شدن) ؛Drawbranches (Ang2 ، [X3 ، Y3] ، تکراره ا-1 ، زاویه ، توتالیتر ، محو شدن). پایان پایان
این کد همچنین دارای گزینه "Fade" است. به عبارت دیگر ، اگر شما را به 1 تنظیم کنید ، هرچه یک شاخه کوچکتر باشد ، شفاف تر خواهد بود. در اینجا دو نسخه از درخت Fractal نهایی ، یکی با گزینه FADE و دیگری بدون:
درخت چهار شاخه ای
خوب ، حالا بیایید یک قدم جلوتر درخت فراکتال را برداریم. به جای داشتن دو شاخه در هر نقطه شاخه ، بیایید 4 داشته باشیم. بنابراین ، چند تکرار اول باید به این شکل باشد:
شکل ("موقعیت" ، [50،50،700،700]) ؛drawbranch ([0،0] ، 90 ، r ، r) ؛محور برابر محور خاموش است
این مثال از نظر مفهومی مشابه است، اما از نظر بصری کاملاً متفاوت است. در اینجا، ما از یک حلقه while برای ترسیم ساقه انحنا دار استفاده می کنیم. پس از رسم هر بخش از ساقه، تابع ترسیم خود را فراخوانی می کنیم تا ساقه دیگری را با زاویه قائمه با ساقه موجود بکشیم.
تابع fractalTreeCurved(r) % این تابع یک درخت فراکتال منحنی را با ورودی های زیر ترسیم می کند: % r = int; تعداد تکرار
تابع drawCurve(pt, initAngle, numBends, angInc, w, l, r) % منحنی های درخت منحنی را با این ورودی ها ترسیم می کند: % pt = [x, y]; نقطه شروع منحنی فعلی % intitAngle = عدد; زاویه اولیه منحنی جریان % numBends = int; تعداد بخش هایی که باید در منحنی رسم شوند % angInc = تعداد; تغییر زاویه فزاینده با هر تکرار % w = عدد. عرض خط اول % l = عدد; طول خط اول % r = int; تعداد کل تکرارها
index=numBends; x1=pt(1); y1=pt(2); ang1=initAngle; width=w; len1=l; while index>0
y2=len1*sind(ang1)+y1; x2=len1*cosd(ang1)+x1; len1=len1-len1/7; اگر len1 شکست پایان c=[0 1-numBends/r 0]; نمودار([x1, x2],[y1, y2],'LineWidth', width,'Color', c); axis off نگه دارید روی عرض=width-width/8; x1=x2; y1=y2; ang1=ang1+angInc; index=index-1; drawCurve([x2, y2], ang1-90-angInc, index-2, angInc, width/2, len1/1. 5, r) انتهای انتهایی
سرخس فراکتال
این مثال قصد دارد یکی از چیزهای واقعاً منظم و کاملاً واقعی را به شما نشان دهد که می توانید با نقاشی بازگشتی ایجاد کنید! احتمالاً وقت نخواهیم داشت که در کلاس به این موضوع بپردازیم، اما مطمئناً با خیال راحت با کد بازی کنید و اگر سؤالی دارید به من بگویید!
همچنین، لطفاً توجه داشته باشید که اگرچه بسیار شبیه به نظر می رسد، این یک سرخس بارنزلی نیست. سرخس بارنسلی نیز یک فراکتال است، اما توسط فرآیند بسیار متفاوتی ایجاد می شود. توصیه می کنم اگر برگ های فراکتال شما را مجذوب خود می کند، آن را بررسی کنید!
بیایید با نگاهی به برگ سرخس شروع کنیم.
به ساختار فراکتال برگ توجه کنید. یعنی هر شاخه از خود سرخس شبیه سرخس است! خوب، بنابراین در تابع ترسیم خود می خواهیم سرخس را به صورت بازگشتی ترسیم کنیم. تا اینجا به اندازه کافی ساده به نظر می رسد، درست است؟.
خوب چند عامل وجود دارد که آن را پیچیده تر می کند. جهت شاخه ها به طور متناوب به راست و چپ تغییر می کند و انحنای آن شاخه ها به جهت بستگی دارد. بنابراین ما باید متغیری را وارد کنیم که با هر تکرار تغییر جهت دهد.
تابع fractalFe(r) % یک سرخس فراکتال را با تکرارهای r رسم می کند
شکل drawFe([0, 0], r, 1, 90, 10, r) محور خاموش
تابع drawfe (pt ، numbranches ، dir ، initang ، length1 ، r) ٪ هر یک از سرخس ها را ترسیم می کند و ورودی ها را می گیرد: ٪ pt = [x ، y] ؛نقطه پایانی ساقه فعلی numbranches = int ؛تعداد شاخه هایی برای ترسیم در جریان فعلی ٪ dir = 1 یا 0 ؛انحنای frond ٪ initang = عدد را تعیین می کند. زاویه اولیه ساقه ٪ طول 1 = عدد ؛طول اولین بخش از ساقه ٪ r = int ؛تعداد کل بخش های ساقه
index=numBranches; ang=initAng; x2=pt(1); y2=pt(2); next=1; % This while loop draws a new frond after drawing each stem % segment, alteating left and right while index>0 len = طول 1*. 9^(numbranches-index) ؛
در صورت بازگشت LEN ، طول خط ٪ خیلی کوچک می شود ، این به سادگی نقاشی را متوقف می کند
٪ بعدی جهت پیشرو بعدی را تعیین می کند. این کد ٪ اگر بعدی == 1 بعدی = 0 ؛nextang = ang-50 ؛دیگری بعدی = 1 ؛nextang = ang+50 ؛پایان
اگر dir == 1 ang = ang-2 ؛other ang = ang+2 ؛پایان
٪ frond بعدی را بکشید. توجه داشته باشید که تعداد شاخه های ٪ برای ترسیم هر یک از فرن های پی در پی توسط 1 drawfe ([x2 ، y2] ، index-1 ، next ، nextang ، len/2. 5 ، r) کاهش می یابد. index = index-1 ؛پایان پایان
ویدیو های آموزشی فارکس...
ما را در سایت ویدیو های آموزشی فارکس دنبال می کنید