13 سازنده هنر فراکتال

ساخت وبلاگ

فصل 9 شما را با برنامه هایی آشنا کرد که بسیاری از فراکتال های مشهور را با ماژول لاک پشت پایتون ترسیم می کند ، اما می توانید در این فصل هنر فراکتال خود را نیز با این پروژه بسازید. برنامه Fractal Art Maker از ماژول لاک پشت پایتون استفاده می کند تا شکل های ساده را به طرح های پیچیده با حداقل کد اضافی تبدیل کند.

این پروژه در این فصل با نه فرتال به عنوان مثال ارائه می شود ، اگرچه می توانید توابع جدیدی را برای ایجاد فراکتال های طراحی خود بنویسید. Fractals مثال را برای تولید آثار هنری کاملاً متفاوت یا نوشتن کد از ابتدا برای اجرای دید خلاق خود اصلاح کنید.

برای توضیح کامل عملکردهای موجود در ماژول لاک پشت ، به فصل 9 بازگردید.

فراکتال های داخلی

می توانید رایانه خود را هدایت کنید تا تعداد نامحدودی از فراکتال ها ایجاد شود. شکل 13-1 نه فراکتال را نشان می دهد که با برنامه Fractal Art Maker همراه است که در این فصل از آنها استفاده خواهیم کرد. اینها از کارکردهایی تولید می شوند که یک مثلث مربع یا یک طرفه ساده را به عنوان شکل پایه ترسیم می کنند ، سپس تفاوت های جزئی در پیکربندی بازگشتی آنها برای تولید تصاویر کاملاً متفاوت ایجاد می کنند.

شکل 13-1: نه نمونه نمونه ای که با برنامه Fractal Art Maker همراه است

شما می توانید با تنظیم ثابت draw_fractal در بالای برنامه به یک عدد صحیح از 1 تا 9 و سپس اجرای برنامه Fractal Art Maker ، همه این فراکتال ها را تولید کنید. همچنین می توانید Draw_fractal را روی 10 یا 11 تنظیم کنید تا به ترتیب شکل های اصلی مربع و مثلث را ترسیم کنید ، که این فراکتال ها را تشکیل می دهند ، همانطور که در شکل 13-2 نشان داده شده است.

شکل 13-2: نتایج فراخوانی crawfiledsquare () (سمت چپ) و drawtriangleoutline () (سمت راست) به تنهایی

این اشکال نسبتاً ساده است: یک مربع پر از سفید یا خاکستری و یک طرح ساده از یک مثلث. تابع drawfractal () از این اشکال اساسی برای ایجاد فراکتال های شگفت انگیز استفاده می کند.

الگوریتم سازنده هنر فراکتال

الگوریتم Fractal Art Maker دارای دو مؤلفه اصلی است: یک تابع شکل گیری شکل و عملکرد بازگشتی عقب ().

عملکرد ترسیم شکل یک شکل اساسی را ترسیم می کند. برنامه Fractal Art Maker با دو کارکرد ترسیم شکل نشان داده شده که قبلاً در شکل 13-2 نشان داده شده است ، CraffilledSquare () و DrawtriangleOutline () ارائه می شود ، اما شما همچنین می توانید خود را ایجاد کنید. ما یک تابع ترسیم شکل را به عنوان یک آرگومان به عملکرد Drawfractal () منتقل می کنیم ، درست همانطور که توابع مسابقه را به عملکرد Walk () Walk () File Finder منتقل کردیم.

تابع drawFractal() همچنین دارای پارامتری است که تغییرات اندازه، موقعیت و زاویه اشکال بین فراخوانی بازگشتی به drawFractal() را نشان می دهد. ما این جزئیات خاص را بعداً در این فصل پوشش خواهیم داد، اما بیایید به یک مثال نگاه کنیم: فراکتال 7، که یک تصویر موج مانند را ترسیم می کند.

این برنامه فراکتال موج را با فراخوانی تابع ترسیم شکل () drawTriangleOutline تولید می کند که یک مثلث واحد ایجاد می کند. آرگومان های اضافی برای drawFractal() به آن می گویند که سه فراخوان بازگشتی به drawFractal() بفرستد. شکل 13-3 مثلث تولید شده توسط فراخوانی اصلی به drawFractal() و مثلث های تولید شده توسط سه فراخوانی بازگشتی را نشان می دهد.

شکل 13-3: مثلثی که توسط اولین فراخوانی drawFractal() (چپ) و اولین مجموعه از سه فراخوانی بازگشتی (راست) ایجاد می شود.

اولین فراخوان بازگشتی به drawFractal() می گوید که drawTriangleOutline() را فراخوانی کند، اما با مثلثی که نصف اندازه است و در سمت چپ بالای مثلث قبلی قرار دارد. فراخوانی بازگشتی دوم یک مثلث در سمت راست بالای مثلث قبلی ایجاد می کند که 30 درصد اندازه آن است. سومین فراخوان بازگشتی یک مثلث در زیر مثلث قبلی ایجاد می کند که اندازه آن نصف است و در مقایسه با آن 15 درجه چرخیده است.

هر یک از این سه فراخوانی بازگشتی به drawFractal() سه فراخوان بازگشتی دیگر به drawFractal() می دهد و نه مثلث جدید تولید می کند. مثلث های جدید تغییرات یکسانی در اندازه، موقعیت و زاویه خود نسبت به مثلث قبلی خود دارند. مثلث بالا سمت چپ همیشه نصف مثلث قبلی است، در حالی که مثلث پایین همیشه 15 درجه بیشتر می چرخد. شکل 13-4 مثلث های تولید شده توسط سطوح اول و دوم بازگشت را نشان می دهد.

