2

ترسيم خط مستقيم و باريك

2

سيستم مختصات جدولي

2

مستقل بودن يك برنامه از دستگاه

3

توابع چهار چوب- با فر

3

Voide glnitdisplay(int mode)            

3

Int gGetMaxX(void),int gGetMaxY(void)             

3

Gplotpixel(int x,int y,COLOR color)         

4

gColor gReadPixel(int x,int y)         

4

Void gClearScreen(void)         

4

Void gclosedisplay(void)         

4

دستيابي به جدول رنگها

6

فرم فراخواني و توضيح توابع مربوط به پردازش جدول رنگها

7

GPELETTEINIT(VOID)     

7

GPALETTEGETSIZE(VOID)     

7

GPALETTEPUT(INT START_ENTRY,PALETTE*PALETTE)      

7

PALETTE gpaletteget(int start_entry,gpalette *palette,int  entries)      

8

شروع رسم گرافيك

8

lnigraph دستور العمل

8

تابع اشتباهات گرافيكي

8

graphreslut تابع

10

garpherrormsgتابع

10

مشتر˜كات برنامه هاي گرافيكي

11

الگوريتم ترسيم يك نقطه

11

الگوريتم ترسيم خط

12

ترسيم يك˜ مستطيل

14

الگوريتم ترسيم دايره

16

ترسيم سريع دايره

19

حفظ ˜كردن سيماي حقيقي

19

الگوريتم ترسيم بيضي

24

الگوريتم ترسيم چند ظلعي ها

 

 

25

Cدستورات گرافيكي در

26

ARC1- دستور العمل

26

BAR2- دستور العمل

27

BAR3D3- دستور العمل

27

Circle4- دستور العمل

27

Cleardevice 5- دستور العمل

27

 Clearviewport 6- دستور العمل  

27

Closegraph 7- دستور العمل

27

detectgraph 8-دستور العمل

29

drawpoly9- دستور العمل

29

Ellipse 10- دستور العمل

29

Fill Ellipse 11- دستور العمل

29

Fill poly 12- دستور العمل

30

floodfill 13  دستور العمل  

30

get arc coords 14- دستور العمل

30

getaspectratio 15- دستور العمل

30

getbkcolor16- دستور العمل

30

get color17-دستور العمل

30

Get default palette18-دستور العمل

30

Get driver name19-دستور العمل

30

Get fill pattern20-دستور العمل

31

Get fill setting21-دستور العمل

31

Get graphmode22-دستور العمل

31

Get image23-دستورالعمل

31

get line setting24-دستور العمل

31

get max color25- دستور العمل

31

get max mode name26- دستور العمل

31

get max x27- دستور العمل

31

get max y28- دستور العمل

32

get mode name29-دستور العمل

32

Get mode arrange30- دستور العمل

32

get palette31- دستور العمل

32

get pallet size32- دستور العمل

32

Get pixel33- دستور العمل

32

get text setting 34- دستور العمل

32

Get view setting35- دستور العمل

32

Get x36- دستور العمل

33

Get y37- دستور العمل

33

graph defaults38- دستور العمل

33

graph error39- دستور العمل

33

-graph get mem40- دستور العمل

33

-graph free mem41- دستور العمل

33

graph result42- دستور العمل

33

image size43- دستور العمل

33

initgraph44- دستور العمل

34

Install user driver 45- دستور العمل

34

Install user font(char name)46- دستور العمل

34

line47- دستور العمل

34

linerel48- دستور العمل

34

Line ot49- دستور العمل

34

moverel50- دستور العمل

34

Move to51- دستور العمل

35

out text52- دستور العمل

35

Out text xy53- دستور العمل

35

pie slice  54- دستور العمل

35

Put image   55- دستور العمل

35

Put picxel56- دستور العمل

35

rectangle 57- دستور العمل

35

register  bgi driver 58- دستور العمل

35

register bgi font 59- دستور العمل

36

Register crt mode60- دستور العمل

36

Sector 61- دستور العمل

36

set active page62- دستور العمل

36

Set all palette63- دستور العمل

36

set aspect ratio64- دستور العمل

36

set bk color65- دستور العمل

36

Set color66- دستور العمل

36

set fill pattern67- دستور العمل

36

set fill style68- دستور العمل

37

set graph buf size69- دستور العمل

37

set graph mode70- دستور العمل

37

set palette71- دستور العمل

37

set rgb palette72- دستور العمل

37

Setline style73- دستور العمل

37

set text justify74- دستور العمل

37

set text style75- دستور العمل

37

Set user char size76- دستور العمل

38

Set view port77- دستور العمل

38

set visual page78-تابع

38

set write mode79- دستور العمل

38

Text height80- دستور العمل

38

Text width81- دستور العمل

39

مراجع

 

 

 

 

 

 

 

 

 

 

 

مقدمه

گرافيك در نتيجه كوشش هنرمندان در گالريهاي هنري بوده و با آمدن سينما و رايانه  تكامل يافته به طور يكه اكنون قدرتمند تر ين جلوه هاي هنري در زمينه هاي مختلف به وسيله شاه كار مهندسي قرن رايانه به وجود مي آيد و به سلاحي قدرتمند در دست ابر قدرتها تبديل شده به طور يكه هم اكنون با كمي دقت متوجه ميشويم كه آنها به وسيله اين ابزار قدرتمند بر ذهن فكر علايق و سليقه هاي ما تاثير گذاشته و همان گونه كه ميخواهند آنها را جهت دهي ميكنند به طور يكه خوراكيهاي مثلا مانند نوشابه و پيتزا را در برنامه هاي غذاي ما وارد كرده كه نتيجه آن سود فراوان براي آنها ميباشد و مساله اي كه خيلي از اين موضوعي كه بيان شد خطرناك تر ميباشد مسئله تهاجم فرهنگي است كه با يك مثال ساده كه خود شخصا با آن مواجه بوده ام را  بيشتر توضيح ميدهم

.زمانيكه آقاي رضا زاده وزنه بردار سرشناس ايراني در دوره گذشته المپيك سنگينترين وزنه را به بالاي سر برد تيتر روزنامه داخلي چه بود ؛هركول رضا زاده؛ به نظر شما چرا به جاي آنكه بگويند رستم رضا زاده گفتند هركول رضا زاده؟ شايد گفت هركول رضا زاده  به خاطر اينكه ذهنيتي از يك اسطوره بيگانه رومي داشت ولي هيچ گونه ذهنيت و تصويري از رستم نداشت يعني كاملا با اسطوره ملي خود بيگانه و شناخت بسيار اندكي شايد در حد اينكه يك چنين شخصي با چنين اسمي در يك كتابي وجود داشته

اگر در رفتار  برادران و خواهران كوچك خود بيشتر دقت كنيم ميبينيم كه اگر پسر بچه اي با شمشير چوبي بازيميكند ميگويد كه آن شمشير زورو است و نه شمشير نادر و ... اگر با تير و كماني بازيميكند ميگويد كه اين كمان  رابينهود است و نه كمان آرش  اگر خواست كه خود را به شخص تنومندي نسبت دهد نيروي زور و بازوي خود را به هركول نسبت ميدهد و نه به زور و بازوي رسم ها و زمانيكه دختر بچه اي ميخواهد از زيبايي خود سخن بگويد خود را با سيندرلا سفيد برفي و امثال اينها مقايسه ميكند نه با شيرين ها و ليلا ها

با كمي تامل و درنگ در اين چند مثال ساده به عمق فاجعه اينكه در آينده در انتظار ماست پي ميبريم و هيچ گاه به اين فكر نكنيد كه اسطوره هاي آنها  به پايان ميرسد و ديگر حرفي براي گفتن نخواهند داشت زيرا كه آنها در حال ساخت اسطوره هاي جديد براي تزريق آنها به ما و نسلهاي بعد از ما ميباشند كه بيانگر افكار و عقايد شخصي آنها ميباشد كه به ما القا ميشود كه از جديد تر ين اين اسطوره ها ميتوان شرك را نام برد كه مثلا شخصيت مثبت اين فيلم سينمايي چگونه به ورزش منفي كشتي كج  مشروعيت ميبخشد و آن را به كودكان كه مخاطب حقيقي اين گونه فيلمها هستند معرفي ميكند اين چند مثالي كه من براي شما بيان كردم غالبا از فيلمهاي سينماي بود ولي بدانيد كه بازيهاي رايانه اينكه بيشترين اوقات فراقت كودكان را اشغال ميكند تاثيري بسيار بسيار بيشتر از فيلمها دارند و در حقيقت مكمل و تير خلاص نهائيميباشند كه همگي به وسيله برنامه هاي برنامه نويسي قدرت مندي كه از امانات گرافيكي و برنامه نويسي بالايي بهره من هستند    c,c++,c#استفاده ميشوند مانند

كه با اميد روز يكه برادران ،خواهران  فرزندان و نسلهاي بعد از ما با شمشير نادرها كمان ارش ها بازيكنند و زور و بازوي رستم ها را به خود نسبت دهند و هم چون ليلي و مجنون شيرين و فرهاد به هم عشق بورزند وارد مبحث اصليميشويم  كه همان

معرفي گرافيك در تور بو سي و سي++

 

 

ترسيم خط مستقيم و باريك

 

بهترين روش فراگيري طرز ترسيم اشكال شروع استفاده كردن از ابزارهاي موجود است خواه اين ابزارها برس هاي نقاشي يا برنامه هاي كامپيوتري باشند در اين مقاله عمليات اساسي گرافيك كامپيوتري براي رسم نقطه و خط را شرح ميدهيم .

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

 

سيستم مختصات جدولي

 

 نشان داده ميشود مختص (x ,y) مختصات هر نقطه گرافيكي با دو مختص صحيح آن به صورت

 "افقي" متناظر با ستون صفحه نمايش و مختص "عمودي"  متناظر با سطر آن است .نقطه (0،0) در گوش سمت چپ فوقاني صفحه نمايش قرارداردونقطه سمت راست تحتاني صفحه نمايش داراي  Ymax تعداد ستونهاي صفحه نمايش و  Xmaxاست كه در آن  (xmax-1,ymax-1)مختصات

تعداد سطرهاي صفحه نمايش را نشان ميدهد بنابراين "ايكس" از عدد صفر سمت چپ تا

 پائين صفحه نمايش Ymax-1 از عدد صفر بالاي صفحه نمايش تا "y"سمت راست و xmam-1

تغيير ميكند.

در سيستم مختصات معمولي است  Y  برخلاف محور  Yبايد توجه داشت كه جهت محور

اين قرار داد به منظور مطابقت داشتن با روش پويش انجام شده توسط تلفزيون كه در آن خط پويش شماره صفر برابر با خط بالاي صفحه نمايش ميباشد اختيار شده است.

 

مستقل بودن يك برنامه از دستگاه

 

مستقل بودن يك برنامه از دستگاه نمايش به آن معني است كه به جاي برنامه نويسي سخت افزاري ثابتهاي ويژه دستگاهي مثل دقت صفحه نمايش بايستي به توانيم اين اطلاعات را از سيستم سئوال كنيم امروزه در اغلب سيستمهاي گرافيكي ميتوان بسياري از جنبه هاي سخت افزاري دستگاه نمايش را سئوال نمود كه در نتيجه برنامه ها  بر روي بسياري از سخت افزارها با تركيب بندي مختلف اجرا خواهند شد برنامه هاي گرافيكي غالبا وابسته به دستگاه هاي نمايشي خواص سيستم عامل و ساير مشخصات دستگاههاي نمايش گرافيكي مثل تعداد رنگهاي موجود  آن ميباشد وجود انواع فوق العاده زياد سخت افزار سهولت استفاده از آنها را خيلي مشكل ميسازد با وجود اين كتابخانه هاي گرافيكي و استانداردها در حال بهبود يافتن است .

