1. این پایگاه به ثبت ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ایران رسیده است.

    مهمان عزیز سپاس بابت بازدید شما از تالار گفتگوی دهه هفتادی ها.

    عضویت در انجمن رایگان بوده و برای عموم باز میباشد . با صرف 30 ثانیه یکی از اعضای دهه هفتادی ها شوید .

چگونه می توان در محیط گرافیك زبان C یك شكل پیچیده را حركت داد؟

شروع موضوع توسط saeid-ha ‏Aug 12, 2013 در انجمن برنامه نویسی و طراحی سایت

  1. saeid-ha

    saeid-ha belong to autumn !...

    3,098
    11,982
    1,894
    چگونه می توان در محیط گرافیك زبان c یك شكل پیچیده را حركت داد؟




    در محیط گرافیك در زبانهای برنامه نویسی تحت DOS اشكال ساده مثل مستطیل و دایره را می توان با پاك كردن و كشیدن مجدد براحتی جابجا نمود اما حركت اشكال پیچیده با این روش بسیار وقت گیر می باشد بطوریكه پاك كردن و كشیدن دوباره شكل كاملا به چشم می آید. در چنین مواقعی می بایست شكل مورد نظر را كه در داخل یك مستطیل فرضی قرار دارد , وارد یك حافظه كمكی نمود و محتویات این حافظه را در نقطه ای دلخواه در صفحه چاپ كرد .

    در ابتدای كار یك متغیر از نوع int تعریف كنید كه اندازه شكل محاسبه شود و در آن قرار گیرد. یك متغیر نیز از نوع *void تعریف كنید كه در واقع بافری است كه رنگ پیكسل های مستطیل در آن به ترتیب قرار می گیرند تا در موقع لزوم به همان ترتیب چاپ شوند:



    int size;

    void* buffer;


    حال می بایست اندازه مستطیل را با تابع imagesize محاسبه و در متغیر size بریزید:



    size=imagesize(x1,y1,x2,y2);


    كه پارامتر های آن به ترتیب مختصات گوشه بالای سمت چپ مستطیل و گوشه پایین سمت راست آن می باشند.

    حال حافظه ای را با تابع malloc به اندازه size به buffer اختصاص دهید:



    buffer=malloc(size);


    الگوی این تابع در سر فایل alloc.h قرار دارد.(الگوی سایر توابع گفته شده در graphics.h می باشد.)

    حال نوبت به خواندن پیكسلهای مستطیل می باشد. این كار را با تابع getimage انجام دهید كه پیكسلها را خوانده و در بافر قرار می دهد:



    getimage(x1,y1,x2,y2,buffer);


    كار ما برای خواندن مستطیل به پایان رسیده است . فقط كافیست بافر خوانده شده را با تابع putimage در نقطه دلخواه چاپ كنیم :



    putimage(x,y,buffer,COPY_PUT);


    دو پارامتر اول این تابع مختصات نقطه مقصد می باشند .(گوشه بالای سمت چپ مستطیل در مقصد) پارامتر دوم بافر محتوی شكل و پارامتر سوم تعیین كننده نوع چاپ شدن شكل می باشد كه دارای حالات زیر است :



    Constant Value Meaning
    ----------------------------------------------------------------------------------------------------------
    COPY_PUT 0 Copies source bitmap onto screen
    XOR_PUT 1 Exclusive ORs source image with that already onscreen
    OR_PUT 2 Inclusive ORs image with that already onscreen
    AND_PUT 3 ANDs image with that already onscreen
    NOT_PUT 4 Copy the inverse of the source


    دقت كنید كه در پایان برنامه حتما حافظه گرفته شده با دستور malloc را آزاد كنید:



    free(buffer);


    توجه كنید كه شكل لزوما یك مستطیل نیست بلكه برای ذخیره سازی شكل در حافظه یك مستطیل فرضی دور شكل در نظر گرفته می شود . برای مثال میتوانید كد زیر را كپی كرده و در محیط TC اجرا كنید :




    #include
    #include
    #include
    int main(){
    int driver=DETECT,mode=0,size,column,row,horiz,vert;
    void* buffer;
    initgraph(&driver,&mode,"c:\tc\bgi");
    setcolor(LIGHTBLUE);
    rectangle(2,2,200,40);
    setfillstyle(SOLID_FILL,BLUE);
    floodfill(100,20,LIGHTBLUE);
    settextstyle(SMALL_FONT,HORIZ_DIR,7);
    setcolor(WHITE);
    outtextxy(12,10,"

    برای مشاهده لینک ها لطفا ثبت نام کنید و یا اگر حساب کاربری دارید وارد شوید

    ");

    rectangle(0,0,600,400);
    size=imagesize(1,1,201,41);
    buffer=malloc(size);
    getimage(1,1,201,41,buffer);
    column=1;
    row=1;
    horiz=1;
    vert=1;
    while(!bioskey(1)){
    putimage(column,row,buffer,COPY_PUT);
    column+=vert;
    row+=horiz;
    if(column==399 || column==1)
    vert=-vert;
    if(row==359 || row==1)
    horiz=-horiz;
    }
    free(buffer);
    closegraph();
    restorecrtmode();
    return 0;
    }
     
    lady taylor، Mehdi 3 و ♥سایه♥ از این ارسال تشکر کرده اند.
  2. lady taylor

    lady taylor مـــــلکـــــــــه (جدید)انــــجــــمـــن ^_^

    3,666
    11,050
    1,481
    سپاس
     
    saeid-ha از این پست تشکر کرده است.