شکل 13-4: سطح اول فراخوانی بازگشتی به drawFractal() (سمت چپ) و 9 مثلث جدید سطح دوم تماس های بازگشتی (راست)

نه فراخوانی برای drawFractal() که این نه مثلث جدید را تولید می کنند، هر کدام سه فراخوان بازگشتی به drawFractal() می دهند که 27 مثلث جدید در سطح بعدی بازگشت ایجاد می کند. با ادامه این الگوی بازگشت، در نهایت مثلث ها به قدری کوچک می شوند که drawFractal() برقراری تماس های بازگشتی جدید را متوقف می کند. این یکی از موارد پایه برای تابع drawFractal() بازگشتی است. مورد دیگر زمانی رخ می دهد که عمق بازگشتی به یک سطح مشخص می رسد. در هر صورت، این فراخوانی های بازگشتی فرکتال موج نهایی را در شکل 13-5 تولید می کنند.

شکل 13-5: فراکتال موج نهایی بعد از هر مثلث به صورت بازگشتی سه مثلث دیگر ایجاد می کند.

نه نمونه فراکتال در شکل 13-1 که با سازنده هنر فراکتال همراه است ، فقط با دو عملکرد ترسیم شکل و چند تغییر در آرگومان ها برای ترسیم () ساخته شده است. بیایید نگاهی به کد سازنده هنر فراکتال بیندازیم تا ببینیم چگونه این کار را انجام می دهد.

برنامه کامل ساز هنر فراکتال

کد زیر را در یک پرونده جدید وارد کرده و آن را به عنوان fractalartmaker. py ذخیره کنید. این برنامه به ماژول لاک پشت داخلی پایتون متکی است ، بنابراین هیچ کد JavaScript برای پروژه این فصل استفاده نمی شود:

هنگامی که این برنامه را اجرا می کنید ، اولین از نه تصویر فراکتال از شکل 13-1 را نشان می دهد. شما می توانید ثابت Draw_fractal را در ابتدای کد منبع به هر عدد صحیح از 1 به 9 تغییر دهید و دوباره برنامه را اجرا کنید تا یک فراکتال جدید را ببینید. پس از یادگیری نحوه کار این برنامه ، شما همچنین می توانید توابع ترسیم شکل خود را ایجاد کرده و با Drawfractal () تماس بگیرید تا فراکتال های طراحی خود را تولید کنید.

تنظیم ثابت و پیکربندی لاک پشت

خطوط اول برنامه مراحل تنظیم اساسی برای برنامه مبتنی بر لاک پشت ما را پوشش می دهد:

این برنامه ماژول لاک پشت را برای نقاشی وارد می کند. همچنین ماژول ریاضی را برای عملکرد Math. sqrt () وارد می کند ، که مثلث Sierpiński Fractal از آن استفاده می کند ، و توابع Math. cos () و Math. Sin () را برای Fractal Snowflake.

ثابت Draw_fractal را می توان از هر عدد صحیح از 1 تا 9 تنظیم کرد تا یکی از نه فراکتال های داخلی که برنامه تولید می کند ، ترسیم کند. همچنین می توانید آن را روی 10 یا 11 تنظیم کنید تا به ترتیب خروجی عملکرد مربع یا مثلث شکل کشیدن شکل را نشان دهد.

ما همچنین برای آماده سازی برای نقاشی با برخی از توابع لاک پشت تماس می گیریم. Turtle. Tracer (5000 ، 0) تماس با ترسیم Fractal سرعت می یابد. آرگومان 5000 به ماژول لاک پشت می گوید تا قبل از ارائه نقاشی روی صفحه ، 5000 دستورالعمل نقاشی لاک پشت پردازش شود ، و 0 استدلال به آن می گوید که پس از هر دستورالعمل نقاشی ، 0 میلی ثانیه مکث کند. در غیر این صورت ، ماژول لاک پشت پس از هر دستورالعمل نقاشی ، تصویر را به تصویر می کشد ، که اگر فقط تصویر نهایی را بخواهیم ، برنامه را به میزان قابل توجهی کند می کند.

اگر می خواهید نقاشی را کند کنید و خطوط را به عنوان تولید آنها تماشا کنید ، می توانید این تماس را به Turtle. tracer (1 ، 10) تغییر دهید. این می تواند در هنگام ایجاد Fractals خود برای اشکال زدایی هرگونه مشکل در نقاشی مفید باشد.

Turtle. Hideturtle () Call شکل مثلث را روی صفحه پنهان می کند که نشان دهنده موقعیت فعلی لاک پشت و عنوان است.(عنوان یک اصطلاح دیگر برای جهت است.) ما این عملکرد را می نامیم تا نشانگر در تصویر نهایی ظاهر نشود.

کار با توابع شکل گیری شکل

تابع drawfractal () از یک تابع شکل گیری شکل که به آن منتقل شده است برای ترسیم قسمتهای جداگانه فراکتال استفاده می کند. این معمولاً یک شکل ساده مانند مربع یا مثلث است. پیچیدگی زیبای فراکتال ها از قاتل () که به صورت بازگشتی این عملکرد را برای هر یک از مؤلفه های خاص از کل فراکتال می نامند ، پدید می آید.