دستگاه هاي نمايش جدولي داراي دو مشخصه عمده زير ميباشد:

1-ابعاد دستگاه نمايش(تعداد سطر و تعداد ستونها).

2-تعداد رنگهاي موجود يا اگر از كارت 24بيتي استفاده ميشود تعداد سطوح شدت روشنائي موجود براي قرمز سبز و آبي.

 اغلب كارتهاي گرافيكي در حالتهاي مختلف كار ميكنند كه هر كدام تركيبات مختلفي از دو

استاندار داراي دو حالت اساسيVGAمشخصه قبلي را ارائه ميدهند به عنوان مثال حتي كارت

است : دقت 400*640 با 16 رنگ براي هر نقطه گرافيكي يا دقت 320*200 با 256 رنگ براي هر نقطه گرافيكي ميباشد.

 

توابع چهار چوب- با فر

 

قبل از فراگيري چهار چوب با فر لازم است بدانيم كه نقاط گرافيكي در يك برنامه گرافيكي چگونه

ذخيره ميشود gcolorنشان داده ميشود .يك نقطه گرافيكي چارچوب –با فر در يك نوع داده بنام

 با استفاده از دستورUsigned longمعادل يك داده از نوع   gcolorدر پياده سازي جاري يك

 تعريف شده است . براي پشتيباني كردن از چهار چوب – با فر هاي24 بيتيtypedefالعمل

 بستگي به حالت  gcolor استفاده كرده ايم. محدوده كانون داده  longاز نوع داده دستور العمل

گرافيكي مورد استفاده دارد.

براي حالت 256 رنگ مقادير از صفر تا 255 تغير ميكنند. هر مقدار يكه خارج از اين محدوده باشد تنها از 8 بيت پايين آن استفاده خواهد كرد. از اين رو مقدار257 مقدار 1 را نمايش ميدهد.

اگر يك نقطه گرافيكي رسم شده و يا از كارت گرافيكي خوانده شود بايست با استفاده از يك متغير 

  آن مقدار را نگه ميداريم به اين ترتيب به حصول سازگاري برنامه هاي شما با انواع gcolor

مختلف كارتهاي گرافيكي  كمك خواهد شد.

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

 

Voide glnitdisplay(int mode)

 

اين تابع داراي يك ارگومان صحيح براي تعيين كردن حالت عملياتيچهار چوب  با فر براي بقيه برنامه ميباشد. فراخوانياين تابع بايستي قبل از فراخواني هاي ديگر گرافيكي بوده و بايستي تنها يك بار فراخواني شود. اين تابع بستگي زيادي به سيستم عامل و دستگاه نمايشي دارد.

 

Int gGetMaxX(void),int gGetMaxY(void)

 

اين دو تابع داراي هيچ گونه آرگوماني نمي باشد  و هر كدام  يك عدد صحيحي را بر ميگرداند ˜كه به ترتيب نشان دهنده ماكزيمم دقت سطر و ستون چهار چوب با فر ميباشد ˜كه اين مقادير برگشتي    دارد.gintDisplay()بستگي به حالت گرافيكي تعيين شده به وسيله تابع

 

 Gplotpixel(int x,int y,COLOR color)

 

اين تابع اساسي تر ين عملي را ˜كه  بقيه بسته هاي گرافيكي روي آن بنا  خواهند شد ارائه ميدهد. اين تابع داراي دو ارگومان صحيح ˜كه شامل مشخصات سطر و ستون نقطه گرافيكي بوده و    به  تعريف ميشود  براي پشتيبانيlongصورت يك مقدار از نوع  colorارگومان سوم آن يعني

˜كردن از ˜كارت هاي24 بيتي از اين نوع داده استفاده ميشود.

 

gColor gReadPixel(int x,int y)

 

 روي چهارچوب با فر (x,y)اين تابع بر خلاف تابع قبل عمل مينمايد  اين تابع عنصرواقع درمحل

را بر مگرداند.

 

Void gClearScreen(void)

 

اين تابع تمام چهارچوب با فر را پا˜ ميكند .پا˜ ˜كردن به اين معنا است ˜كه تمام نقاط روي چهار چوب با فر برابر صفر قرار داده ميشوند ˜كه اين ˜كار باعث پا˜ شدن صفحه نمايش ميشود ˜كه رنگ صفحه پا˜ شده برابر با رنگ اختصاص داده شده به عدد صفر در جدول رنگ مورد استفاده ميباشد  دقيقا اين ˜كار را مي توان به وسيله يك حلقه تكرار ˜كه به وسيله آن تمام نقاط با فر را برابر

صفر قرار ميدهيم ولي اغلب بسته هاي گرافيكي داراي يك تابع ميباشند ˜كه به وسيله آن ميتوان صفحه نمايش را سريعتر پا˜ كرد

 

Void gclosedisplay(void)

 

اين تابع داراي هيچ گونه ارگوماني نميباشد و تمام عمليات گرافيكي را خاتمه ميدهد˜ه در نتيجه آن  قرار داشت بر ميگرداندglnitdispay()صفحه نمايش به حالتي ˜كه قبل از فراخواني تابع

براي سيستمهاي مبتني بر سيستم عامل داس اين تابع صفحه نمايش را پا˜ كرده و آن را مجددا به حالت متني بر ميگرداند

توابع ˜كه فوق الذ˜كر جنبه هاي وابسته به دستگاه چهارچوب با فر را پردازش ميكنند. همچنين بايستي توابعي براي دستيابي به جدول رنگها داشته باشيم.

 

دستيابي به جدول رنگها

 

˜كه در يكي از حالتهاي 256 رنگ (˜كه به Vga svgaتوابع جدول رنگها تنها در مورد ˜كارتهاي 

تعيين ميگردد)˜كار ميكنند مفيد ميباشد در ˜كارتهايgintdisplayصورت پيش فرض به وسيله تابع

در حالت 16 رنگ جدول رنگ سخت افزار قابل دسترسي به برنامه شما نيست. در Vga/ega

حالت 16 رنگ هرگونه نوشتن بر روي جدول رنگها تاثيري ندارد و در موقع استفاده از تابع

هرگونه خواندن از ˜كارت گرافيكي هميشه مشخصات رنگ جدول پيش فرض را Gpaletteget()

بر ميگرداند.

را ˜كه  شامل ارايه اي از gpaletteبه منظور سهولت  در  پردازش  جدول  رنگها   ساختار 

يك ساختار ميباشد ˜كه gpaletteEnttryميباشد تعريف ميكنم هر عنصر gpaletteEntryعناصر

به صورت زير استgpalettEntryمتناظر با يك عنصر جدول رنگهاست از اين رو هر عنصر

 

Typedef struct gPaletteentry_struct{

Unsigned in red;

Unsigned in green;

Unsigned in blue;

}gPaletteEntry;

 

 بايستي درمحدوده صفر تا 255 باشند ˜كه  صفر براي تيره ترينred ,green,blueمقادير فيلدهاي

رنگ و255 براي روشن تر ين رنگ ميباشد . از اين رو براي ساختن رنگ سفيد بايستي هر سه

   يك ارايه از عناصر پياپي جدول رنگها را به صورتgPaletteمقدار برابر 255 باشند. ساختار

زيرتعريف ميكند:

