|
2 |
|
|
2 |
|
|
2 |
|
|
3 |
|
|
3 |
|
|
3 |
|
|
3 |
|
|
4 |
|
|
4 |
|
|
4 |
|
|
4 |
|
|
6 |
|
|
7 |
|
|
7 |
|
|
7 |
|
|
7 |
PALETTE
gpaletteget(int start_entry,gpalette *palette,int entries) |
|
8 |
|
|
8 |
|
|
8 |
|
|
8 |
|
|
10 |
|
|
10 |
|
|
11 |
|
|
11 |
|
|
12 |
|
|
14 |
|
|
16 |
|
|
19 |
|
|
19 |
|
|
24 |
|
|
|
|
|
25 |
|
|
26 |
|
|
26 |
|
|
27 |
|
|
27 |
|
|
27 |
|
|
27 |
|
|
27 |
|
|
27 |
|
|
29 |
|
|
29 |
|
|
29 |
|
|
29 |
|
|
30 |
|
|
30 |
|
|
30 |
|
|
30 |
|
|
30 |
|
|
30 |
|
|
30 |
|
|
30 |
|
|
31 |
|
|
31 |
|
|
31 |
|
|
31 |
|
|
31 |
|
|
31 |
|
|
31 |
|
|
31 |
|
|
32 |
|
|
32 |
|
|
32 |
|
|
32 |
|
|
32 |
|
|
32 |
|
|
32 |
|
|
32 |
|
|
33 |
|
|
33 |
|
|
33 |
|
|
33 |
|
|
33 |
|
|
33 |
|
|
33 |
|
|
33 |
|
|
34 |
|
|
34 |
|
|
34 |
|
|
34 |
|
|
34 |
|
|
34 |
|
|
34 |
|
|
35 |
|
|
35 |
|
|
35 |
|
|
35 |
|
|
35 |
|
|
35 |
|
|
35 |
|
|
35 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
36 |
|
|
37 |
|
|
37 |
|
|
37 |
|
|
37 |
|
|
37 |
|
|
37 |
|
|
37 |
|
|
37 |
|
|
38 |
|
|
38 |
|
|
38 |
|
|
38 |
|
|
38 |
|
|
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
مختلف كارتهاي گرافيكي كمك خواهد شد.
با استفاده از توابع چهار چوب با فر زير ميتوان
دستگاه نمايشي را مقدار اوليه داده نقاط گرافيكي را خوانده و نوشته صفحه نمايش را
پاك كرده و آن را به حالت اوليه برگرداند.
اين تابع داراي يك ارگومان صحيح براي تعيين كردن حالت عملياتيچهار چوب با
فر براي بقيه برنامه ميباشد.
فراخوانياين تابع بايستي قبل از فراخواني هاي ديگر گرافيكي بوده و بايستي تنها يك بار
فراخواني شود. اين تابع بستگي زيادي به سيستم عامل و دستگاه نمايشي دارد.
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)اين تابع بر خلاف تابع قبل عمل مينمايد اين تابع عنصرواقع درمحل
را بر مگرداند.
اين تابع تمام چهارچوب با فر را
پا˜ ميكند .پا˜ ˜كردن به اين معنا است ˜كه تمام نقاط روي چهار
چوب با فر برابر صفر قرار داده ميشوند ˜كه اين ˜كار باعث پا˜ شدن
صفحه نمايش ميشود ˜كه رنگ صفحه پا˜ شده برابر با رنگ اختصاص داده شده به
عدد صفر در جدول رنگ مورد استفاده ميباشد
دقيقا اين ˜كار را مي توان به وسيله يك حلقه تكرار ˜كه به وسيله
آن تمام نقاط با فر را برابر
صفر قرار ميدهيم ولي اغلب بسته هاي
گرافيكي داراي يك تابع ميباشند ˜كه به وسيله آن ميتوان صفحه نمايش را سريعتر
پا˜ كرد
اين تابع داراي هيچ گونه ارگوماني
نميباشد و تمام عمليات گرافيكي را خاتمه ميدهد˜ه در نتيجه آن قرار داشت
بر ميگرداند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
فرم فراخواني و توضيح
توابع مربوط به پردازش جدول رنگها
اين تابع جدول رنگها را برابر
مشخصات پيش فرض قرار ميدهد. رنگ شماره 0 برابر رنگ سياه برابر رنگ سفيد خواهد
بود.16 عنصر اولGPALETTEGETSIZE()-1بوده و رنگ شماره
خواهد بود در مورد يك جدول رنگ داراي GTYPES.Hمطابق
رنگهاي تعريف شده در فايل
256
رنگ عناصر از 16 تا 256 برابر يك مقياس رنگي قرار داده خواهد شد ˜كه براي
طرحهاي رنگي مدرج مفيد ميباشد.
اين تابع تعداد ما˜زيمم عناصر
موجود در جدول رنگها براي حالت جاري نمايش را بر ميگرداند را 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تابع
گرافيكي سيستم را تعيين
مينمايد در مجموعه دستور العمل هاي زير مسير درايورها را پوشه جاري در نظر ميگيريم
اگر ˜كارت گرافيكي لازم وجود
نداشته باشد و اگر درايور يافت نشود يا اشتباهات ديگري وجود
نتايج حاصل از بروز graphreslut,garpherrormsgداشته باشد. كدي توليد ميشود
دو تابع
اشكالات را تست كرده و يا نشان ميدهند.
اين تابع ˜د عددي اشكالات
حاصله از دستورات گرافيكي را ارائه ميدهد. ليست زير ˜د اشتباهات و ثابت هاي
مربوطه و شرح هر يك را نشان ميدهد.
|
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 شماره نسخه وجود ندارد |
وجود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-;
}
با اضافه ˜كردن چند ضلعي ها
به ليست اشكال گرافيكي خود ميتواند طيف وسيعي از اشكال را
مورد بحث و برسي قرار داد.
يك˜ چند ضلعي يك˜ مجموعه نقاط متصل به هم در كي˜ صفحه است ˜كه
˜ يك˜ ناحيه بسته را بر روي آن صفحه تعريف ميكند نقاط مزبور را با پاره
خطها به هم وصل مي˜كنيم هر
˜كدام از اين نقاط را يك˜ راس چند ضلعي گويند محدوده اصلي در مورد چند
ضلعي اين است ˜كه نقطه آخري هميشه به نقطه اولي متصل شود ˜كه در نتيجه
هميشه يك˜ شكل بسته خواهيم داشت
چند ضلعي محدب
![]()
يك˜ چند ضلعي
بطور داخلي با ساختار زير نمايش داده ميشود:
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 وجود دارد ˜كه اساس رسم اشكال گرافيكي در 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 |
فرمت دستور العمل:
ARC(intx,inty,stangle,int,endangle,int,radius);
: اين دستور العمل
يك˜ كمان رسم ميكند و در آن
مختصات مركزy وx-
زاويه شروعstangle -
زاويه پايانendangle -
شعاع دايره استradius -
فرمت دستور العمل:
BAR(intleft,inttop,intright,intbottom);
در اجراي اين دستور العمل يك˜
مستطيل رسم ميشود.
:مختصات گوشه بالاي سمت چپintleft,inttop
:مختصات گوشه پائيني سمت راستintright,intbottom
فرمت دستور العمل:
BAR3D(intleft,inttop,intright,intbottom,intdepth,inttopflag);
در اجراي اين دستور العمل يك˜
ستون سه بعدي رسم ميشود.
:مختصات گوشه بالاي سمت چپintleft,inttop
:مختصات گوشه پائيني سمت راستintright,intbottom
عمق ستون سه بعدي :Intdepth
: Inttopflag
در اجراي اين دستور العمل يك˜
دايره رسم ميشود.
CIRCLE(intx,inty,radius);
شعاع دايره است.raduse مختصات مركز وy و xدر اين دستور
العمل
در اجراي اين دستور العمل صفحه
گرافيكي نمايش پا˜ ميشود
Cleardevice();
در اجراي اين دستور العمل پنجره
موجود پا˜ ميشود
Clearviewport();
در اجراي اين دستور العمل
سيستم گرافيكي پا˜ ميشود
Closegraph()
در اجراي اين دستور العمل درايور
گرافيكي سيستم ارائه داده ميشود
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
Drawpoly(int numpoint,int far polypoints);
بر اساس پارامتر اول به زوجPoly pointدر
اجراي فرمان يك˜ چند ضلعي رسم ميشود و در ان
مقادير مراجعه ميكند كه هر
˜دام مختصات يك˜ نقطه از چند ضلعي است.
اين دستور العمل يك بيضي رسم ميكند
فرم كلي آن چنين است:
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
اين دستور العمل يك˜ بيضي تو
پور را رسم ميكند
فرم ˜كلي آن چنين است:
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
اين دستور العمل يك چند ضلعي را
رسم ميكند و داخل آنرا پر ميكند
فرم ˜كلي آن چنين است:
fillpoly(int numpoints, int far *polypoints);
˜كه در آن به تعداد پارامتر
اول پارامتر دوم موجود است
در اجراي اين دستور يك˜
محدوده بسته با نمونه مشخصي پر ميشود
فرم ˜كلي آن چنين است:
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);
در اجراي اين دستور العمل نسبت
جاري بين مختصات در وضعيت گرافيكي موجود ارائه ميشود
اين دستور العمل كد رنگ زمينه گراف را نشان
ميدهد
getbkcolor(void);
در اجراي اين دستور العمل رنگ جاري سيستم
گرافيكي ارائه ميشود
فرم ˜كلي آن چنين است:
getcolor(void);
Get default palette18-دستور العمل
اين دستور العمل ساختار پالت را بر ميگرداند
فرم ˜كلي آن چنين است:
getdefaultpalette(void);
اين دستور العمل نام درايور جاري سيستم را ارائه
ميدهد
فرم ˜كلي آن چنين است:
getfillpattern(char far *pattern);
Get fill pattern20-دستور العمل
اين دستور العمل نمونه طراحي ساخت كاربر را به
حافظه كپي ميكند
فرم ˜كلي آن چنين است:
getfillpattern(char far *pattern);
Get fill setting21-دستور العمل
اين دستور العمل اطلاعاتي در مورد نمونه طراحي
مورد عمل در وضع موجود سيستم گرافيكي را ارائه ميدهد
فرم ˜كلي آن چنين است:
getfillsettings (struct fillsettingstype far *fillinfo);
با اجراي اين دستور العمل مد گرافيكي موجود به
سيستم باز ميگردد.
فرم ˜كلي آن چنين است:
getgraphmode(void);
بخش مشخصي از صفحه نمايش را به حافظه منتقل
ميكند
فرم ˜كلي آن چنين است:
getimage(int left, int top, int right, int bottom,void far *bitmap);
get line setting24-دستور العمل
اين دستور العمل نوع و نمونه و ضخامت خط جاري را
ارائه ميدهد
فرم ˜كلي آن چنين است:
getlinesettings(struct linesettingstype far *lineinfo);
اين دستور العمل يزرگترين عدد مربوط به نگ
كامپيوتر را به برنامه برگشت ميدهد
فرم ˜كلي آن چنين است:
getmaxcolor(void);
get max mode name26- دستور العمل
اين دستور العمل ماكزيمم شماره مد جاري سيستم
گرافيكي را نشان ميدهد
فرم ˜كلي آن چنين است:
getmaxmode(void);
از
مختصات صفحه نمايش را نشان ميدهدxاين دستور العمل ماكزيمم
فرم ˜كلي آن چنين است:
getmaxx(void);
از مختصات صفحه نمايش را نشان ميدهدyاين دستور العمل ماكزيمم
فرم ˜كلي آن چنين است:
getmaxy(void);
اين دستور العمل اشاره گري را باز ميگرداند كه
به نام مد گرافيكي اشاره ميكند
فرم ˜كلي آن چنين است:
getmodename(int mode_number);
Get mode arrange30- دستور العمل
اين دستور العمل دامنه مد براي درايو گرافيكي
داده شده را به دست ميدهد
فرم ˜كلي آن چنين است:
getmoderrange(int graphdriver, int far *lomode, int far*himode);
اين دستور العمل اطلاعاتي در مورد پالت جاري به
دست ميدهد
فرم ˜كلي آن چنين است:
getpalette(struct palettetype far *palette);
get
pallet size32-
دستور العمل
اين دستور العمل اندازه جدول و رنگ پالت را نشان
ميدهد
فرم ˜كلي آن چنين است:
getpalettesize(void);
اين دستور العمل رنگ نقطه مشخص را به دست مي دهد
فرم ˜كلي آن چنين است:
getpixel(int x, int y);
get text
setting 34-
دستور العمل
اين دستور العمل اطلاعاتي را در مورد فونتهاي
متن گرافيكي جاري را به دست ميدهد
فرم ˜كلي آن چنين است:
gettextsettings(struct textsettingstype far
*texttypeinfo);
Get view setting35- دستور العمل
اين دستور العمل اطلاعاتي درباره پنجره ديد جاري
را نشان ميدهد
فرم ˜كلي آن چنين است:
getviewsettings (struct viewporttype far *viewport);
اين دستور العمل طول نقطه جاري را ارائه ميدهد
فرم ˜كلي آن چنين است:
getx(void);
اين دستور العمل عرض نقطه جاري را ارائه ميدهد
فرم ˜كلي آن چنين است:
gety(void);
اين دستور العمل تنضيمات گرافيكي را به وضع اول
باز ميگرداند
فرم ˜كلي آن چنين است:
graphdefaults(void);
اين دستور العمل اشاره گري را به برنامه باز
ميگرداند كه به پيغام مربوط به اشتباه اشاره ميكند
فرم ˜كلي آن چنين است:
grapherrormsg(int errorcode);
اين دستور العمل ميزان حافظه لازم براي بارگذاري
برنامه جاري را نشان ميدهد
فرم ˜كلي آن چنين است:
_graphgetmem(unsigned
size);
-graph
free mem41- دستور العمل
اين دستور العمل ميزان حافظه مربوط به گراف را كنترل
ميكند
فرم ˜كلي آن چنين است:
_graphfreemem(void
far *ptr, unsigned size);
اين دستور العمل كد اشتباه را در مورد آخريت عمل
ناموفق ارئه ميدهد
فرم ˜كلي آن چنين است:
graphresult(void);
را اعلام ميداردBit imageاين دستور العمل تعداد بايتهاي لازم
براي ذخيره يك
فرم ˜كلي آن چنين است:
imagesize(int left, int top, int right, int bottom);
اين دستور العمل سيستم گرافيكي را آماده كار
ميسازد
فرم ˜كلي آن چنين است:
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);
اين دستور العمل يك خط رسم ميكند
فرم ˜كلي آن چنين است:
linel(int
dx, int dy);
اين دستور العمل از محل چاپ گرافيك به نقطه معين
خط رسم ميكند
فرم ˜كلي آن چنين است:
linerel(int
dx, int dy);
اين دستور العمل از نقطه جاري به نقطه مشخص شده
خطي رسم مي نمايد
فرم ˜كلي آن چنين است:
lineto(int
x, int y);
اين دستور العمل محل فعلي گرافيكي را به فاصله
معيني جلو يا عقب ميبرد
فرم ˜كلي آن چنين است:
moverel(int
dx, int dy);
هدايت
ميكند(x,y)اين دستور العمل كنترل را به نقطه
فرم ˜كلي آن چنين است:
moveto(int
x, int y);
اين دستور العمل يك رشته كاراكتر را در پنجره
نشان ميدهد
فرم ˜كلي آن چنين است:
outtext(char far *textstring);
اين دستور العمل يك رشته كاراكتري را در محل
مورد نظر نمايش ميدهد
فرم ˜كلي آن چنين است:
outtextxy(int x, int y, char far *textstring);
اين دستور العمل يك قطاع دايره را رسم ميكند و
آن را پر ميكند
فرم ˜كلي آن چنين است:
pieslice(int x, int y, int stangle, int endangle, int radius);
اين دستور العمل يك بخش از صفحه تصوير را به
خروجي ميفرستد
فرم ˜كلي آن چنين است:
putimage(int left, int top, void far *bitmap, int op);
اين دستور العمل يك نقطه را در محل مورد نظر و
به رنگ مطلوب رسم ميكند
فرم ˜كلي آن چنين است:
putpixel(int x, int y, int color);
اين دستور العمل يك مستطيل رسم ميكند
فرم ˜كلي آن چنين است:
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(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);
اين دستور العمل بر اساس پالت موجود رنگ زمينه
را تعيين ميكند
فرم ˜كلي آن چنين است:
setbkcolor(int color);
فرم ˜كلي آن چنين است:
setcolor(int color);
set fill
pattern67-
دستور العمل
اين دستور العمل يك نمونه طرح ساخت كاربر را
تعيين ميكند
فرم ˜كلي آن چنين است:
setfillpattern(char far *upattern, int color);
اين دستور العمل طرح نمونه براي پر كردن اشكال و
رنگ آن را تعيين مينمايد
فرم ˜كلي آن چنين است:
setfillstyle(int pattern, int color);
set
graph buf size69- دستور العمل
اين دستور العمل اندازه بافر گرافيك را تعيين
ميكند
فرم ˜كلي آن چنين است:
setgraphbufsize(unsigned bufsize);
اين دستور العمل مد گرافيكي سيستم را تعيين كرده
صفحه نمايش را پاك ميكند
فرم ˜كلي آن چنين است:
setgraphmode(intmode);
اين دستور العمل همه رنگهاي پالت را تغيير ميدهد
فرم ˜كلي آن چنين است:
setpalette(int colornum, int color);
set rgb
palette72-
دستور العمل
را
تعيين ميكندibm-8514اين دستور العمل رنگ كارت گرافيكي
فرم ˜كلي آن چنين است:
setrgbpalette(int colornum, int red,
int green, int blue);
اين دستور العمل نوع خط و يا نمونه خط را تعيين
مينمايد
فرم ˜كلي آن چنين است:
setlinestyle(int linestyle, unsigned upattern, int thickness);
set text
justify74-
دستور العمل
اين دستور العمل
فرم ˜كلي آن چنين است:
settextjustify(int horiz, int vert);
اين دستور العمل ويژگيهاي متن را در وضع خاص
تنظيم ميكند
فرم ˜كلي آن چنين است:
settextstyle(int font, int direction, int charsize);
Set user char size76- دستور العمل
اين دستور العمل براي فونتهاي مورد نظر اندازه
تعيين ميكند
فرم ˜كلي آن چنين است:
setusercharsize(intmultx, int divx, int multy, int divy);
اين دستور العمل پنجره جاري را جهت خروجي گرافيك
آماده ميسازد
فرم ˜كلي آن چنين است:
setviewport(intleft,inttop,intright,intbottom,intclip);
فرم ˜كلي آن چنين است:
setvisualpage(int page);
اين دستور العمل مد نوشتن براي وضعيت گرافيكي
موجود را تعيين ميكند
فرم ˜كلي آن چنين است:
setwritemode(int mode);
اين دستور العمل ارتفاع كاراكترها را بر حسب
نقطه تصويري بر ميگرداند
فرم ˜كلي آن چنين است:
textheight(char far *textstring);
اين دستور العمل عرض كاراكترها را بر حسب نقطه
تصويري بر ميگرداند
فرم ˜كلي آن چنين است:
textwidth(char far *textstring);
گرافيك در سي
نويسنده مهندس جواد توسلي
ناشر:موسسه نشر فرهنگي زند
Getting
graphic
Programming
fundamentals in c++ mark finaly
برنامه نويسي گرافيكي با سي و سي++
نويسنده جابر هاشمي اصل
ماهنامه بزگراه رايانه شماره 27
ماهنامه رايانه شماره 99
گرافيك سه بعدي در سي++
نويسنده تيم ويتنبرگ
مترجم مهندس عين ا... جعفر نژاد قمي
كمك برنامه سي