توابع ترسیم شکل برای سازنده هنر فراکتال دارای دو پارامتر است: اندازه و عمق. پارامتر اندازه طول طرفین مربع یا مثلثی است که ترسیم می کند. توابع ترسیم شکل همیشه باید از آرگومان ها برای لاک پشت استفاده کنند. () () که بر اساس اندازه است به گونه ای که طول در هر سطح از بازگشت متناسب با اندازه باشد. از کد مانند لاک پشت خودداری کنید. forward (100) یا لاک پشت. forward (200) ؛درعوض ، از کدی که بر اساس پارامتر اندازه مانند لاک پشت ها استفاده می شود ، استفاده کنید. برای بالا (اندازه) یا لاک پشت. forward (اندازه * 2). در ماژول لاک پشت پایتون ، Turtle. forward (1) لاک پشت را توسط یک واحد حرکت می دهد ، که لزوماً برابر با یک پیکسل نیست.

پارامتر دوم توابع شکل دهی عمق بازگشتی Drawfractal () است. تماس اصلی به drawfractal () دارای پارامتر عمق تعیین شده روی 0 است. تماس های بازگشتی به drawfractal () از عمق + 1 به عنوان پارامتر عمق استفاده می کنند. در موج Fractal ، اولین مثلث در مرکز پنجره دارای یک آرگومان عمق 0 است. سه مثلث ایجاد شده در بعدی عمق 1 دارند. نه مثلث در اطراف این سه مثلث دارای عمق 2 و غیره است.

عملکرد ترسیم شکل شما می تواند این استدلال را نادیده بگیرد ، اما استفاده از آن می تواند تغییرات جالبی را در شکل اصلی ایجاد کند. به عنوان مثال ، عملکرد ترسیم شکل () شکل () از عمق استفاده می کند تا بین ترسیم مربع های سفید و مربع های خاکستری متناوب شود. اگر می خواهید توابع ترسیم شکل خود را برای برنامه Fractal Art Maker ایجاد کنید ، این را در خاطر داشته باشید ، زیرا آنها باید یک استدلال اندازه و عمق را بپذیرند.

عملکرد crawfilledsquare ()

تابع crawfiledsquare () یک مربع پر شده را با دو طرف اندازه طول می کشد. برای رنگ آمیزی مربع ، ما از لاک پشت ماژول لاک پشت استفاده می کنیم. begin_fill () و لاک پشت. از آنجا که این مربع ها پر شده اند ، هر مربعی که در بالای آنها قرار دارد بعداً آنها را پوشانده است.

مانند همه توابع ترسیم شکل برای برنامه Fractal Art Maker ، CrawfilledSquare () یک پارامتر اندازه و عمق را می پذیرد:

آرگومان اندازه می تواند یک شماره نقطه شناور با یک قسمت کسری باشد ، که گاهی اوقات باعث می شود ماژول لاک پشت ها نقاشی های کمی نامتقارن و ناهموار را انجام دهند. برای جلوگیری از این امر ، خط اول اندازه عملکرد به یک عدد صحیح می رسد.

هنگامی که عملکرد مربع را ترسیم می کند ، فرض می کند لاک پشت در مرکز مربع قرار دارد. بنابراین ، لاک پشت ابتدا باید نسبت به عنوان اولیه آن به گوشه بالا سمت راست میدان منتقل شود:

عملکرد drawfractal () همیشه قلم را پایین و آماده ترسیم هنگام فراخوانی عملکرد شکل گیری شکل ، بنابراین crawfilledsquare () باید با Turtle. penup () تماس بگیرد تا از ترسیم خط به سمت موقعیت شروع جلوگیری شود. برای پیدا کردن موقعیت شروع نسبت به وسط مربع ، لاک پشت ابتدا باید نیمی از طول مربع (یعنی اندازه // 2) را به سمت راست سمت راست مربع منتقل کند. در مرحله بعد لاک پشت 90 درجه به سمت بالا می رود و سپس اندازه // 2 واحد را به سمت گوشه بالا و راست حرکت می دهد. لاک پشت اکنون با راه اشتباه روبرو است ، بنابراین حدود 180 درجه می چرخد و قلم را پایین می آورد تا بتواند نقاشی را شروع کند.

توجه داشته باشید که راست و بالا نسبت به مسیری که لاک پشت در ابتدا با آن روبرو است ، است. این کد به همان اندازه کار می کند اگر لاک پشت در 0 درجه به سمت راست شروع شود یا دارای عنوان 90 ، 42 یا هر تعداد دیگر درجه باشد. هنگامی که توابع ترسیم شکل خود را ایجاد می کنید ، به کارکردهای نسبی حرکت لاک پشت مانند لاک پشت ها بچسبید. () ، لاک پشت. left () و لاک پشت.) به جای توابع حرکتی مطلق مانند Turtle. goto ().

در مرحله بعد ، آرگومان عمق به عملکرد می گوید که آیا باید یک مربع سفید یا خاکستری بکشد:

اگر عمق یکنواخت باشد ، عمق ٪ 2 == 0 درست است ، و رنگ پر کردن مربع سفید است. در غیر این صورت ، کد رنگ پر شده را به رنگ خاکستری تنظیم می کند. در هر صورت ، مرز مربع ، که توسط رنگ قلم تعیین می شود ، به رنگ سیاه تنظیم شده است. برای تغییر هر یک از این رنگ ها ، از رشته هایی با نام های رنگ مشترک مانند قرمز یا زرد یا کد رنگی HTML که شامل یک علامت هش و شش رقم شش ضلعی است ، مانند #24FF24 برای سبز آهک یا #AD7100 برای قهوه ای استفاده کنید.