Typedef struct gPalette_struct {

Int nentrie;

gPaletteEntry *p;

{gPalette;

 براي gPaletteEntryCopy(),gPaletteEntryCreate()gPaletteEntryDelete() توابع

ساختن حذف ˜كردن و كپي ˜كردن ساختارهاي جدول رنگها ميباشند  اين ساختارها ميتوانند شامل تمام جدول رنگ براي گرافيك سخت افزار موجود و يا هر زير مجموعه اي از جدول رنگها به اندازه مناسب از مشكل ذخيره سازي اطلاعاتي ˜كه برنامه شما gPaletteلازم است ˜كه ساختار

عملا به آن نياز ندارد جلوگيري خواهد شد  به عنوان مثال اگر برنامه شما تنها به سه رنگ مجزا   

شامل تنها سه عنصر مورد نياز ميباشد ولو اينكه gPaletteنياز داشته باشد در اين صورت يك

.سخت افزار موجود از 256 رنگ پشتيباني مي ˜كند

 وجود دارند.gPaletteعلاوه بر توابع استاندارد توابع متعددي ديگري براي پردازش يك ساختار

 ميتوان رنگ هر عنصر در جدول رنگها را تعيين ˜كرد.gSetPaletteEntry()با استفاده از تابع

داراي پنج ارگومان است . ارگومان اول اشاره گر به ساختار جدول  gSetPaletteEntry()  تابع

رنگهاي مورد نظر ميباشد ارگومان دوم شماره عنصر مورد نظر ميباشد ˜كه از صفر شروع ميشود و سه ارگومان آخري رنگهاي قرمز سبز و آبي مورد نظر براي ذخيره ˜كردن در عنصر مربوطه ميباشند به عنوان مثال ˜د زير يك جدول پنج رنگ را درست ميكند:

 

gPalette *palette;

 

palette = gPaletteCreate(5);

crate palette of 5 elements */

make entry 0 black */

gsetpaletentry(palette,0,0,0,0);

make entry 1 red */

gsetpaletentry(palette,1,255,0,0);

make entry 2 green */

gsetpaletentry(palette,2,0,255,0);

make entry 3 blue */

gsetpaletentry(palette,3,0,0,255);

make entry 4 white */

gsetpaletentry(palette,4,255,255,255);

gpaletteput(0,palette,5);

gpaletteput(0,palette,5);

 

 تنها عنصر جدول رنگها را تغيير ميدهد ولي عملا جدول رنگها را gsetpaletteentry()تابع

روي سخت افزار گرافيكي نمي نويسيد  براي اعمال يك تغيير عملي روي دستگاه نمايشي بايستي  را فراخواني كنيم.gPutPalette()تابع

در بيشتر مواقع يك جدول رنگ با حداقل 16 عنصر وجود دارد. بنابر ين شما يك جدول رنگ استاندارد داراي 16 رنگ را تعريف ˜كرده ايد ˜كه ميتوانيد با استفاده از رنگهاي اصلي و تمام رنگهاي فرعي ˜كه از تر˜كيبات رنگهاي اصلي به وجود آمده اند و همچنين تعدادي رنگهاي معمولي  به صورت ما˜كرو gtypes.hديگر اشكال مورد نظر را رسم ˜نيم . مقادير رنگها در فايل عنوان

تعريف شده اند  ليست زير اسامي رنگها و عناصر متناظر آنها در جدول رنگها را نشان ميدهد  ˜كه اگر به يكي از مقادير رنگها نياز داشته باشيم ميتوانيم يكي از اسامي نمادي زير را به ˜كار ببريم

اين مطلب تا زماني صحت دارد ˜كه برنامه شما 16 عنصر اول جدول رنگ را تغيير نداده باشد.

 

 

#define Gblack 0

#define Gblue 1

#define ggreen 2

#define gcyan 3

#define gred 4

#define gmagneta 5

#define gbrown 6

#define glightgrey 7

#define gdrakgrey 8

#define gbrightblue 9

#define gbrightgreen 10

#define gbrightcayn 11

#define gbrightred 12

#define gbrightmagneta 13

#define gyellow 14

#define gwhite 15

 

 

 

فرم فراخواني و توضيح توابع مربوط به پردازش جدول رنگها

 

GPELETTEINIT(VOID)

 

اين تابع جدول رنگها را برابر مشخصات پيش فرض قرار ميدهد. رنگ شماره 0 برابر رنگ سياه برابر رنگ سفيد خواهد بود.16 عنصر اولGPALETTEGETSIZE()-1بوده و رنگ شماره

خواهد بود  در مورد يك جدول رنگ داراي GTYPES.Hمطابق رنگهاي تعريف شده در فايل  

256 رنگ عناصر از 16 تا 256 برابر يك مقياس رنگي قرار داده خواهد شد ˜كه براي طرحهاي رنگي مدرج مفيد ميباشد.

 

GPALETTEGETSIZE(VOID)

 

اين تابع تعداد ما˜زيمم عناصر موجود در جدول رنگها براي حالت جاري نمايش را بر ميگرداند را GPLOTPIXEL()به اين ترتيب ميتوانيم محدوده مقادير ممكن براي ارگومان رنگ در تابع

تعيين ˜كنيم اين مقادير تقريبا هميشه برابر 16 متناظر با مقادير رنگهاي قانوني از صفر تا 15 و يا براي 256 متناظر با مقادير رنگهاي قانوني از صفر تا 255 است . همچنان ˜كه قبلا اشاره شد جدول رنگ داراي 16 رنگ را نميتوان با برنامه تغيير داد.

 

GPALETTEPUT(INT START_ENTRY,PALETTE*PALETTE)

 

 شروع ميشود تعيين ميكندSTART_ENTRYاين تابع رنگهاي جدول رنگ را ˜كه از عناصر

مقادير رنگها از ساختار جدول رنگها به جدول رنگهاي سخت افزار ˜پي ميشود و تمام عناصر از

 را تغيير (START_ENTRY+PALETTE->NENTRIES-1) تا START_ENTRY

ميدهد. با استفاده از اين تابع ميتوان تعدادي از عناصر جدول رنگها را بدون نياز به تغيير دادن تمام جدول رنگها تغيير داد . به علاوه با استفاده از اين تابع ميتوان عناصر جدول رنگ را به صورت يك عنصر در هر زمان در صورت نياز تغيير داد. پس از فراخواني تابع 

 با رنگ عنصر اول START_ENTRY  نقطه گرافيكي برابر با GPALETTEPUT()

 با رنگ عنصر (START_ENTRY+1)جدول رنگها نمايش داده شده نقطه گرافيكي برابر با

دوم جدول رنگها نمايش داده ميشود و غيره.

 

PALETTE gpaletteget(int start_entry,gpalette *palette,int nentries)

 

 nentries شروع شده و به تعدادStart_entryاين تابع مشخصات جاري جدول رنگ را ˜كه از   

 باشد در اين صورت تابعNULLعنصر پيش مي رود بر ميگرداند. اگر ارگومان دوم برابر

  عنصر را تشكيل خواهد داد. اگر nentries يك ساختار جديد جدول رنگها با getpalette

 اولين GPALETTEGET() باشد در اين صورت تابع NULLدوم يك اشاره گر غير

 باشد در اين صورت تابع PALETTE->NENTRIES بزرگتر از NENTRIES

 اشاره گر جدول رنگ انتقالي را از بين برده و يك جدول رنگ جديد GPALETTEGET()

 عنصر تشكيل ميدهد.NENTRIESبه طول

اگر چه ظاهرا پيچيده به نظر ميرسد ولي اين تابع در حقيقت پردازش جدول رنگها را  با تنظيم اتوماتيك اندازه ساختار جدول رنگ انتقالي براي به دست آوردن عناصر مورد نياز خيلي انعطاف پذير ميسازد اگر ساختار جدول رنگ به علت ˜كوچكي نتواند تمام عناصر را نگه دارد در اين صورت اندازه آن براي نگه داشتن عناصر مورد نظر مجددا تغيير داده ميشود . اگر يك اشاره گر جدول رنگ به اندازه مناسب بطور اتوماتيك ساخته ميشود. روش استاندار براي استفاده از اين فراخواني ها  به صورت زير است:

GPALETTE *MYPALETTE;

INT MAX_PALETTE_ENTRIES;

 

GPALETTEINIT();

MAX_PALETTE_ ENTRIES = GPALETTEGETSIZE();

MYPALETTE = GPALETTEGET(0,NULL,MAX_PALETTE_ ENTRIES);

 به يك ساختار جدول رنگي اشاره ميكند ˜كه شامل تمام جدول رنگMYPALETTE اشاره گر

براي تمام انواع دستگاه هاي نمايشي ميباشد. ميتوانيم هر عنصر را با استفاده از

 تغيير داده و سپس جدول رنگ را به منظور تغيير دادن دستگاه GSETPALETTEENTRY

    مجددا بنويسد.GPALETTEPUT()با به ˜كار بردن تابع

 

شروع رسم گرافيك

براي رسم يك شكل گرافيكي قبل از هر ˜كار بايد درايور گرافيكي سيستم را معرفي ˜كنيم . ليست زير انواع درايورهاي گرافيكي در ˜كامپيوتر را نشان ميدهد.

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

#include <graphics.h>

int grapphdriver = detect,graphmode

 lnigraph دستور العمل

 پارامتراوايه گراف را تعيين ميكند .درايور گرافيكي را به حافظه مي آورد و مد lnigraphتابع

گرافيكي سيستم را تعيين مينمايد  در مجموعه دستور العمل هاي  زير مسير درايورها را پوشه جاري در نظر ميگيريم

 

تابع اشتباهات گرافيكي

اگر ˜كارت گرافيكي لازم وجود نداشته باشد و اگر درايور يافت نشود يا اشتباهات ديگري وجود  

نتايج حاصل از بروز graphreslut,garpherrormsgداشته باشد. كدي توليد ميشود  دو تابع 

اشكالات را تست كرده  و يا نشان ميدهند.

 

graphreslut تابع 

اين تابع ˜د عددي اشكالات حاصله از دستورات گرافيكي را ارائه ميدهد. ليست زير ˜د اشتباهات و ثابت هاي مربوطه و شرح هر يك را نشان ميدهد.

Error

Code

graphics_errors constant

Corresponding error message string

پيغام متناظر با خطا

0

grOk

No error

خطاي وجود ندارد

1

grNoInitGraph

BGI) graphics not installed (use initgraph)

گرافيد نصب نشده

2

grNotDetected

Graphics hardware not detected

سخت افزار گرافيكي يافته نشد

3

grFileNotFound

Device driver file not found

فايل درايور دستگاه يافت نشد

4

grInvalidDriver

Invalid device driver file

فايل راه انداز دستگاه وجود ندارد

5

grNoLoadMem

Not enough memory to load driver

حافظه ˜كافي براي بارگذاري راه انداز وجود ندارد

6

grNoScanMem

Out of memory in scan fill

7

grNoFloodMem

Out of memory in flood fill

8

grFontNotFound

Font file not found

فايل قلم يافت نشد

9

grNoFontMem

Not enough memory to load font

حافظه ˜كافي براي بارگذاري  قلم وجود ندارد

10

grInvalidMode

Invalid graphics mode for selected driver

مد گرافيكي براي راه انداز انتخاب شده وجود ندارد

11

grError

Graphics error

خطاي گرافيكي

12

grIOerror

Graphics I/O error

در ورودي/خروجي   خطاي گرافيكي

13

grInvalidFont

Invalid font file

فايل قلم وجود ندارد

14

grInvalidDeviceNum

Invalid font number

شماره قلم وجود ندارد

15

grInvalidDeviceNum

Invalid device number

شماره دستگاه وجود ندارد

16

grInvalidVersion

Invalid version number

شماره نسخه وجود ندارد

 

 

garpherrormsgتابع

 وجودcاين تابع يك اشاره گر به پيغام اشتباه مربوطه بر ميگرداند .اين پيغام ها در ˜كتابخانه گرافيكي

دارد. در شكل فوق اين پيغام ها را به همراه كد هاي مربوطه مي بينيم.

 

مشتر˜كات برنامه هاي گرافيكي

 

با توجه به موارد فوق برنامه هاي گرافيكي ميتوانند با دستورالعمل هاي مشابه مجموعه دستور العمل هاي زير شروع شوند.

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

int main(void)

{

  /* request autodetection */

  int gdriver = DETECT, gmode, errorcode;

  int midx, midy, i;

  int xradius = 100, yradius = 50;

 

  /* initialize graphics and local variables */

  initgraph(&gdriver, &gmode, "");

 

  /* read result of initialization */

  errorcode = graphresult();

  if (errorcode != grOk) {  /* an error occurred */

    printf("Graphics error: %s\n", grapherrormsg(errorcode));

    printf("Press any key to halt:");

    getch();

    exit(1);          /* terminate with an error code */

  }

 

 

 

 

 

 

الگوريتم ترسيم يك نقطه

 

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

 پس از دانستن مختصات صفحه نمايش ترسيم نقطه Gpoint pixel()يك كار آسان ميباشد تابع

اين كار را انجام ميدهد و داراي سه مشخصه به شرح زير ميباشد:

 نقطه مورد نظر  X 1- مختص

نقطه مورد نظر  Y 2- مختص

3- يك عدد صحيح  كه مشخص كننده مقدار انديس رنگ براي نوشتن به داخل چارچوب – با فر است.

رنگ حقيقي نقطه روي صفحه نمايش بستگي به جدول رنگ مورد استفاده ميباشد با وجود اين قبل  بايستي دستگاه نمايش را مقدار اوليه داده جدول رنگ راGPOINTPIXEL()استفاده از تابع

تعيين كرده و صفحه نمايش را پاك كنيم به علاوه بايستي اندازه چهارچوب با فر يعني تعداد نقاط

گرافيكي افقي و عمودي را  بايد تعيين كنيم

خواهد بود به طور كلي Ymax/2,Xmax/2 مختصات مركز صفحه نمايش هميشه در مختصات

برنامه بايستي مستقل از دستگاه نمايشي باشد. 

 

الگوريتم ترسيم خط

 

 حالا ميتوانيم اقدام به رسم پاره خطي بين دو نقطه داده شده ˜كنيم. Graphic.cبا استفاده از توابع

 رسم ˜كنيم با توجه به شكل زير (x2,y2)  به نقطه (x1,x2)اگر ميخواهيم ˜كه پاره خطي از نقطه

متغيرهاي را به صورت زير معرفي ميكنيم ˜كه بيانگر طول خطوط در دو محور عمودي و افقي ميباشد:

Dx = x2-x1

Dy = y2-y1

 ميباشد M=dy/dx برابر صفر باشد شيب(ضريب زاويه) يك خط برابر dxبا استثنا حالتي كه

 

 

 

 .در اين صورت در (abs(dx)>=abs(dy))اگر ضريب زاويه خط بين -1و+1 قرار داشته باشد

 هر ستوني يك نقطه گرافيكي قرار خواهد گرفت براي هر ستون آن نقطه را انتخاب ميكنيم ˜كه به  يك نقطه گرافيكي را در هر (abs(dy)>abs(dx))خط مورد نظر نزديكتر باشد براي حالت دوم

سطر قرار دهيم .هدف ما ساختن روشي براي پيدا ˜كردن نزديكترين نقطه در هر ستون و سطر به خط حقيقي ميباشد.

 ˜كار را شروع ميكنيم.Abs(dx)>=abs(dy)براي ساده نمودن تجزيه و تحليل با حالت ساده تر 

 باشد. اگر چنين نباشد ميتوانيم به آساني جاي دو نقطهX1بزرگتر از X2بعلاوه فرض ميكنيم ˜كه

انتهاي را تعويض ˜كنيم. از اين رو هميشه ميتواني روي صفحه از سمت چپ به راست حر˜ت ˜كنيم

 ميخواهيم نزديكترين نقطه به خط حقيقي را پيدا ˜كنيم. معادله يك خط X2 و X1براي ستون بين

 ميباشد B=y1-m*x1 و M= dy / dx ˜كه در آن Y=m*x + dغير عمودي را به صورت

 متناظر آن را با محاسبه معادله و گرد كردن آن به y ميتوانيد مختصxبه ازاي هر مختص

 به دست آوريم Graphic.h ا ز فايل  Round()نزديكترين عدد صحيح  با  استفاده  از  ما  كروي

بنابراين الگوريتم ترسيم خط خيلي ساده است:

Flot x,y,m,d:

Int x, iy;

 

M= (float) (y2 –y1)/ (float) (x2-x1);

M= y1 – m*x1;

For(x=x1; x<=x2; x++) {

Y=m*x + b;   iy = round(y); gplotpixel(x, iy, color);}

با وجود اين اين روش خيلي ˜كار آمد نيست. اولا توجه داشته باشيد كه از عمليات اعشاري زيادي  و يك (+b) و جمع اعشاري  m*xبه عدد اعشار ضرب اعشاري x استفاده ميشود . از تبديل عدد

 به ازاي هر نقطه گرافيكي خط مزبور استفاده شده است. ثانيا ميتواني به  Round(y)عمل مقايسه

 ستون  بعدي ميتوانيم yجاي عمل ضرب از عمل جمع استفاده ˜كنيم به اين معني ˜كه براي محاسبه

 هميشه برابر 1 xبراي اينكه مقدار افزايشي هميشه مختص   ستون قبلي استفاده كنيم از مقدار

مي باشد .در نتيجه الگوريتم جديد زير را داريم:

Float m, y;

Int x. iy;

 

M = (float) (y2-y1) / (float) (x2-x1):

Y = y1;

For(x=x1; x<=x2; x++) {

Iy = round(Y)

Gplotpixel (x, iy, color);

Y+= m;

}

 x وجود ندارد . حالا به ازاي هر مقدارbتوجه داشته باشيد ˜كه ديگر نيازي به محاسبه مقدار ثابت

يك جمع اعشاري و يك مقايسه اعشاري وجود دارد.

 

ترسيم يك˜ مستطيل

 

مستطيل شايد ساده تر ين شكلي است ˜كه ميتوان با استفاده از تابع ترسيم خط رسم نمود  يك˜ مستطيل به وسيله دو گوشه آن يعني گوشه سمت چپ فوقاني و گوشه سمت راست تحتاني همچنان ˜كه در شكل زير ميبينيد نشان داده ميشود بنابر اين ساختار مستطيل به صورت زير است:

Typedef struct grectangle_struct{

Float xmin  , ymin;

Float xmax , ymax;

}grectangte;

 

ترسيم يك˜ مستطيل آسان ميباشد ˜كافي است خطوط زير را رسم ˜كنيم:

(xmax , ymin)    به (xmin ,  ymin)خطي از

(xmax , ymax)   به (xmax ,  ymin)خطي از

(xmin , ymax)    به (xmax   ymax)خطي از

(xmin , ymin)    به  (xmin , ymax)خطي از

ميتوان الگوريتم ترسيم مستطيل را با توجه به اينكه  نيازي به استفاده از تابع ˜كلي رسم خط وجود ندارد تا اندازه اي ساده نمود. به جاي آن ميتوان نقاط گرافيكي روي لبه هاي آن را پر نمود براي اينكه اينها خطوط عمودي و يا افقي ميباشند به عنوان مثال براي رسم لبه هاي بالايي و پاييني يك˜ مستطيل ميتوان از يك حلقه ساده زير استفاده ˜كرد:

Int x;

Gcolor color;

Gractangle rect;

For (x=round(rect.xmin);x<=round(rect.xmax);x++){

Gplotpixel(x , rect.ymin  , color);

Gplotpixel(y , rect.ymax , color);

}

براي رسم ˜كردن لبه هاي سمت چپي و سمت راستي آن ميتوان از حلقه هاي مشابهي استفاده ˜كرد. با اين روش معمولا بهبود عمده اي در كارآيي رسم لبه هاي مستطيل نسبت به فراخواني هاي   مستقيم ترسيم خط به وجود نمي آيد . بعلاوه بسياري از كارت هاي گرافيكي از عمليات روي

مستطيل مثل پر ˜كردن ترسيم ˜كردن و غيره به صورت مستقيم و سخت افزاري پشتيباني ميكند

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 است  توجه (ymax-ymin+1) و ارتفاع آن برابر (xmax,xmin+1)عرض مستطيل برابر

داشته باشيد ˜كه تمام نقاط روي اظلاع آن جزو مستطيل به حساب مي آيند. پردازش درست مستطيلها ˜كه شامل تعريف صحيح عناصر ميباشد يك امر اساسي در هر سيستم ساختن پنجره ها مثل ويندوز مايكروسافت ميباشد.

 

الگوريتم ترسيم دايره

 

پس از نقاط و خطوط شكل بعدي مورد نظر براي رسم دايره ميباشد .يك دايره مجموعه نقاطي است rبنام مر˜كز دايره برابر يك˜ مقدار ثابت (x1,y1)روي صفحه ميباشد كه فاصله آنها از نقطه

بنابراين يك˜ دايره را به صورت زير معرفي ميكنيم:

Typedef struct gcircle_struct {

Float radius;

Float x, y;              /*center coordinates*/

} gcircle ;

با استفاده از قضيه فيثاغورث ميتوان معادله دايره را به صورت زير نوشت:

(X-x1)^2 + (y-y1) ^2 = r^2

  حل نمود:Yميتوان اين معادله را بر حسب

Y=y1 +/-sqrt (r^2-(x-x1) ^2)

 داراي دو مقدار x رسم نمود  هر مقدار x را به عنوان تابعي از yتوجه داشته باشيد ˜كه نمي توان

ميباشد يكي براي ريشه دوم مثبت و ديگري براي ريشه دوم منفي . براي رسم يك˜ دايره ˜امل بايستي دو نيم دايره بالاي و نيم دايره پاييني را رسم نمود ساده تر ين روش رسم يك˜ دايره ˜امل به صورت زير است:

رسم نقاط روي دايره

Float x,y,r2;

Int ix, iy;

Gircle circle;

Gircle color;

 

R2= (circle. radius * circle.radius);

For (x= -circle. radius; x<=circle. radius; x=x+1.0){

Y=sqrt(r2-(x*x));

          Ix = round(x + circle.x);

          Iy = round(y + circle.y);

Gplotpixel(ix,iy,color);   /*positive y-value*/

Iy = round (circle.y-y);

Gplotpixel(ix,iy,color);  /*negative y-value*/

}

 نزديك شعاع دايره ميباشد فواصليxمشكل مربوط به اين روش اين است ˜كه زماني ˜كه مقدار

 بزرگتر ازy به سمت شعاع دايره ميل ˜كند تغييرات مقادير متواليX روي دايره رسم ميشود. اگر

نقطه گرافيكي شده و در نتيجه فواصلي بين ستونهاي همجوار به وجود مي آيد.

 و Gplotpixel() به جاي استفاده از Glinedraw()يك˜ راه ساده براي رفع اين مشكل استفاده از

متصل ˜كردن نقاط در حين توليد آنها روي دايره ميباشد. در نتيجه روال تغيير يافته زير را داريم:

Int lastx,lasty1,lasty2;

 

R2 = (circle.radius * circle.radius);

Lastx = -round(circle.radius);

Last1 = 0;

Last2 = 0;

For (x= - circle.radius;x<= circle.radius;x = x+1.0){

Y=sqrt(r2-(x*x));

Ix = round(x + circle.x);

Iy = round(y + circle.y);

Glinedraw(lastx,lasty1,ix,iy.color);

Last = ix;

Last1 = iy;                        /*remember this value for y positive */

Iy = round(circle.y- y);

Glinedraw(lastx,lasty2,ix,iy,color);

Lasty2 = iy;                     /* remember this value for y positive */

}

اين روش يك دايره ˜كامل بدون فاصله اي را رسم ميكند و ولي هنوز نتايج غلطي را روي دايره توليد ميكند .حالا دايره به جاي يك منحني صاف و هموار به صورت چند ضلعي ظاهر خواهد شد . اگر چه اين فاصله ها روي دايره هاي ˜كوچكتر قابل توجه نيستند ولي روي دايره بزرگتر بطور وضوح قابل مشاهده ميباشند بعلاوه اين الگوريتم دو مشكل ديگر دارد:

1- استفاده از محاسبات اعشاري زياد از جمله آنها تابع ريشه دوم

2- رسم مجدد نقاط گرافيكي متعدد بويژه نزديك بالا و پائين دايره

خوشبختانه روشهاي بهتري براي رسم دايره وجود دارد ˜كه در بخش بعدي مورد بحث قرار ميدهيم

 

ترسيم سريع دايره

 

ميخواهيم براي رسم دايره از ˜كار آمد تر ين الگوريتم براي رسم دايره استفاده ˜كنيم براي اين ˜كار لازم است تز تقارن دايره استفاده ˜كنيم قبلا يك نتيجه جزئي اين را ملاحظه ˜كرده ايد به اين معني ˜كه ميتوانيم دو نيم دايره بالايي و پائين يك دايره به طور هم زمان رسم ˜كنيم .نيازي به استفاده دوباره از معادلات نيست. به منظور ساده ˜كردن بقيه تجزيه و تحليل فرض براين است ˜كه مر˜كز دايره در نقطه (0.0) قرار دارد و سپس مختصات نقطه گرافيكي محاسبه شده را به اندازه مختصات دايره مورد نظر جابجا خواهيم ˜كرد.

از پائين به بالا افزايش ميابد yدر بحث زير از سيستم مختصات استاندارد رياضي ˜كه در آن محور

 Y براي ترسيم روي صفحه نمايش مختصهاي yاستفاده خواهيم ˜كرد براي به دست آوردن مختص

محاسبه شده را گرفته  و آنها را منفي ميكنيم و سپس آنها را به اندازه مختصات مركز دايره جابجا ميكنيم.

 روي دايره باشد در اين صورت هفت نقطه زير (x,y)با توجه به تقارن دايره ميدانيم كه اگر نقطه

هم روي دايره خواهند بود:

(-x, y) (x,-y) (-x,-y) (x, y) (-y, x) (y, -x) (-y, -x)

 

براي اثبات اين امر ˜كافي است اين مختصات را در معادله فيثاغورث قرار دهيم به اين معني است ˜كه تنها لازم نقاط روي يك ا˜كانت را پيدا نموده پس از پيدا ˜كردن نقطه روي يك ا˜كانت تمام هفت نقطه ديگر با استفاده از تقارن پيدا ميشوند به اين ترتيب زمان ترسيم دايره به يك چهارم زمان ترسيم دايره به روش قبلي ˜كاهش ميابد

 

 

 

ا˜كانت سمت راست فوقاني           

بين 45و90 درجه قرار دارد 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


                                                                                                

                                                                       

 

 

 

 

 

 به اندازه يك نقطه گرافيكيX براي ترسيم دايره روي ا˜كانت سمت راست فوقاني به ازاي تغيير

 نميتواند بيش از يك نقطه گرافيكي باشد به اين معني است ˜كه مثل ترسيم خط تنها لازم است ˜كه يكي از دو نقطه را مطابق شكل زير انتخاب ˜كنيم .تابع آزمايشي دايره به صورت زير yتغيير

ميباشد :

F(x,y)=x^2+y^2-r^2

 

 (x,y) بزرگتر از صفر بوده اگر نقطه F(x,y) بيرون از دايره باشد مقدار تابع (x,y)اگر نقطه

روي دايره واقع گردد مقدار تابع برابر صفر بوده ولي اگر نقطه مزبور در داخل دايره باشد مقدار ix ˜كه در آن (ix,iy,1/2) را در نقاطي به صورت F(x,y)تابع كوچكتر از صفر خواهد بود  تابع

 را درf مختصات صحيح ميباشند محاسبه خواهيم ˜كرد براي حذف ˜كردن قسمتهاي ˜سري تابع iyو

 شامل جملاتي F(ix,iy,1/2) برابر 4/1 ميباشد   4 ضرب ميكنيم با توجه به اينكه 2^(2/1)

 علامت آن را fخواهد بود ˜كه تقسيم بر 4 مباشد و همچنين به علت اينكه نتيجه صحيح مقدار تابع

 را در 4 ضرب نمود ملا˜ انتخاب fرا تغيير نميدهد براي حذف قسمتهاي ˜سري ميتوان تابع

 نه مقدار آن مي باشد F(x,y) نقطه گرافيكي علامت تابع

 انتخاب شده (شماره سطر) هميشه ˜كوچكتر يا مساوي yبراي ا˜كانت سمت راست فوقاني مقدار

 و F ( x+2 , y-1/2 ) را در F( x , y )مقدار قبلي آن خواهد بود. از اين رو لازم است ˜كه

 ميباشد روابط زير را F (x+2, y-1/2) برابر D محاسبه نمود متغير تعميم F (x+2, y-3/2)

داريم:

F(x+2) ^2+(y-1/2)                     =(x+2)^2+(y-1/2)^2-r^2

                                                =x+4*x+4+(y-1/2) ^2-r^2

                                                =2*x+3+(x+1) ^2+(y-1/2) ^2-r^2

                                                =D+2*x+3

 

F (x+2, y-3/2)

=(x+2) ^2+(y-3/2) ^2-r^2

                                                =x+4*x+4+(y-3/2) ^2-r^2

                                                =2*x+3+(x+1) ^2+2*y+22(y-1/2) ^2-r^2

                                                =D+2*x+3+2*y+2

                                                =D+2*(x + y) +5

 تابعي از نقطه Dحالا ميتوانيم به همان روش ترسيم خط عمل ˜كنيم بجز اينكه حالا افزايشهاي

جاري مورد پردازش مي باشد ميتوان الگوريتم رسم دايره را به صورت زير نوشت:

Gcircle circle;

Int x, y;

Float d;

 

X=0;

Y=round (circle. radius);

D=0.5/4.0-y;                             /*Initial value for d */

Gcircledraweight(&circle,x,y,color);

                                                /*plot the first point*/

While(y>x) {                            /*loop for upper octant*/

If(d<=0){                                 /*we are outside the circle*/

D+=2*x+3;

} else {                                     /*we are inside the circle*/

Y-;

}

gcircledraweight(&circle ,x ,y ,color);

X++;

}

 

 

 هشت تركيب متفاوت نقاط را ˜كه به اندازه مختصات مركز دايره gcircledraweight() روال

 در روال فوق به صورت يك˜ اعداد dجا بجا ميشوند رسم مي نمايد با توجه به اينكه مقدار اوليه 

 تعريف ˜كرده ايم براي حذف قسمت(float) را اعشاري dاعشاري است به اين دليل نوع متغير

 از مقدار اوليه 4/1 را ˜م ˜كنيم ˜كه در نتيجه تمام محاسبات به صورت dقسمت ˜سري متغير

 را به اندازه -4/1 جابجا d نميتواند يك˜ مقدار ˜سري داشته باشد. اگر dمحاسبات صحيح بوده و

 هميشه ي˜dتبديل ميشود با وجود اين با توجه به اينكه  D<-1/4 به آزمايش d>0˜كنيم آزمايش

 تبديل ميگردد. از اين رو با فرض اينكه شعاع دايرهd>0 به D<-1/4عدد  صحيح ميباشد آزمايش

ي˜ عدد صحيح ميباشد ميتوان عدد ˜سري 5/4 را به 1 تبديل كرده و محاسبات را به صورت محاسبات صحيح انجام داد توجه داشته باشيد ˜كه در مورد دايره ها با شعاع اعشاري و مركز دايره   را مجددا بهdبه صورت اعشاري ميتوان از روال فوق الذ˜كر استفاده نمود تنها لازم است ˜كه متغير

 تعريف ˜كنيم.(Float) صورت اعشاري

 

حفظ ˜كردن سيماي حقيقي

 

از دايره در اشكال گرافيكي زيادي استفاده ميشود بويژه در رسم سطوحي مثل گرافيكهاي تجاري و نقشه هاي معماري مسئله اي ˜كه وجود دارد با استفاده از الگوريتم قبلي ترسيم دايره براي ترسيم يك دايره ˜املا گرد دايره حاصل روي صفحه نمايش يك دايره ˜املا گرد نميباشد اين مسئله به  yوxاين دليل است ˜كه نقاط گرافيكي چارچوب با فر غالبا داراي اندازه يكساني روي محورهاي

نيستند اين اختلاف در مقياس را نسبت تصوير صفحه نمايش گويند. نسبت تصوير با فرمول زير محاسبه ميشود:

Aspact = (screen_width / screen_height )

  برابر عرض فيزيكي صفحه نمايش  معمولا  بر  حسب  اينچ  و Screen_width˜ه در آن 

 برابر ارتفاع فيزيكي صفحه نمايش معمولا بر حسب اينچ مي باشد  اگر نسبت screen_height

تصوير مانند نسبت تعداد ستونهاي چارچوب با فر به تعداد سطرهاي آن باشد  نقاط  گرافيكي بر روي صفحه نمايش به صورت مربع خواهند بود به عنوان مثال يك مانيتور ˜كامپيوتر داراي نسبت تصوير 1.33 ميباشد ولي يك ˜كارت گرافيكي با دقت استاندارد 200*320داراي نسبت تصوير  به صورت بزرگتر نشان داده خواهد شد. y1.60  ميباشد از اين رو يك دايره در جهت محور

 يكسانX,Yالگوريتم ترسيم دايره هميشه دايره را با اين فرض كه نقاط گرافيكي روي محورهاي

ميباشند رسم مي كند براي ترسيم يك دايره روي صفحه نمايش بايستي يكي از محورها را مقياس  به صورت زير  yرا مقياس گذاري ˜كنيد. عامل تغيير مقياس محور (yگذاري ˜كنيد(معمولا محور

ميباشد:

Yfactor = aspect * (ny / nx)

 تعداد ستون هاي آن است مقياس  nx برابر تعداد سطرهاي چهارچوب- با فر و nكه در آن

 به اين معني ˜كه ديگر دايره رسم نمي ˜كنيم بلكه به جاي آن بايستي بيضي رسم ˜كنيمyگذاري محور

 

بيضي

 

بيضي يك˜ دايره امتداد يافته ميباشد تعبير هندسي بيضي بر اساس دو نقطه مطابق شكل زير ميباشد در اين مثال نقاط مزبور به فاصله مساوي از مبدا مختصات روي محور افقي قرار دارند يك˜ بيضي مجموعه نقاطي است ˜كه مجموعه فواصل اين نقاط از دو ˜كانون بيضي برابر يك˜ مقدار ثابت ميباشد به عنوان مثال يك˜ دايره دو ˜كانون منطبق بر روي هم دارد ˜كه هر دوي آنها در مبدا مختصات ميباشند براي رسم فيزيكي يك˜ بيضي ميتوان دو ميخ روي تخته ˜كوبيد و دو سر نخ را به طور آزاد به اين دو ميخ گره زد سپس نخ را با نو˜ مدادي ˜كشيد و منحني حاصل از حر˜ت مداد يك˜ بيضي خواهد بود به عبارتي ديگر بيضي يك دايره است ˜كه در يك˜ جهتي امتداد داده شده

 

 

 

 

 

 

 

 

 

 

 

 

 

معادله يك˜ بيضي ˜كه مركز آن در مبدا مختصات قرار دارد به صورت زير ميباشد:

(x/a)^2+(y/d)^2=1     =>   y=+/-b*sqrt(1-(x/a)^2)

 ميباشند ساختار ذخيره  y و محورx به ترتيب شعاعهاي بيضي در امتداد محور b و aمتغيرهاي

سازي يك˜ بيضي به صورت زير است:

Typedef struct gelipse_struct {

Float a,b;                                  /*size of elipse in x- and y-axes*/

Float x,y;                                  /*center of elipse*/

} gelipse:

محور طولاني تر بيضي را محور اطوال و محور ˜كوچكتر را محور اقصر مي نامند.  حالا فرض    ميباشد b بزرگتر از  a  قرار دارد به اين معني ˜كه x˜كنيد كه محور اطوال بيضي روي محور

با استفاده از روال زير نصف بالايي و پاييني را رسم نمود:

Float x,y;

Int ix,iy,lastx,lasty1.lasty2;

gellipse ellipse;

gcolor color;

lastx=-round(gellipse.a);

lasty1=0;

lasty2=0;

for (x=-ellipse.a;x<=ellipse.a;x+=10){

y=ellipse.b*sqrt(1.0-(x/ellipse.a)*(x/ellipse.a))

ix = round(x+ellipse.x);

iy = round(y+ellipse.y);

glinedraw(lastx,lasty1,xi,yi,color);

lastx=ix;

lasty1=iy;

iy = round(ellips.y,-y);

glinedraw(lastx,lasty2,xi,yi,color);

lasty2=iy;

}

توجه داشته باشيد ˜كه در اين روش تعداد عمليات اعشاري بيشتر از تعداد مورد نياز براي رسم دايره ميباشد بعلاوه اگر محور اطوال بيضي روي محور عمودي باشد عمل تكرار را با استفاده از  انجام نخواهيم داد براي اينكه اين عمل به نتيجه خيلي ضعيفي منتهي ميشود بنابراين بايستي اين x

 انجام دهيم حلقه برy با استفاده از مختصxحالت را ˜كنترل كرده و عمل تكرار را به جاي مختص

 ميباشد.x از تمام جهات ديگر مانند حلقه قبلي بر حسب yحسب

مي توان براي تعيين اينكه نقطه اي در داخل و يا خارج بيضي قرار دارد تابعي بنويسيم:

F(x,y) =(b*x)^2 +(a*y)^2 – (a*b)^2

 ضرب ˜كرده ايم(a*b)^2توجه داشته باشيد كه براي حذف ˜كردن قسمتهاي ˜سري تابع آن را در

 در مورد دايره ميباشد ولي براي رسم دايره F(x,y)  خيلي شبه تابع F(x,y) اگر چه معادله تابع

نميتوان از اين معادله استفاده ˜كنيم . دو دليل اصلي براي اين ˜كار وجود دارد:

 ديگر تقارن هشتگانه دايره وجود نداردX,Y1- به علت وجود مقياسهاي مختلف در

 به اندازه يك˜ نقطه گرافيكي x2-بايستي نقطه هاي را تعيين ˜كنيم كه در آن نقطه افزايش در جهت

 ميگردد ˜كه اندازه آن بيش از يك˜ نقطه گرافيكي ميباشدyباعث به وجود آمدن تغييري در

 

به منظور برخورد با مشكل اول توجه داشته  باشيد ˜كه تقارن چهارگانه هنوز وجود دارد به اين  روي بيضي قرار داشته باشد در اين صورت سه نقطه زير نيز روي بيضي(x,y)معني اگر نقطه

خواهند بود:

(-x,y),(x,-y),(-x,-y)

بايستي الگوريتم را جوري تغيير دهيم ˜كه به جاي رسم ا˜كانت فوقاني ربع سمت راست فوقاني را  از منحني واقع در ربع سمت راست فوقاني(x,y)رسم ˜كنيم براي رسم چهار نقطه به ازاي هر نقطه

استفاده ˜كنيم با وجود اين مسئله ˜مي پيچيده تر است فرض اصلي  Gellipsedrawfour()از تابع

 را به اندازه يك˜ نقطه گرافيكي حر˜ت دهيم تنها دو حالت براي xالگوريتم ما اين است ˜كه اگر

 بعدي به وجود ميآيد اين امر زماني ˜كه منحني به سمت محور عمودي ميل ميكند صحت yمختص

 ميتوان بيش از يك˜ نقطه y به ازاي هر گامي در جهت yندارد در اين صورت تغيير مختص

گرافيكي باشد بنابراين بايد نقطه اي را پيدا ˜كنيم ˜كه اين انتقال را در آنجا انجام دهد و روش ديگري را براي بقيه ربع سمت راست فوقاني استفاده ˜كنيم

در شكل زير به ربع سمت راست فوقاني بيضي توجه ˜كنيد يادآوري ميكنيم ˜كه در مورد دايره ميباشد آسان است يعني روي محور 45 xبزرگتر از تغيير yشناسائي نقطه ˜كه در آن ميزان تغيير

درجه اين حالت اتفاق مي افتد از اين رو براي قسمتي از ربع سمت راست فوقاني ˜كه در زير خط  ميباشد ˜كه اندازه آنyبه اندازه يك˜ نقطه گرافيكي منجر به تغيير در نقطه xمزبور قرار دارد تغيير

بيش از يك˜ نقطه گرافيكي خواهد بود

 

 

 حساب ميكنيم نقطه انتقال زماني (x+1,y-1/2) را در نقاط F(x,y)براي الگوريتم افزايشي تابع

 را در نظر بگيريد(x+1,y2) و (x,y1)بزرگتر يا مساوي 1 باشد نقاطdyرخ ميدهد ˜كه مقدار

داده شده را نشان ميدهد از اين رو x روي بيضي به ازاي y مقدار دقيق  Y2وY1˜ه

 .حالا مجموع اين دو تابع را به صورت زير حساب Dy=y2-y1و F(x,y1)+f(x+1,y2)=0

ميكنيم :

= F(x,y1)+f(x+1,y2)                  =d^2((x+1)^2-x^2)+a^2*(y2^2-y1^2)

                                                =d^2(2x+1) +a^2*((y2-y1)* (y2+y1))

                                                =0

˜كه ميتوان آن را به صورت زير نوشت:

D^2(2x+1) = -a^2*(dy *(y2+y1))

D^2(2x+1) = -a^2*(dy *(2*y1+dy))

 در نقطه انتقال پيدا مي˜كنيم:yوx در معادله قبلي شرط مربوط به Dy=-1با جايگزين ˜كردن

  ياd^2(2x+1)= a^2*( 2y-1)

d^2(x+1/2)= a^2(y-1/2)

دقيقا برابر 1- باشد ملاحظه ميشود ˜كه پس از برقراري اين dyاين شرط زماني برقرار است ˜كه

 بطور صعودي منفي ميگردد به اين معني ˜كه براي بقيه ربع مزبور dy  مقدار xشرط با افزايش

 ˜متر از 1- باقي ميماند از اين رو بايستي براي الگوريتم خود شرط مرزي Dyمقدار

 (x+1/2) از (x+1) را ˜كنترل ˜كنيد واضح است ˜كه به جاي D^*(x+1/2)>=a^2(y-1/2)

استفاده ˜نيد اين شرط باز هم برقرار خواهد بود

حالا ˜كه طرز پيدا ˜كرده نقطه انتقال را ميدانيم بايستي تصميم بگيريم ˜كه در نقطه انتقال بايد چه  را افزايش ميدهيم در اين ناحيه y,x˜كاري را انجام بدهيم اي ˜كار آسان است براي اينكه حالا به جاي

 x به اندازه يك˜ نقطه گرافيكي منجر به تغيير در yدر اين ناحيه دوم شما قبلا ميدانيد ˜كه تغيير

 را عوض ˜كرده و از yوxميشود ˜كه ˜متر از يك نقطه گرافيكي ميباشد بنا براين ميتواكنيم رول

 استفاده ˜كنيمxهمان الگوريتم افزايشي بكار رفته براي

به    نياز داريم از همان روش به ˜كار رفته در دايره استفاده ميكنيمF(x,y)حالا به محاسبه افزايشي

اين صورت:

F(x+2,y-1/2)                   =b^2*(x+2)^2+a^2*(y-1/2)^2-(a*b)^2

                                      =b^2*(x^2+4*x+4)+a^2*(y-1/2)^-(a*b)^2

                                      =b^2*(2*x+3+(x+1)^2)+a^2*(y-1/2)^2-(a*b)^2

                                      =b+b^2*(2*x+3)

 

F(x+2,y-3/2)                   =b^2*(x+2)^2+a^2*(y-3/2)^2-(a*b)^2

                                      =b^2*(x+4*x+4)+a^2*(y-1/2)^-(a*b)^2

                                      =b^2*(2*x+3+(x+1)^2)+a^2*(y-1/2)^2-(a*b)^2

                                       =b+b^2*(2*x+3)+a^2*(2*y+2)

و   f(x+1/2,y-2) دقيقا به همان طريق پيدا ميشوند بجز اينكه حالاyمقادير حلقه روي

 را محاسبه ميكنيم روال هاي ترسيم بيضي در زير آمده است توجه داشته باشيد ˜هf(x+3/2,y-2)

 F(x+1/2,y-1) برابر y و براي حلقه F(1,ellipse.b-1/2) برابر x براي حلقه dمقدار اوليه

ميباشد

 

Gellipse ellipse;

Int x,y;

Int a2,b2;

Int ia,ib;

 

Float d. testvar;

 

X=0;

Y=round(ellipse.b);

Ia=round(ellipse.a);

Ib=round(ellipse.b);

A2=ia*ia;

D2=ib*ib;

D=b2-a2- ellipse.b+0.25*a2;               /*initial value for d*/

g ellipsedrawfour(x,y, ellipse.x, ellipse.y,color);

                                                          /*plot the first point */

while(a2*(y-0.5)>b2*(x+1))  {             /*loop in x*/

if (d<=0){                                          /*we are outside the ellipse*/

d+= ib*(2*x+3);

}else{                                                /* we are inside the ellipse*/

d+= ib*(2*x+3) + ellipse.a*(2*y + 2);

y-;

}

gellipsedrawfour(&ellipse,x,y,color);

x++;

}

/*now loop in y instead*/

b=b^2*(x+0.5)+a2*(y-1.0)-a2*b2;       /*calculate f(x+1/2,y-1)*/

gellipsedrawfour(&ellipse,x,y,color);   /*polt the first point*/

while (y>=0){                                     /*loop in y */

if(d<=0){                                           /*we are outside the ellipse*/

d += ib*(2*x+2)+ellipse.a*(-2*y+3);

x++;

}else{                                                /*we are inside the ellipse*/

d += ia*(-2*y+3);

}

gellipsedrawfour(&ellipse,x,y,color);

y-;

}

 

چند ظلعي ها

با اضافه ˜كردن چند ضلعي ها به ليست اشكال گرافيكي خود ميتواند طيف وسيعي از اشكال را

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

چند ضلعي محدب

 

 
Text Box: چند ضلعي غير محدب

 

 

 

 

 

 

 

 

 

 

 

 

 


 يك˜ چند ضلعي بطور داخلي با ساختار زير نمايش داده ميشود:

Typedef struct gploygon_struct{

Int npoints;

Int size;

Gpoint *points;

} gpolygon;

توجه داشته باشيد ˜كه اين ساختار از يك˜ اشاره گر ارايه از نقاط استفاده ميكند يك˜ نقطه به صورت زير تعريف ميشود:

Typedef struct gpoint_struct{

Int x,y;

} gpoint;

poly->points[n] باشد در اين صورت gpolygon يك˜ اشاره گر به يك˜ ساختار polyاگر متغير

 ام است براي اينكه در زبان سي براي مشخص ˜كردن عنصر (n+1)ام چند ضلعي ميباشد (آن

 ذخيره ميشود براي يك˜ مثلث npointاول ارايه از آنديس صفر استفاده ميكند) تعداد رئوس چند ضلعي در فيلد 

 چند ضلعي را ذخيره point تعداد جاري نقاط تخصيص داده شده در ارايه sizeبرابر 3 خواهد بود فيلد  Npoint

 به اين دليل استفاده ˜كرده ايم ˜كه size باشد از فيلد npoint بايستي بزرگتر يا مساوي sizeمي˜كند به طور كلي فيلد

بدون نياز به تخصيص مجدد حافظه آزادانه نقاطي را به چند ضلعي اضافه ˜كرده و يا حذف كنيم در زمان ساختن چند ضلعي ميتوانيد تعداد نقاط اوليه چند ضلعي را مشخص ˜كنيد با اضافه ˜كردن رئوس و يا با حذف رئوس چند  نيست مگر اينكه بخواهيم نقاط چند ضلعي بيشتري از تعداد جاري  pointضلعي نياز به تخصيص يك˜ ارايه جديد 

 جديد تخصيص داده ميشود به طوري ˜كه pointتخصيص يافته براي چند ضلعي باشد در اين

با توجه به اينكه بخش عمده چند ظلعي شامل استفاده از حلقه روي تمام رئوس چند ضلعي ميباشد بايستي اطمينان حاصل ˜كنيد ˜كه نقطه آخري را به نقطه اولي وصل ميكند مورد پردازش قرار گيرد برنامه زير براي پردازش چند  ضلعي ها به ˜كار مي رود:

 

Int I;

Gpoint1,point2;

/*start whit the last point of the polygon*/

point1=poly->ponts[poly->npoints-1];

for(i=0;i<poly->npoints;i++){

point2=poly->points[i];

/*now p1,p2 define an edge of the polygon for further processing*/

point1=point2                 /*now go on to the next edge*/

}

 

 

 

 

 

Cدستورات گرافيكي در

 ميباشدc وجود دارد ˜كه اساس رسم اشكال گرافيكي در Graphic.hتوابع گرافيكي را ˜كه در فايل

˜كه ليست آنها را در زير مي بينيم  

 

arc

bar

bar3d

circle

cleardevice

Clearviewport

closegraph

detectgraph

Drawpoly

ellipse

fillellipse

Fillpoly

floodfill

getarccoords

Getaspectratio

getbkcolor

getcolor

Getdefaultpalette

getdrivername

getfillpattern

Getfillsettings

getgraphmode

getimage

Getlinesettings

getmaxcolor

getmaxmode

getmaxx

getmaxy

getmodename

getmoderange

getpalette

getpalettesize

getpixel

gettextsettings

getviewsettings

getx

gety

graphdefaults

grapherrormsg

graphfreemem

graphgetmem

graphresult

imagesize

initgraph

installuserdriver

installuserfont

line

linerel

lineto

moverel

moveto

outtext

outtextxy

pieslice

putimage

putpixel

rectangle

registerbgidriver

registerfarbgidriver

registerbgifont

registerfarbgifont

restorecrtmode

sector

setactivepage

setallpalette

setaspectratio

setbkcolor

setcolor

setfillpattern

setfillstyle

setgraphbufsize

setgraphmode

setlinestyle

setpalette

setrgbpalette

settextjustify

settextstyle

setusercharsize

setviewport

setvisualpage

setwritemode

 

textheight

textwidth

 

 

 

 

ARC1- دستور العمل

فرمت دستور العمل:

ARC(intx,inty,stangle,int,endangle,int,radius);

: اين دستور العمل يك˜ كمان رسم ميكند و در آن

 مختصات مركزy وx-

 زاويه شروعstangle -

 زاويه پايانendangle -

 شعاع دايره استradius -

 

BAR2- دستور العمل

فرمت دستور العمل:

BAR(intleft,inttop,intright,intbottom);

در اجراي اين دستور العمل يك˜ مستطيل رسم ميشود.

           :مختصات گوشه بالاي سمت چپintleft,inttop

   :مختصات گوشه پائيني سمت راستintright,intbottom

 

BAR3D3- دستور العمل

فرمت دستور العمل:

BAR3D(intleft,inttop,intright,intbottom,intdepth,inttopflag);

در اجراي اين دستور العمل يك˜ ستون سه بعدي  رسم ميشود.

           :مختصات گوشه بالاي سمت چپintleft,inttop

   :مختصات گوشه پائيني سمت راستintright,intbottom

عمق ستون سه بعدي                   :Intdepth

                :                Inttopflag

 

Circle4- دستور العمل

در اجراي اين دستور العمل يك˜ دايره رسم ميشود.

CIRCLE(intx,inty,radius);

 شعاع دايره است.raduse مختصات مركز وy و xدر اين دستور العمل

 

Cleardevice 5- دستور العمل 

در اجراي اين دستور العمل صفحه گرافيكي نمايش پا˜ ميشود

Cleardevice();

 

Clearviewport 6- دستور العمل

در اجراي اين دستور العمل پنجره موجود پا˜ ميشود

Clearviewport();

 

Closegraph 7- دستور العمل

در اجراي اين دستور العمل سيستم  گرافيكي پا˜ ميشود

Closegraph()

 

 

detectgraph 8-دستور العمل

در اجراي اين دستور العمل درايور گرافيكي سيستم ارائه داده ميشود

Detectgraph(int graphdriver ,int graphmode);

 

عدد مربوط به راه انداز گرافيكي را با توجه به جدول زير برميگرد اند:int graphdriver

عدد مربوط به مد راه انداز گرافيكي را با توجه به جدول زير برميگرد اند:int graphmode

 

 

 Constant │ Value

══════════╪═════════════════════════════════

 DETECT      0 (requests autodetection)

 CGA         1

 MCGA        2

 EGA         3

 EGA64       4

 EGAMONO     5

 IBM8514     6

 HERCMONO │   7

 ATT400      8

 VGA         9

 PC3270     10

 

 

راه انداز

گرافيكي 

 Graphics│

  driver │graphics_modes│Value│Column x Row│ Palette │Pages

═════════╪══════════════╪═════╪════════════╪═════════╪══════════

 CGA     │ CGAC0          0    320 x 200 │    C0     1

         │ CGAC1          1    320 x 200 │    C1     1

         │ CGAC2          2    320 x 200 │    C2     1

         │ CGAC3          3    320 x 200 │    C3     1

         │ CGAHI          4    640 x 200 │  2 color│  1

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 MCGA    │ MCGAC0         0    320 x 200 │    C0     1

         │ MCGAC1         1    320 x 200 │    C1     1

         │ MCGAC2         2    320 x 200 │    C2     1

         │ MCGAC3         3    320 x 200 │    C3     1

         │ MCGAMED        4    640 x 200 │  2 color│  1

         │ MCGAHI         5    640 x 480 │  2 color│  1

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 EGA     │ EGALO          0    640 x 200 │ 16 color│  4

         │ EGAHI          1    640 x 350 │ 16 color│  2

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 EGA64   │ EGA64LO        0    640 x 200 │ 16 color│  1

         │ EGA64HI        1    640 x 350 │  4 color│  1

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 EGA-MONO│ EGAMONOHI      3    640 x 350 │  2 color│  1*

         │ EGAMONOHI      3    640 x 350 │  2 color│  2**

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 HERC    │ HERCMONOHI     0    720 x 348 │  2 color│  2

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 ATT400  ATT400C0       0    320 x 200 │    C0     1

         │ ATT400C1       1    320 x 200 │    C1     1

         │ ATT400C2       2    320 x 200 │    C2     1

         │ ATT400C3       3    320 x 200 │    C3     1

         │ ATT400MED      4    640 x 200 │  2 color│  1

         │ ATT400HI       5    640 x 400 │  2 color│  1

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 VGA     │ VGALO          0    640 x 200 │ 16 color│  2

         │ VGAMED         1    640 x 350 │ 16 color│  2

         │ VGAHI          2    640 x 480 │ 16 color│  1

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 PC3270  PC3270HI       0    720 x 350 │  2 color│  1

─────────┼──────────────┼─────┼────────────┼─────────┼───────

 IBM8514 │ IBM8514HI      1  │ 1024 x 760 │256 color│

         │ IBM8514LO      0    640 x 480 │256 color│

 

 *   64K on EGAMONO card

** 256K on EGAMONO card

 

drawpoly9- دستور العمل

Drawpoly(int numpoint,int far polypoints);

 بر اساس پارامتر اول به زوجPoly pointدر اجراي فرمان يك˜ چند ضلعي رسم ميشود و در ان

مقادير مراجعه ميكند كه هر ˜دام مختصات يك˜ نقطه از چند ضلعي است.

 

 

 

Ellipse 10- دستور العمل

اين دستور العمل يك بيضي رسم ميكند

فرم كلي آن چنين است:

ellipse(int x, int y, int stangle, int endangle,int xradius, int yradius);

˜كه در آن دو متغير اول مختصات مركز و دو متغير بعد شروع و پايان بيضي و متغير هاي آخر شعاع افقي و عمودي هستند

 

 مختصات سطر و ستون محل قرار گيري بيضي :int x, int y

 زاويه شروع رسم بيضي :int stangle

 : زاويه پاياني رسم بيضيint endangle

: اندازه شعاع افقي بيضيint xradius

: اندازه شعاع عمودي بيضيint yradius

 

Fill Ellipse 11- دستور العمل

اين دستور العمل يك˜ بيضي تو پور را  رسم ميكند

فرم ˜كلي آن چنين است:

fillellipse(int x, int y, int stangle, int endangle,

int xradius, int yradius);

˜كه در آن دو متغير اول مختصات مر˜كز و دو متغير بعد شروع و پايان بيضي و متغير هاي آخر شعاع افقي و عمودي هستند

 

 مختصات سطر و ستون محل قرار گيري بيضي :int x, int y

 زاويه شروع رسم بيضي :int stangle

 : زاويه پاياني رسم بيضيint endangle

: اندازه شعاع افقي بيضيint xradius

: اندازه شعاع عمودي بيضيint yradius

 

Fill poly 12- دستور العمل

اين دستور العمل يك چند ضلعي را رسم ميكند و داخل آنرا پر ميكند

فرم ˜كلي آن چنين است:

 

fillpoly(int numpoints, int far *polypoints);

 

˜كه در آن به تعداد پارامتر اول پارامتر دوم موجود است

 

 

floodfill 13- دستور العمل

در اجراي اين دستور يك˜ محدوده بسته با نمونه مشخصي پر ميشود

فرم ˜كلي آن چنين است:

 

floodfill(int x, int y, int border);

 

get arc coords 14- دستور العمل

در اجراي اين دستور العمل مختصات آخرين نقطه ˜مان را به دست ميدهد

getarccoords(struct arccoordstype far *arccoords);

 

getaspectratio 15- دستور العمل

فرم ˜كلي آن چنين است:

  getaspectratio(int far *xasp, int far *yasp);

در اجراي اين دستور العمل نسبت جاري بين مختصات در وضعيت گرافيكي موجود ارائه ميشود

 

 

getbkcolor16- دستور العمل

اين دستور العمل كد رنگ زمينه گراف را نشان ميدهد

getbkcolor(void);

 

get color17-دستور العمل

در اجراي اين دستور العمل رنگ جاري سيستم گرافيكي ارائه ميشود

فرم ˜كلي آن چنين است:

getcolor(void);

 

Get default palette18-دستور العمل

اين دستور العمل ساختار پالت را بر ميگرداند

فرم ˜كلي آن چنين است:

getdefaultpalette(void);

 

Get driver name19-دستور العمل

اين دستور العمل نام درايور جاري سيستم را ارائه ميدهد

فرم ˜كلي آن چنين است:

getfillpattern(char far *pattern);

 

Get fill pattern20-دستور العمل

اين دستور العمل نمونه طراحي ساخت كاربر را به حافظه كپي ميكند

فرم ˜كلي آن چنين است:

getfillpattern(char far *pattern);

 

Get fill setting21-دستور العمل

اين دستور العمل اطلاعاتي در مورد نمونه طراحي مورد عمل در وضع موجود سيستم گرافيكي را ارائه ميدهد

فرم ˜كلي آن چنين است:

getfillsettings (struct fillsettingstype far *fillinfo);

 

Get graphmode22-دستور العمل

با اجراي اين دستور العمل مد گرافيكي موجود به سيستم باز ميگردد.

فرم ˜كلي آن چنين است:

getgraphmode(void);

 

Get image23-دستورالعمل

بخش مشخصي از صفحه نمايش را به حافظه منتقل ميكند

فرم ˜كلي آن چنين است:

getimage(int left, int top, int right, int bottom,void far *bitmap);

 

get line setting24-دستور العمل

اين دستور العمل نوع و نمونه و ضخامت خط جاري را ارائه ميدهد

فرم ˜كلي آن چنين است:

getlinesettings(struct linesettingstype far *lineinfo);

 

get max color25- دستور العمل

اين دستور العمل يزرگترين عدد مربوط به نگ كامپيوتر را به برنامه برگشت ميدهد

فرم ˜كلي آن چنين است:

getmaxcolor(void);

 

get max mode name26- دستور العمل

اين دستور العمل ماكزيمم شماره مد جاري سيستم گرافيكي را نشان ميدهد

فرم ˜كلي آن چنين است:

getmaxmode(void);

 

 get max x27- دستور العمل

 از مختصات صفحه نمايش را نشان ميدهدxاين دستور العمل ماكزيمم

فرم ˜كلي آن چنين است:

getmaxx(void);

 

get max y28- دستور العمل

از مختصات صفحه نمايش را نشان ميدهدyاين دستور العمل ماكزيمم

فرم ˜كلي آن چنين است:

getmaxy(void);

 

get mode name29-دستور العمل

اين دستور العمل اشاره گري را باز ميگرداند كه به نام مد گرافيكي اشاره ميكند

فرم ˜كلي آن چنين است:

getmodename(int mode_number);

 

Get mode arrange30- دستور العمل

اين دستور العمل دامنه مد براي درايو گرافيكي داده شده را به دست ميدهد

فرم ˜كلي آن چنين است:

getmoderrange(int graphdriver, int far *lomode, int far*himode);

 

get palette31- دستور العمل

اين دستور العمل اطلاعاتي در مورد پالت جاري به دست ميدهد

فرم ˜كلي آن چنين است:

getpalette(struct palettetype far *palette);

 

get pallet size32- دستور العمل

اين دستور العمل اندازه جدول و رنگ پالت را نشان ميدهد

فرم ˜كلي آن چنين است:

getpalettesize(void);

 

Get pixel33- دستور العمل

اين دستور العمل رنگ نقطه مشخص را به دست مي دهد

فرم ˜كلي آن چنين است:

getpixel(int x, int y);

 

get text setting 34- دستور العمل

اين دستور العمل اطلاعاتي را در مورد فونتهاي متن گرافيكي جاري را به دست ميدهد

فرم ˜كلي آن چنين است:

  gettextsettings(struct textsettingstype far *texttypeinfo);

 

Get view setting35- دستور العمل

اين دستور العمل اطلاعاتي درباره پنجره ديد جاري را نشان ميدهد

فرم ˜كلي آن چنين است:

getviewsettings (struct viewporttype far *viewport);

 

Get x36- دستور العمل

اين دستور العمل طول نقطه جاري را ارائه ميدهد

فرم ˜كلي آن چنين است:

getx(void);

 

Get y37- دستور العمل

اين دستور العمل عرض نقطه جاري را ارائه ميدهد

فرم ˜كلي آن چنين است:

gety(void);

 

graph defaults38- دستور العمل

اين دستور العمل تنضيمات گرافيكي را به وضع اول باز ميگرداند

فرم ˜كلي آن چنين است:

graphdefaults(void);    

 

graph error39- دستور العمل

اين دستور العمل اشاره گري را به برنامه باز ميگرداند كه به پيغام مربوط به اشتباه اشاره ميكند

فرم ˜كلي آن چنين است:

grapherrormsg(int errorcode);

 

-graph get mem40- دستور العمل

اين دستور العمل ميزان حافظه لازم براي بارگذاري برنامه جاري را نشان ميدهد

فرم ˜كلي آن چنين است:

_graphgetmem(unsigned size);

 

-graph free mem41- دستور العمل

اين دستور العمل ميزان حافظه مربوط به گراف را كنترل ميكند

فرم ˜كلي آن چنين است:

_graphfreemem(void far *ptr, unsigned size);

 

graph result42- دستور العمل

اين دستور العمل كد اشتباه را در مورد آخريت عمل ناموفق ارئه ميدهد

فرم ˜كلي آن چنين است:

graphresult(void);

 

image size43- دستور العمل

 را اعلام ميداردBit imageاين دستور العمل تعداد بايتهاي لازم براي ذخيره يك

فرم ˜كلي آن چنين است:

imagesize(int left, int top, int right, int bottom);

 

initgraph44- دستور العمل

اين دستور العمل سيستم گرافيكي را آماده كار ميسازد

فرم ˜كلي آن چنين است:

initgraph(int far *graphdriver,

int far *graphmode, char far *pathtodriver);

 

Install user driver 45- دستور العمل

اين دستور العمل يك ذرايو را به جدول درايوها اضافه ميكند

فرم ˜كلي آن چنين است:

installuserdriver(char far *name, int huge (*detect)(void));

 

Install user font(char name)46- دستور العمل

 مي آوردbgi   را به سيستم chrاين دستور العمل فايل فونت با پسوند

فرم ˜كلي آن چنين است:

installuserfont(char far *name);

 

line47- دستور العمل

اين دستور العمل يك خط رسم ميكند

فرم ˜كلي آن چنين است:

linel(int dx, int dy);

 

linerel48- دستور العمل

اين دستور العمل از محل چاپ گرافيك به نقطه معين خط رسم ميكند

فرم ˜كلي آن چنين است:

linerel(int dx, int dy);

 

Line ot49- دستور العمل

اين دستور العمل از نقطه جاري به نقطه مشخص شده خطي رسم مي نمايد

فرم ˜كلي آن چنين است:

lineto(int x, int y);

 

moverel50- دستور العمل

اين دستور العمل محل فعلي گرافيكي را به فاصله معيني جلو يا عقب ميبرد

فرم ˜كلي آن چنين است:

moverel(int dx, int dy);

 

 Move to51- دستور العمل

 هدايت ميكند(x,y)اين دستور العمل كنترل را به نقطه

فرم ˜كلي آن چنين است:

moveto(int x, int y);

 

out text52- دستور العمل

اين دستور العمل يك رشته كاراكتر را در پنجره نشان ميدهد

فرم ˜كلي آن چنين است:

outtext(char far *textstring);

 

Out text xy53- دستور العمل

اين دستور العمل يك رشته كاراكتري را در محل مورد نظر نمايش ميدهد

فرم ˜كلي آن چنين است:

outtextxy(int x, int y, char far *textstring);

 

 pie slice  54- دستور العمل

اين دستور العمل يك قطاع دايره را رسم ميكند و آن را پر ميكند

فرم ˜كلي آن چنين است:

pieslice(int x, int y, int stangle, int endangle, int radius);

 

Put image   55- دستور العمل

اين دستور العمل يك بخش از صفحه تصوير را به خروجي ميفرستد

فرم ˜كلي آن چنين است:

putimage(int left, int top, void far *bitmap, int op);

 

 Put picxel56- دستور العمل

اين دستور العمل يك نقطه را در محل مورد نظر و به رنگ مطلوب رسم ميكند

فرم ˜كلي آن چنين است:

putpixel(int x, int y, int color);

 

rectangle 57- دستور العمل

اين دستور العمل يك مستطيل رسم ميكند

فرم ˜كلي آن چنين است:

rectangle(int left, int top, int right, int bottom);

 

register  bgi driver 58- دستور العمل

اين دستور العمل درايو گرافيكي را ثبت ميكند

فرم ˜كلي آن چنين است:

registerbgidriver(void (*driver)(void));

 

 register bgi font 59- دستور العمل  

اين دستور العمل كد مربوط به قلم مورد نظر را ثبت ميكند

فرم ˜كلي آن چنين است:

registerbgifont(void (*font)(void));

 

Register crt mode60- دستور العمل

 اين دستور العمل مد صفحه نمايش را به وضع اوليه بر ميگرداند

فرم ˜كلي آن چنين است:

Registercrtmode(void)

 

Sector 61- دستور العمل

اين دستور العمل يك بخش از دايره را رسم ميكند و آن را از نمونه مورد نظر پر ميكند

فرم ˜كلي آن چنين است:

sector(int x, int y, int stangle, int endangle,int xradius, intyradius);

 

set active page62- دستور العمل

اين دستور العمل صفحه فعال از صفحه نمايش را مشخص و تنظيم ميكند

فرم ˜كلي آن چنين است:

Setactivepage(int page);

 

Set all palette63- دستور العمل

اين دستور العمل تمام رنگهاي پالت را بر اساس رنگهاي مورد نظر تغيير ميدهد

فرم ˜كلي آن چنين است:

setallpalette(struct palettetype far *palette);

 

set aspect ratio64- دستور العمل

اين دستور العمل نسبت بين طول و عرض صفحه نمايش را تعيين ميكند

فرم ˜كلي آن چنين است:

setaspectratio(int xasp, int yasp);

 

set bk color65- دستور العمل

اين دستور العمل بر اساس پالت موجود رنگ زمينه را تعيين ميكند

فرم ˜كلي آن چنين است:

setbkcolor(int color);

 

Set color66- دستور العمل

فرم ˜كلي آن چنين است:

setcolor(int color);

 

set fill pattern67- دستور العمل

اين دستور العمل يك نمونه طرح ساخت كاربر را تعيين ميكند

فرم ˜كلي آن چنين است:

setfillpattern(char far *upattern, int color);

 

set fill style68- دستور العمل

اين دستور العمل طرح نمونه براي پر كردن اشكال و رنگ آن را تعيين مينمايد

فرم ˜كلي آن چنين است:

setfillstyle(int pattern, int color);

 

 set graph buf size69- دستور العمل

اين دستور العمل اندازه بافر گرافيك را تعيين ميكند

فرم ˜كلي آن چنين است:

setgraphbufsize(unsigned bufsize);

 

set graph mode70- دستور العمل

اين دستور العمل مد گرافيكي سيستم را تعيين كرده صفحه نمايش را پاك ميكند

فرم ˜كلي آن چنين است:

setgraphmode(intmode);

 

set palette71- دستور العمل

اين دستور العمل همه رنگهاي پالت را تغيير ميدهد

فرم ˜كلي آن چنين است:

setpalette(int colornum, int color);

 

set rgb palette72- دستور العمل

 را تعيين ميكندibm-8514اين دستور العمل رنگ كارت گرافيكي

فرم ˜كلي آن چنين است:

setrgbpalette(int colornum, int red, int green, int blue);

 

Setline style73- دستور العمل

اين دستور العمل نوع خط و يا نمونه خط را تعيين مينمايد

فرم ˜كلي آن چنين است:

setlinestyle(int linestyle, unsigned upattern, int thickness);

 

set text justify74- دستور العمل

اين دستور العمل

فرم ˜كلي آن چنين است:

settextjustify(int horiz, int vert);

 

set text style75- دستور العمل

اين دستور العمل ويژگيهاي متن را در وضع خاص تنظيم ميكند

فرم ˜كلي آن چنين است:

settextstyle(int font, int direction, int charsize);

 

Set user char size76- دستور العمل

اين دستور العمل براي فونتهاي مورد نظر اندازه تعيين ميكند

فرم ˜كلي آن چنين است:

setusercharsize(intmultx, int divx, int multy, int divy);

 

Set view port77- دستور العمل

اين دستور العمل پنجره جاري را جهت خروجي گرافيك آماده ميسازد

فرم ˜كلي آن چنين است:

setviewport(intleft,inttop,intright,intbottom,intclip);

 

set visual page78-تابع

 

فرم ˜كلي آن چنين است:

setvisualpage(int page);

set write mode79- دستور العمل

اين دستور العمل مد نوشتن براي وضعيت گرافيكي موجود را تعيين ميكند

فرم ˜كلي آن چنين است:

setwritemode(int mode);

 

Text height80- دستور العمل

اين دستور العمل ارتفاع كاراكترها را بر حسب نقطه تصويري بر ميگرداند

فرم ˜كلي آن چنين است:

textheight(char far *textstring);

 

Text width81- دستور العمل

اين دستور العمل عرض كاراكترها را بر حسب نقطه تصويري بر ميگرداند

فرم ˜كلي آن چنين است:

textwidth(char far *textstring);

 

 

 

 

 

 

 

 

 

 

 

 

 

مراجع

 

گرافيك در سي

نويسنده مهندس جواد توسلي

ناشر:موسسه نشر فرهنگي زند

 

Getting graphic

Programming fundamentals in c++    mark finaly

 

برنامه نويسي گرافيكي با سي و سي++

نويسنده جابر هاشمي اصل

 

ماهنامه بزگراه رايانه شماره 27

 

ماهنامه رايانه شماره 99

 

گرافيك سه بعدي در سي++

نويسنده تيم ويتنبرگ

مترجم مهندس عين ا... جعفر نژاد قمي

 

كمك برنامه سي