اطلاعیه

Collapse
No announcement yet.

برنامهآ‌ای برای رسم اشکال (زبانی برای رسم گرافیکی)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    برنامهآ‌ای برای رسم اشکال (زبانی برای رسم گرافیکی)

    با سلام

    مقدمه
    فرض کنید شما میآ‌خواهید برای یک مقاله، گزارش، ... یک شکل تهیه کنید، به خصوص اگر این شکل شما منظم باشد. خوب شما چی کار میآ‌کنید؟ اولین چیزی که به ذهن میآ‌رسه به خصوص برای ذهن ویندوزیده شده استفاده از نرمآ‌افزارآ‌های گرافیک vector-based است. در ویندوز موجوداتی مثل corel-draw و visio و ... وجود داره. در لینوکس هم Dia و Inkscape و... داریم. ولی تمام این ابزارها گرافیکی هستند و کار با آنها سخت و بیآ‌مزه است. خوب روشآ‌های دیگری نیز وجود دارد آن هم استفاده از ابزارآ‌های text-base است. برنامهآ‌ای که اینجا میآ‌خواهم معرفی کنم، Asymptote است. این برنامه در واقع یک زبان برداری گرافیکی است Vector Graphic Language.

    Asymptote
    این برنامه یک زبان برای کشیدن اشکال مختلف است به خصوص اشکال ریاضی. علاوه بر این asy از یک اسکریپت نویسی شبیه به C استفاده میآ‌کند. این امکان تواناییآ‌های خارق العادهآ‌ای به شما میآ‌دهد که میآ‌توانید به کمک آن اشکال خیلی پیچیدهآ‌ای را به سادگی رسم کنید!

    یک مثال خیلی خیلی ساده
    من در آزمایش یک مدار استپر موتوری، میآ‌خواستم چند دایره روی استپر موتورآ‌ها بچسبانم که چرخش آنها را به خوبی نشان بدهد (اینجا هم در وبلاگم توضیح دادهآ‌ام). منظورم این دایرهآ‌ها است (البته مثال خیلی ساده است):


    خوب این دایرهآ‌ها را با این کد میآ‌توانید به سادگی درست کنید:


    کد PHP:
    size(700);
    void drawcir(pair base,int parts) {
        draw(circle(base,1),linewidth(0.5mm));
        for(int i=0;i<parts;i=i+2){
            filldraw(base--arc(base,1,(360/parts)*i,(360/parts)*(i+1))--cycle,black);
        }
    }
    drawcir((1,1),8);
    drawcir((3.2,1),16);
    drawcir((5.4,1),32); 
    


    توضیحات کد:
    خط ۱:اولین دستور (size) ابعاد تصویر را مشخص میآ‌کنه به این معنی که اندازه هر واحد از تصویر بعد از این دستور ۷۰۰ پیکسل خواهد بود.

    خط ۲:چون شکل تصویر کاملا منظم است (دقت کنید که این ابزار مناسب رسم اشکالی است که تا حدی منظم باشند)، کشیدن هر دایره را به صورت یک تابع (drawcir) در نظر گرفته شده است. این تابع دو پارامتر دارد، base که نقطه مرکزی دایره را نشان میآ‌دهد و parts که تعداد قسمتآ‌های سیاه سفید را مشخص میآ‌کند.

    خط ۳:در داخل تابع اولین دستور draw برای کشیدن مسیرآ‌ها استفاده میآ‌شود. مسیر ما در این حالت یک دایره (circle) است که مرکز آن base است و شعاع آن یک واحد است. دستور draw پارامترآ‌های فراوانی دارد که یکی از آنها ضخامت خط است (linewidth).

    خط ۴: حالا برای کشیدن قسمتآ‌های سیاه سفید نیاز به یک حلقه داریم. این حلقه در واقع رسم کننده قسمتآ‌های مشکی است که نصف تعداد parts هستند.

    خط ۵: این قسمت قلب این کد است. filldraw مانند draw یک مسیر را رسم میکند ولی علاوه بر آن داخل آن را پر میآ‌کند (در اینجا به صورت ساده فقط با رنگ مشکی و به صورت یکنواخت پر میآ‌شود). مسیر ما (قطاعآ‌های مشکی) از base شروع میآ‌شوند و با یک خط صاف (&ndash به ابتدای کمان (arc) میآ‌رسند. پارامترآ‌های کمان هم به ترتیب مرکز کمان، زاویه شروع و زاویه پایان است. در انتها نیز مسیر باید بسته شود و به جای ابتدایی باز گردد (cycle).

    خط ۸-۱۰: فراخوانی تابع برای کشیدن سه دایره.

    حالا باید فایل را با صدا زدن asy کامپایل کنید. دقت کنید که فرمت خروجی پیشفرض eps است. شما میآ‌توانید با سوئیچ f- فرمت خروجی مورد نظر خودتون را مشخص کنید:

    asy circles.asy -f gif


    این فقط یک نمونه خیلی ساده برای asy بود که به هیچ عنوان نمیآ‌تواند حق مطلب را درباره این برنامه فوقآ‌العاده بیان کند. حتما سری به سایت asy در اینجا بزنید. علاوه بر این گالری اشکال تولید شده را نیز در اینجا از دست ندهید!

    این هم یک مثال زیبا از گالری به نام درخت پیتاگوراس (البته من تغییرش دادهآ‌ام و کمی احتمالات به آن اضافه کردهآ‌ام).



    (*) آدرس سایت برنامه http://asymptote.sourceforge.net/
    (*) گالری برنامه http://asymptote.sourceforge.net/gallery/
    (*) دوستان لینوکس کار میآ‌توانند این برنامه را به سادگی از مخازن نصب کنند. دوستان ویندوزی هم نگران نباشند نسخه ویندوز نیز وجود دارد.
    من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

    #2
    رسم دیسک یک انکودر چرخشی ( asymptote زبانی برای رسم گرافیکی)

    با سلام
    یه چیز جالب شبیه مثال قبل به ذهنم رسید که با asy رسم کنم.
    فرض کنید که میآ‌خواهیم دیسک یک شفت انکودر گردشی مطلق را رسم کنیم (Absolute Rotary Shaft Encoder). برای رسم این دیسک میآ‌توانیم خیلی ساده از asy استفاده کنیم.
    این مثال خیلی ساده است، ولی اگر دوستان علاقهآ‌مند شدند بیایید ایده بدهید که چگونه انکودر را با کد گری (Gray Code) رسم کنیم.



    کد PHP:
    size(500);
    import labelpath;
    void drawStrip(pair base,real rad,real height, int parts, int angle) {
        filldraw( arc(base,rad,(360/parts)*angle,(360/parts)*(angle+1))--arc(base,rad+height,(360/parts)*(angle+1),(360/parts)*angle)--cycle,black);
    }
    void drawEncoder(pair base,real innerRad,real stripHeight,int bits){
        int parts=1;
        for(int i=0;i<bits;++i) {
            parts=parts*2;
            for(int j=0;j<parts;j=j+2) {
                drawStrip(base,innerRad+i*stripHeight,stripHeight,parts,j);
            }
        }
        draw((base-(0,-stripHeight/2))--(base-(0,stripHeight/2)),linewidth(0.5));
        draw((base-(-stripHeight/2,0))--(base-(stripHeight/2,0)),linewidth(0.5));
        labelpath("Absolute Rotary Encoder by Manian.",reverse(arc(base,innerRad/2,0,360)),fontsize(9));
    }
    drawEncoder((1,1),0.2,0.08,10); 
    


    من دوست دارم آزاد فکر کنم، نرمآ‌افزارآ‌ و سختآ‌افزارهای آزاد را به کار ببرم و اگر توانستم نرمآ‌افزار، سختآ‌افزار و محتوای آزاد درست کنم!

    دیدگاه

    لطفا صبر کنید...
    X