وب سایت https://html-color. codes نمودارهایی برای بسیاری از کدهای رنگی HTML دارد. فراکتال های موجود در این کتاب سیاه و سفید فاقد رنگ هستند ، اما رایانه شما می تواند فراکتال های خود را در طیف وسیعی از رنگ ها قرار دهد!

با تنظیم رنگ ها ، در نهایت می توانیم چهار خط مربع واقعی را ترسیم کنیم:

برای اینکه به ماژول لاک پشت بگوییم که قصد داریم شکل پر شده و نه فقط طرح کلی را بکشیم ، ما به عنوان لاک پشت می نامیم. begin_fill (). در مرحله بعدی یک حلقه است که خطی از اندازه طول را ترسیم می کند و لاک پشت 90 درجه را به سمت راست تبدیل می کند. برای ایجاد مربع ، این حلقه چهار بار این را تکرار می کند. هنگامی که عملکرد در نهایت با turtle. end_fill () تماس می گیرد ، مربع پر شده روی صفحه ظاهر می شود.

عملکرد DrawTriangleOutline ()

عملکرد دوم ترسیم شکل ، طرح کلی مثلث دو طرفه را ترسیم می کند که طرفین آن طول اندازه دارند. این عملکرد مثلث را با یک گوشه در بالا و دو گوشه در پایین ترسیم می کند. شکل 13-6 ابعاد مختلف یک مثلث دو طرفه را نشان می دهد.

شکل 13-6: اندازه گیری یک مثلث دو طرفه با طرفین طول اندازه

قبل از شروع نقاشی ، باید ارتفاع مثلث را بر اساس طول طرف های آن تعیین کنیم. هندسه به ما می گوید ، برای مثلث های یک طرفه با طرف های طول L ، ارتفاع H مثلث L برابر ریشه مربع 3 تقسیم شده توسط 2. در عملکرد ما ، L با پارامتر اندازه مطابقت دارد ، بنابراین کد ما متغیر ارتفاع را تعیین می کندبه شرح زیر است:

هندسه همچنین به ما می گوید که مرکز مثلث یک سوم از ارتفاع از قسمت پایین و دو سوم ارتفاع از نقطه بالا است. این اطلاعات لازم را برای انتقال لاک پشت به موقعیت شروع آن به ما می دهد:

برای رسیدن به گوشه بالا ، لاک پشت 90 درجه را به سمت چپ به سمت بالا می چرخانیم (نسبت به عنوان اصلی لاک پشت به سمت راست 0 درجه) و سپس تعدادی واحد برابر با ارتفاع * (2/3) را به جلو حرکت می دهیم. لاک پشت هنوز رو به رو است ، بنابراین برای شروع ترسیم خط در سمت راست ، لاک پشت باید 90 درجه به سمت راست به سمت راست بچرخد ، سپس 60 درجه اضافی برای روبرو شدن با گوشه پایین سمت راست مثلث. به همین دلیل ما لاک پشت می نامیم. (150).

در این مرحله ، لاک پشت آماده است تا مثلث را شروع کند ، بنابراین ما قلم را با فراخوانی لاک پشت پایین می آوریم. Pendown (). یک حلقه برای ترسیم سه طرف:

ترسیم مثلث واقعی موضوعی است که به جلو توسط واحدهای اندازه حرکت می کند و سپس 120 درجه به سمت راست ، سه بار جداگانه تبدیل می شود. چرخش 120 درجه سوم و پایانی لاک پشت را در جهت اصلی خود قرار می دهد. شما می توانید این حرکات و چرخش ها را در شکل 13-7 مشاهده کنید.

شکل 13-7: ترسیم یک مثلث دو طرفه شامل سه حرکت رو به جلو و سه چرخش 120 درجه است.

تابع DrawTriangleOutline () فقط طرح کلی را ترسیم می کند و نه شکل پر شده ، بنابراین به عنوان Turtle. begin_fill () و Turtle. End_fill () به عنوان CrawfildSquare () نمی نامد.

با استفاده از عملکرد ترسیم Fractal

اکنون که ما دو کارکرد رسم نمونه برای کار با آنها داریم ، اجازه دهید عملکرد اصلی در پروژه Fractal Art Maker ، Drawfractal () را بررسی کنیم. این عملکرد دارای سه پارامتر مورد نیاز و یک اختیاری است: شکل دهی ، اندازه ، مشخصات و MaxDepth.

پارامتر DappedRawFunction انتظار عملکردی دارد ، مانند crawfiledsquare () یا drawtriangleoutline (). پارامتر اندازه انتظار دارد که اندازه شروع به عملکرد نقاشی منتقل شود. غالباً ، مقدار بین 100 تا 500 اندازه شروع خوبی است ، اگرچه این بستگی به کد موجود در عملکرد شکل گیری شکل شما دارد و پیدا کردن مقدار مناسب ممکن است نیاز به آزمایش داشته باشد.

