•✿♥lostlove♥✿•
New member
چگونه می توان در محیط گرافیك زبان C یك شكل پیچیده را حركت داد؟
در محیط گرافیك در زبانهای برنامه نویسی تحت DOS اشكال ساده مثل مستطیل و دایره را می توان با پاك كردن و كشیدن مجدد براحتی جابجا نمود اما حركت اشكال پیچیده با این روش بسیار وقت گیر می باشد بطوریكه پاك كردن و كشیدن دوباره شكل كاملا به چشم می آید. در چنین مواقعی می بایست شكل مورد نظر را كه در داخل یك مستطیل فرضی قرار دارد , وارد یك حافظه كمكی نمود و محتویات این حافظه را در نقطه ای دلخواه در صفحه چاپ كرد .
در ابتدای كار یك متغیر از نوع int تعریف كنید كه اندازه شكل محاسبه شود و در آن قرار گیرد. یك متغیر نیز از نوع *void تعریف كنید كه در واقع بافری است كه رنگ پیكسل های مستطیل در آن به ترتیب قرار می گیرند تا در موقع لزوم به همان ترتیب چاپ شوند :
حال حافظه ای را با تابع malloc به اندازه size به buffer اختصاص دهید :
حال نوبت به خواندن پیكسلهای مستطیل می باشد. این كار را با تابع getimage انجام دهید كه پیكسلها را خوانده و در بافر قرار می دهد :

در محیط گرافیك در زبانهای برنامه نویسی تحت DOS اشكال ساده مثل مستطیل و دایره را می توان با پاك كردن و كشیدن مجدد براحتی جابجا نمود اما حركت اشكال پیچیده با این روش بسیار وقت گیر می باشد بطوریكه پاك كردن و كشیدن دوباره شكل كاملا به چشم می آید. در چنین مواقعی می بایست شكل مورد نظر را كه در داخل یك مستطیل فرضی قرار دارد , وارد یك حافظه كمكی نمود و محتویات این حافظه را در نقطه ای دلخواه در صفحه چاپ كرد .
در ابتدای كار یك متغیر از نوع int تعریف كنید كه اندازه شكل محاسبه شود و در آن قرار گیرد. یك متغیر نیز از نوع *void تعریف كنید كه در واقع بافری است كه رنگ پیكسل های مستطیل در آن به ترتیب قرار می گیرند تا در موقع لزوم به همان ترتیب چاپ شوند :
int size;
void* buffer;
حال می بایست اندازه مستطیل را با تابع imagesize محاسبه و در متغیر size بریزید : void* buffer;
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 را آزاد كنید : ----------------------------------------------------------------------------------------------------------
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
free(buffer);
توجه كنید كه شكل لزوما یك مستطیل نیست بلكه برای ذخیره سازی شكل در حافظه یك مستطیل فرضی دور شكل در نظر گرفته می شود . برای مثال میتوانید كد زیر را كپی كرده و در محیط TC اجرا كنید :
#include
#include
#include
int main()
{
int driver=DETECT,mode=0,size,column,row,horiz,vert;
void* buffer;
initgraph(&driver,&mode,"c:tcbgi");
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,"www.PooyeshR.com");
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;
}
#include
#include
int main()
{
int driver=DETECT,mode=0,size,column,row,horiz,vert;
void* buffer;
initgraph(&driver,&mode,"c:tcbgi");
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,"www.PooyeshR.com");
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;
}