پارامتر مشخصات انتظار می رود لیستی از فرهنگ لغت ها باشد که مشخص می کند چگونه شکل های بازگشتی باید اندازه ، موقعیت و زاویه خود را تغییر دهند ، همانطور که drawfractal () به صورت بازگشتی خود را صدا می کند. این مشخصات بعداً در این بخش شرح داده شده است.

برای جلوگیری از بازگشت مجدد () تا زمانی که باعث سرریز پشته شود ، پارامتر MaxDepth تعداد دفعاتی را که drawfractal () باید به صورت بازگشتی خود را صدا کند ، نگه می دارد. به طور پیش فرض ، MaxDepth دارای مقدار 8 است ، اما اگر می خواهید شکل های بازگشتی بیشتر یا کمتر داشته باشید ، می توانید مقدار متفاوتی را ارائه دهید.

یک پارامتر پنجم ، عمق ، با تماس بازگشتی Drawfractal () به خود و پیش فرض 0 انجام می شود. لازم نیست هنگام تماس با Drawfractal () آن را مشخص کنید.

تنظیم عملکرد

اولین کاری که عملکرد Drawfractal () انجام می دهد ، بررسی دو مورد پایه آن است:

اگر عمق بیشتر از MaxDepth باشد ، عملکرد متوقف می شود و بازگشت را متوقف می کند. مورد دیگر در صورتی که اندازه کمتر از 1 باشد رخ می دهد ، در این مرحله شکل های کشیده شده برای دیدن روی صفحه بسیار کوچک هستند و بنابراین عملکرد باید به سادگی بازگردد.

ما موقعیت اصلی لاک پشت را پیگیری می کنیم و در سه متغیر قرار می گیریم: InitialX ، Initialy و InitialHeading. به این ترتیب ، مهم نیست که عملکرد شکل گیری شکل لاک پشت را در آن قرار می دهد یا به چه جهت هدایت می شود ، کشش () می تواند لاک پشت را به موقعیت اصلی برگرداند و برای تماس بازگشتی بعدی حرکت کند:

توابع Turtle. xcor () و Turtle. ycor () توابع مطلق X- و Y را به همبستگی های لاک پشت بر روی صفحه باز می گردانند. عملکرد لاک پشت.

چند خط بعدی تابع shape-drawing ارسال شده به پارامتر shapeDrawFunction را فراخوانی می کند:

از آنجا که مقدار ارسال شده به عنوان آرگومان برای پارامتر shapeDrawFunction یک تابع است، کد shapeDrawFunction (اندازه، عمق) این تابع را با مقادیر اندازه و عمق فراخوانی می کند. قلم قبل از فراخوانی shapeDrawFunction() پایین می آید و بلند می شود تا اطمینان حاصل شود که تابع shape-drawing می تواند به طور مداوم انتظار داشته باشد که قلم هنگام شروع ترسیم پایین باشد.

با استفاده از دیکشنری مشخصات

پس از فراخوانی shapeDrawFunction() ، بقیه کد drawFractal() به برقراری تماس های بازگشتی با drawFractal() بر اساس مشخصات موجود در دیکشنری لیست مشخصات اختصاص داده می شود. برای هر دیکشنری، drawFractal() یک فراخوان بازگشتی به drawFractal() می دهد. اگر مشخصات یک لیست با یک فرهنگ لغت باشد، هر فراخوانی به drawFractal() تنها منجر به یک فراخوان بازگشتی به drawFractal() می شود. اگر مشخصات یک لیست با سه دیکشنری باشد، هر فراخوانی به drawFractal() منجر به سه تماس بازگشتی برای drawFractal() می شود.

دیکشنری های موجود در پارامتر specs مشخصات هر تماس بازگشتی را ارائه می دهند. هر یک از این دیکشنری ها دارای کلیدهای sizeChange، xChange، yChange و angleChange هستند. اینها نحوه تغییر اندازه فراکتال، موقعیت لاک پشت و عنوان لاک پشت را برای یک فراخوانی بازگشتی drawFractal() دیکته می کنند. جدول 13-1 چهار کلید را در یک مشخصات توصیف می کند.

جدول 13-1: کلیدها در فرهنگ لغت مشخصات

 

کلید مقدار پیش فرض شرح
تغییر اندازه 1.0 مقدار اندازه شکل بازگشتی بعدی، اندازه فعلی ضرب در این مقدار است.
xتغییر 0.0 مختصات x شکل بازگشتی بعدی مختصات x فعلی به اضافه اندازه فعلی ضرب در این مقدار است.
y تغییر دهید 0.0 مختصات y شکل بازگشتی بعدی مختصات y فعلی به اضافه اندازه فعلی ضرب در این مقدار است.
تغییر زاویه 0.0 زاویه شروع شکل بازگشتی بعدی، زاویه شروع فعلی به اضافه این مقدار است.

بیایید نگاهی به فرهنگ لغت مشخصات فراکتال Four Coers بیندازیم، که تصویر بالا سمت چپ را که قبلا در شکل 13-1 نشان داده شده است، تولید می کند. فراخوانی به drawFractal() برای فراکتال Four Coers لیست دیکشنری های زیر را برای پارامتر specs ارسال می کند:

لیست مشخصات دارای چهار فرهنگ لغت است، بنابراین هر فراخوانی به drawFractal() که یک مربع رسم می کند، به نوبه خود چهار بار دیگر به صورت بازگشتی برای رسم چهار مربع دیگر drawFractal() را فراخوانی می کند. شکل 13-8 این پیشرفت مربع ها را نشان می دهد (که بین سفید و خاکستری متناوب هستند).

برای تعیین اندازه مربع بعدی که باید ترسیم شود ، مقدار کلید SizeChange توسط پارامتر اندازه فعلی ضرب می شود. اولین فرهنگ لغت در لیست مشخصات دارای مقدار Sizechange 0. 5 است که باعث می شود تماس بازگشتی بعدی یک آرگومان اندازه 350 * 0. 5 یا 175 واحد داشته باشد. این باعث می شود مربع بعدی نصف اندازه مربع قبلی باشد. به عنوان مثال ، مقدار Sizechange 2. 0 اندازه مربع بعدی را دو برابر می کند. اگر فرهنگ لغت هیچ کلید SizeChange نداشته باشد ، مقدار پیش فرض 1. 0 برای تغییر در اندازه است.

شکل 13-8: هر مرحله از چهار گوشه از چپ به راست ، از بالا به پایین. هر مربع به صورت بازگشتی چهار مربع دیگر در گوشه و کنار خود تولید می کند که رنگ های آن بین سفید و خاکستری متناوب است.

برای تعیین مختصات X از مربع بعدی ، مقدار Xchange اولین فرهنگ لغت ، -0. 5 در این حالت ، با اندازه ضرب می شود. وقتی اندازه 350 باشد ، این بدان معنی است که مربع بعدی دارای مختصات X-175 نسبت به موقعیت فعلی لاک پشت است. این مقدار Xchange و مقدار ychange کلید 0. 5 موقعیت مربع بعدی را با فاصله 50 درصد از اندازه مربع فعلی ، به سمت چپ و بالاتر از موقعیت مربع فعلی قرار می دهد. این اتفاق می افتد که آن را در گوشه بالا سمت چپ مربع فعلی قرار دهید.

اگر به سه فرهنگ لغت دیگر در لیست مشخصات نگاه کنید ، متوجه خواهید شد که همه آنها دارای مقدار مشخصی 0. 5 هستند. تفاوت بین آنها در این است که مقادیر Xchange و Ychange آنها را در سه گوشه دیگر مربع فعلی قرار می دهند. در نتیجه ، چهار مربع بعدی در چهار گوشه مربع فعلی متمرکز شده اند.

فرهنگ لغت در لیست مشخصات برای این مثال مقدار Anglechange ندارند ، بنابراین این مقدار به 0. 0 درجه پیش فرض می شود. مقدار Anglechange مثبت نشانگر چرخش خلاف جهت عقربه های ساعت است ، در حالی که یک مقدار منفی نشانگر چرخش عقربه های ساعت است.

هر فرهنگ لغت یک مربع جداگانه را نشان می دهد که هر بار که عملکرد بازگشتی خوانده می شود ، ترسیم می شود. اگر بخواهیم اولین فرهنگ لغت را از لیست مشخصات حذف کنیم ، هر تماس drafractal () فقط سه مربع تولید می کند ، مانند شکل 13-9.

شکل 13-9: چهار گوشه فراکتال با اولین فرهنگ لغت که از لیست مشخصات خارج شده است

استفاده از مشخصات

بیایید ببینیم که چگونه کد موجود در drawfractal () در واقع هر کاری را که توصیف کرده ایم انجام می دهد:

حلقه FOR یک فرهنگ لغت مشخصات فردی را در لیست مشخصات به مشخصات متغیر حلقه در هر تکرار حلقه اختصاص می دهد. روش های فرهنگ لغت GET () مقادیر کلیدهای Sizechange ، Xchange ، Ychange و Anglechange را از این فرهنگ لغت می کشد و آنها را به متغیرهای کوتاهتر Sizech ، XCH ، YCH و Anglech اختصاص می دهد. اگر کلید در فرهنگ لغت وجود نداشته باشد ، روش GET () مقدار پیش فرض را جایگزین می کند.

در مرحله بعد ، موقعیت و عنوان لاک پشت به مقادیر نشان داده شده هنگام اولین بار Drawfractal () تنظیم می شود. این تضمین می کند که تماس های بازگشتی از تکرارهای حلقه قبلی لاک پشت را در مکان دیگری ترک نمی کند. سپس عنوان و موقعیت مطابق متغیرهای Anglech ، XCH و YCH تغییر می یابد:

موقعیت های X-Change و Y تغییر نسبت به عنوان فعلی لاک پشت بیان شده است. اگر عنوان لاک پشت 0 باشد ، محور X نسبی لاک پشت همان محور x واقعی روی صفحه است. با این حال ، اگر عنوان لاک پشت باشد ، مثلاً 45 ، محور نسبی لاک پشت در یک شیب 45 درجه قرار دارد. حرکت "راست" در امتداد محور نسبی لاک پشت سپس با زاویه ای از راست و راست حرکت می کند.

به همین دلیل حرکت به جلو با اندازه * xch لاک پشت را در امتداد محور x نسبی خود حرکت می دهد. اگر XCH منفی باشد ، لاک پشت. forward () در امتداد محور X نسبی لاک پشت باقی مانده است. Turtle. left (90) لاک پشت را در امتداد محور Y لاک پشت و لاک پشت می خواند. Forward (اندازه * ych) لاک پشت را به موقعیت شروع شکل بعدی منتقل می کند. با این حال ، تماس Turtle. left (90) عنوان لاک پشت را تغییر داد ، بنابراین Turtle. Right (90) فراخوانده شده است تا آن را دوباره به جهت اصلی خود بازگرداند.

شکل 13-10 نشان می دهد که چگونه این چهار خط کد لاک پشت را در امتداد محور x نسبی خود به سمت راست حرکت می دهد و در امتداد محور Y نسبی آن قرار می گیرد و آن را در عنوان صحیح قرار می دهد ، مهم نیست که عنوان اولیه آن چیست.

شکل 13-10: در هر یک از این چهار تصویر ، لاک پشت همیشه 100 واحد "درست" و "بالا" را در امتداد محور X نسبی و محور y از عنوان اولیه خود حرکت می دهد.

سرانجام ، با لاک پشت در موقعیت صحیح و رفتن به شکل بعدی ، ما تماس بازگشتی را برای drawfractal () انجام می دهیم:

آرگومان های شکل ، مشخصات و MaxDepth به صورت مجزا به صورت مجزا () بدون تغییر می نامند. با این حال ، اندازه * Sizech برای پارامتر اندازه بعدی منتقل می شود تا تغییر در اندازه شکل بازگشتی را منعکس کند ، و عمق + 1 برای پارامتر عمق منتقل می شود تا آن را برای تماس بعدی عملکرد شکل گیری شکل دهد.

ایجاد فراکتال های مثال

اکنون که ما نحوه عملکرد عملکرد شکل و عملکرد بازگشتی (عملکردهای بازگشتی () را تحت پوشش قرار داده ایم ، اجازه دهید به نه نمونه های نمونه ای که با سازنده هنر فراکتال ارائه می شود ، نگاه کنیم. این نمونه ها را می توانید در شکل 13-1 مشاهده کنید.

چهار گوشه

اولین فراکتال چهار گوشه است که به عنوان یک مربع بزرگ آغاز می شود. همانطور که عملکرد خود را صدا می کند ، مشخصات فراکتال باعث می شود چهار مربع کوچکتر در چهار گوشه میدان ترسیم شود:

فراخوانی به drafractal () در اینجا حداکثر عمق را به 5 محدود می کند ، زیرا بیشتر تمایل دارد که فراکتال آنقدر متراکم شود که جزئیات خوب آن را سخت می کند. این فراکتال در شکل 13-8 ظاهر می شود.

مربع های مارپیچی

مربع های مارپیچی Fractal نیز به عنوان یک مربع بزرگ شروع می شود ، اما در هر تماس بازگشتی فقط یک مربع جدید ایجاد می کند:

این مربع کمی کوچکتر است و با 7 درجه چرخانده می شود. مراکز تمام مربع ها بدون تغییر هستند ، بنابراین نیازی به اضافه کردن کلیدهای Xchange و Ychange به مشخصات نیست. حداکثر عمق پیش فرض 8 برای به دست آوردن یک فراکتال جالب بسیار کوچک است ، بنابراین ما آن را به 50 افزایش می دهیم تا یک الگوی مارپیچی هیپنوتیزم تولید کنیم.

مربع های مارپیچ دوتایی

مربع های مارپیچ دو مارپیچ شبیه به مربع های مارپیچی است ، به جز هر مربع ، دو مربع کوچکتر ایجاد می کند. این یک اثر فن جالب را ایجاد می کند ، زیرا مربع دوم بعداً ترسیم می شود و تمایل به پوشاندن مربع های قبلی کشیده شده دارد:

مربع ها کمی بالاتر یا پایین تر از مربع قبلی خود ایجاد شده و یا 10 یا 10 درجه چرخانده شده اند.

مثلث مارپیچ

مثلث مارپیچی Fractal ، یکی دیگر از تنوع مربع های مارپیچی ، از عملکرد ترسیم شکل () به جای DrawfilledSquare () استفاده می کند:).

بر خلاف مربع های مارپیچی فراکتال ، Fractal مارپیچ مثلث در اندازه کوچک 20 واحد شروع می شود و برای هر سطح از بازگشت کمی در اندازه افزایش می یابد. کلید SizeChange بیشتر از 1. 0 است ، بنابراین شکل ها همیشه در اندازه افزایش می یابد. این بدان معناست که مورد پایه زمانی اتفاق می افتد که بازگشت به عمق 80 برسد ، زیرا مورد پایه اندازه کمتر از 1 نمی رسد.

Game of Life Glider Conway

بازی زندگی Conway نمونه ای مشهور از اتوماتیک سلولی است. قوانین ساده این بازی باعث می شود الگوهای جالب و پر هرج و مرج در یک شبکه 2D ظاهر شود. یکی از این الگوهای یک گلایدر متشکل از پنج سلول در یک فضای 3 × 3 است:

Glider Fractal در اینجا دارای گلایدرهای اضافی است که در هر یک از پنج سلول آن کشیده شده است. متغیر سوم به درستی موقعیت شکل های بازگشتی در فضای 3 3 کمک می کند.

شما می توانید یک اجرای پایتون از بازی زندگی Conway در کتاب من "کتاب بزرگ پروژه های کوچک پایتون (بدون نشاسته پرس" ، 2021) و به صورت آنلاین در https://inventwithpython.com/bigbookpython/project13.html پیدا کنید. به طرز غم انگیزی ، جان کانوی ، ریاضیدان و استاد که بازی زندگی کانوی را توسعه داد ، در آوریل 2020 از عوارض Covid-19 درگذشت.

مثلث Sierpiński

ما مثلث Sierpiński Fractal را در فصل 9 ایجاد کردیم ، اما سازنده هنر Fractal ما می تواند با استفاده از عملکرد شکل DrawTriangleOutline () آن را دوباره ایجاد کند. از این گذشته ، یک مثلث Sierpiński یک مثلث دو طرفه با سه مثلث کوچکتر مساوی است که در فضای داخلی آن کشیده شده است:

مرکز این مثلث های کوچکتر اندازه * Math. sqrt (3) / 6 واحد از مرکز مثلث قبلی است. این سه تماس قبل از حرکت بر روی محور Y نسبی لاک پشت ، عنوان لاک پشت را به 0 ، 120 و 240 درجه تنظیم می کنند.

ما در ابتدای این فصل درباره Fractal Wave بحث کردیم و می توانید آن را در شکل 13-5 مشاهده کنید. این فراکتال نسبتاً ساده سه مثلث بازگشتی کوچکتر و مجزا ایجاد می کند:

فراکتال شاخ شبیه شاخ رم است:

این فراکتال ساده از مربع ها تشکیل شده است که هر یک از آنها کمی کوچکتر است ، به سمت بالا حرکت کرده و 11 درجه از مربع قبلی چرخانده است. ما حداکثر عمق بازگشت را به 100 افزایش می دهیم تا شاخ را به یک مارپیچ محکم گسترش دهیم.

برف

Fractal نهایی ، برف ، از مربع هایی که در یک الگوی پنتاگون قرار گرفته اند تشکیل شده است. این شبیه به چهار گوشه Fractal است ، اما به جای چهار مربع بازگشتی به طور مساوی با فاصله از فاصله استفاده می کند:

این فراکتال از توابع کوسین و سینوسی از مثلثات استفاده می کند ، که در توابع Math. cos () و Math. Sin () پایتون اجرا شده است ، برای تعیین چگونگی تغییر مربعات در امتداد محور x و محور y. یک دایره کامل 360 درجه دارد ، بنابراین به طور مساوی از پنج مربع بازگشتی در این دایره فاصله می گیریم ، آنها را در فواصل 0 ، 72 ، 144 ، 216 و 288 درجه قرار می دهیم. توابع Math. cos () و Math. Sin () انتظار دارند که استدلال زاویه به جای درجه ها در رادیان باشد ، بنابراین باید این اعداد را با Math. pi / 180 ضرب کنیم.

نتیجه نهایی این است که هر مربع توسط پنج مربع دیگر ، که توسط پنج مربع دیگر احاطه شده اند و غیره ، احاطه شده است تا یک فراکتال شبیه کریستالی ایجاد شود که شبیه یک برف برفی باشد.

تولید یک مربع یا مثلث

برای تکمیل ، می توانید Draw_Fractal را روی 10 یا 11 تنظیم کنید تا ببینید که یک تماس یکسان برای CrawfiledSquare () و DrawtriangleOutline () در پنجره لاک پشت تولید می کند. این اشکال با اندازه 600 کشیده شده است:

پس از ترسیم فراکتال یا شکل بر اساس مقدار در draw_fractal ، این برنامه turtle. exitonclick () را صدا می کند تا پنجره لاک پشت باز شود تا کاربر آن را کلیک کند. سپس برنامه خاتمه می یابد.

ایجاد فراکتال های خود

شما می توانید با تغییر مشخصات منتقل شده به عملکرد Drawfractal () ، فراکتال های خود را ایجاد کنید. با فکر کردن در مورد چند تماس بازگشتی که دوست دارید هر تماس را برای تولید ترسیم () و چگونگی تغییر اندازه ، موقعیت و عنوان شکل ها شروع کنید ، شروع کنید. شما می توانید از توابع دفع شکل موجود استفاده کنید یا خود را ایجاد کنید.

به عنوان مثال ، شکل 13-11 نه فراکتال داخلی را نشان می دهد ، به جز توابع مربع و مثلث تعویض شده است. برخی از اینها شکل های بی پروا ایجاد می کنند ، اما برخی دیگر می توانند به زیبایی غیر منتظره منجر شوند.

شکل 13-11: نه فراکتال که با سازنده هنر فراکتال همراه هستند ، با توابع شکل دادن به شکل تعویض می شوند

خلاصه

پروژه های سازنده هنر فراکتال امکانات بی پایان بازگشت را نشان می دهد. یک تابع ساده بازگشتی () که با یک تابع شکل گیری شکل جفت شده است ، می تواند تنوع زیادی از هنر هندسی مفصل ایجاد کند.

در هسته سازنده هنر فراکتال ، تابع بازگشتی () عقب نشینی () است که عملکرد دیگری را به عنوان یک آرگومان می پذیرد. این عملکرد دوم با استفاده از اندازه ، موقعیت و عنوان در لیست فرهنگ لغت مشخصات ، یک شکل اساسی را بارها و بارها ترسیم می کند.

می توانید تعداد نامحدودی از توابع طراحی شکل و تنظیمات مشخصات را آزمایش کنید. بگذارید خلاقیت شما هنگام آزمایش با کد در این برنامه ، پروژه های فراکتال خود را هدایت کند.

مقالات آموزش فارکس...
ما را در سایت مقالات آموزش فارکس دنبال می کنید

برچسب : نویسنده : بهزاد فراهانی بازدید : <-PostHit-> تاريخ : جمعه 25 فروردين 1402 ساعت: 16:00