بخش چهارم تحليل خطوط ابتدايي براي برنامه نويسي گرافيك در زبان ++C
بخش چهارم
تحليل خطوط ابتدايي در برنامه نويسي گرافيك در زبان C++
اغلب سيستم هاي كامپيوتري با توجه به نوع سيستم عامل آنها داراي دو محطي كاري متن و گرافيك مي باشند. در محيط متني كه در اغلب ويراستارها ديده مي شود مي توان يك كاراكتر را تايپ نمودو يا حذف نمود. ولي نمي توان در اين محيط نيمي از يك كاراكتر را حذف نمود. به همين دليل مي گوييم در محيط هاي متني واحد آدرس پذير صفحه، كاراكتر مي باشد.
در محيط هاي متني مثل Word مي توان اندازه فونت را تغيير داد و بسياري اعمال ديگر در آن صورت داد اما در محيط هاي قديمي مانند DOS اندازه و فونت ثابت و قابل تغيير نبود.
در محيط هاي گرافيكي واحد آدرس پذير صفحه، پيكسل مي باشد و مي توان به هر پيكسل از صفحه رنگ دلخواهي داد. اغلب زبان هاي برنامه نويسي از محيط متني به عنوان محيط پيش فرض برنامه نويسي استفاده مي كنند.
در برنامه هاي گرافيكي بايد محيط متني را به محيط گرافيكي تبديل كنيم. براي اين منظور از دستور initgraph در برنامه هاي خود استفاده كرده ايم. دستور initgraph مخفف Initializing the Graphics System به معني راه اندازي و آماده سازي محيط گرافيكي است. بر خلاف محيط هاي متني كه داراي ابعاد ثابتي بود (اغلب در DOS اين صفحه داراي 80 ستون و 25 سطر بود) محيط گرافيكي بسيار متنوع و قابل تنظيم مي باشد.
دستور initgraph()
داراي 3 پارامتر است:
initgraph(graph driver, graph mode, path to driver);
graph driver راه انداز محيط گرافيكي است كه با توجه به سخت افزار تعيين مي شود.
راه اندازهاي گرافيكي متنوعي در حال حاضر وجود دارند و هر روز در حال تكامل هستند. قديمي ترين راه انداز گرافيكي CGA يا Color Graphics Adaptor است كه در آن ابعاد 200*320 پيكسل با 4 رنگ است.
در اين جدول انواع راه انداز هاي گرافيكي و معادل عددي هر كدام ديده مي شود.
PC3270 |
VGA |
ATT400 |
HERCMONO |
IBM8514 |
EGAMONO |
EGA64 |
EGA |
MCGA |
CGA |
DETECT |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
راه انداز گرافيكي را مي توان به شكل هاي مختلفي استفاده كرد كه به آنها graph mode مي گويند. با تعيين اين مقدار، دقت صفحه نمايش، تعداد و نوع رنگ ها مشخص مي شود.
درقسمت سوم يعني PATH TO DRIVER مسير فايل هاي راه انداز گرافيكي مورد نياز برنامه را معرفي مي كنيم. براي تعيين راه انداز و حالت دلخواه در زبان C++ دو متغير صحيح با نام هاي دلخواه تعريف مي كنيم. براي مثال ما در همه برنامه هايمان تا اينجا و از اين به بعد از نامهاي gd برايgraph driver و gmبراي graph mode استفاده كرده ايم. مثال:
int gd, gm;
gd = VGA;
gm = VGAHI;
يادتان باشد زبان برنامه نويسي C و C++ به حروف بزرگ و كوچك حساس هستند. اصلاحا Case Sensitive هستند.
مي توان معادل عددي هر كدام را نيز با توجه به جدول بالا نوشت.
راه حل بهتري براي براي تعريف حالت گرافيكي در C++ وجود دارد. در اين روش به graph driver مقدار DETECT يا 0 را مي دهيم. در اين حالت بهترين حالت گرافيكي قابل استفاده در سيستم با توجه به سخت افزار تعيين مي شود و ديگر نيازي به حفظ كردن نام حالت هاي گرافيكي يا معادل عددي آن ها نمي باشد. در اين حالت طبق برنامه هاي قبلي ما اين دستور را مي نويسيم:
int gd,gm;
gd = DETECT;
در اين تعريف صفحه اي با ابعاد 480*640 و 16 رنگ قابل مشاهده است.
براي استفاده از راه انداز و حالت گرافيكي كورد نظر در دستور initgraph در قسمت اول gdو در قسمت دوم gm را مي نويسيم. اگر به هر دليلي initgraph نتواند محيط گرافيكي را ايجاد نمايد اين دو متغير مقدارشان تغيير مي كند. براي برگرداندن مقادير جديد به برنامه دز زبان C++ بايد آدرس اين دو متغير به تابع ارسال شود و اين كار توسط علامت & قبل از نام هر متغير انجام مي شود.
int gd, gm;
gd = DETECT;
initgraph(&gd, &gm, path to driver);
در قسمت سوم يعني path to driverبراي تعيين مسير بايد آدرس شاخه bgi كه شامل فايل هاي راه انداز و فايل هاي فونت مي باشد را تعيين كنيم. براي اين منظور آدرس درايو و نام شاخه اي كه C++ را در آن نصب كرده ايم را مي نويسيم. به طور مثال اگر كامپايلر C++ بر روي درايو C: باشد و در شاخه TC نصب شده باشد به شكل "c:\\tc\\bgi" مي نويسيم. اگر بخواهيم درايو و مسير را در نظر نگيرد بهتر است آن را به شكل "..\\bgi"بنويسيم.
حالتي كه براي آدرس دهي توضيح داده شد، مخصوص استفاده از كامپايلرهايي مثل Turbo C، Borland C، DosBox و غيره است. اما همانطور كه در فصل اول توضيح داديم ما از كامپايلري متفاوت به نام Dev-C++ استفاده مي كنيم و تمامي عكسها و برنامه هاي خود را در اين برنامه انجام داده ايم و سورس دانلود تحت اين برنامه قابل مشاهده و رويت است. دليل هم سادگي استفاده از اين كامپايلر و قدرت بيشتر براي يك سري از كارهاست. براي آدرس دهي شاخه bgi در اين كامپايلر بايد آنرا با كمي تفاوت نوشت:
initgraph(&gd, &gm, ":..\\bgi");
همانطور كه مي بينيد يك : قبل از .. وجود دارد.
همينطور در حالت كلي براي استفاده در تمامي كامپايلرها مي توانيم initgraphرا به شكل زير نيز بنويسيم:
initgraph(&gd, &gm, "");
بعد از اجراي صحيح اين دستور يك صفحه مشكي گرافيكي ايجاد مي شود كه آماده اجراي دستورات مي باشد. در انتهاي برنامه از دستور closegraph() براي تبديل محيط گرافيكي به محيط متن استفاده مي شود، ولي چون بعد از اجراي اين دستور كل صفحه پاك مي شود و يك صفحه مشكي متني نمايش داده مي شود، قبل از اجراي اين دستور توسط دستوراتي مانند getch(; يا delay توقفي در برنامه ايجاد مي كنيم تا بتوانيم خروجي را ببينم. البته نوشتن يا ننوشتن تغيير خاصي در برنامه ايجاد نمي كند.
براي اجراي دستورات گرافيكي بايد فايل سرآيند يا heard fileبا نام graphics.h را توسط #include به برنامه معرفي كنيم. همچنين در تمامي برنامه هاي گرافيكي اي كه تا امروز نوشته ايم و خواهيم نوشت دستورات موجود در فايل سرآيند conio.h مورد نياز است كه همان Consol Input/Output يا كنسول ورودي و خروجي است.
نکته: میتوان به جای استفاده از تابع ()initgraph از تابع ()initwindow برای مشاهده پنجره خروجی استفاده کنیم. تفاوتی که این دو با هم دارند در این است که تابع ()initgraph سایز صفحه خروجی اش 479*639 است ولی در تابع ()initwindow می توان آنرا دستی مقداردهی کرد و همین طور می توان عنوان پنجره خروجی را خودمان تعیین کنیم. شکل استفاده از این تابع به صورت زیر است:
عکس 1

تا اينجا كه توضيح داده شد يعني 3 بخش آموزشي، به ساده ترين دستورات پرداخته ايم شامل line، circle، rectangle و زياد درباره تحليل خطوط ثابت كه امروز توضيح داده شد بحثي به ميان نيامده بود. هدف ابتدا نحوه نوشتن و اجرا كردن برنامه و آشنايي با كامپايلر Dev-C++ بود. همچنين يك سري سورس كد براي هر بخش در نظر گرفته شده بود كه قابل دانلود بودند. در انتهاي اين پست مي توانيد يك سري برنامه ديگر با همين مواردي كه تا امروز توضيح داده ام را دانلود كنيد.



دانلود لوگو بانك كارآفرين با تغيير 1

دانلود لوگو بانك كارآفرين با تغيير 2




در اين برنامه ها يكسري دستور وجود دارند كه به توضيح آنها مي پردازيم و مي توانيد با سورس هايي كه در بالا قرار داده ايم مثالهاي كاملي را ببينيد. دستور rectangle، circle و line در بخش هاي قبلي توضيح داده شده اند و مثالهاي كاملي از آنها در برنامه هاي قبلي موجود است، همينطور در همين مثالهاي بالا نيز موجود هستند.
دستور setcolor
اگر بخواهيم رنگ خطوط شكل را تغيير دهيم از دستور setcolor(color) استفاده مي كنيم. براي تعيين رنگ مي توان نام رنگ دلخواه را با حروف بزرگ نوشت يا از طريق جدول زير معادل عددي آن رنگ را بنويسيم كه بين 0 تا 15 است. (مجموعا 16 رنگ)
مقدار عددي |
نام رنگ |
0 |
BLACK |
1 |
BLUE |
2 |
GREEN |
3 |
CYAN |
4 |
RED |
5 |
MAGENTA |
6 |
BROWN |
7 |
LIGHTGRAY |
8 |
DARKGRAY |
9 |
LIGHTBLUE |
10 |
LIGHTGREEN |
11 |
LIGHTCYAN |
12 |
LIGHTRED |
13 |
LIGHTMAGENTA |
14 |
YELLOW |
15 |
WHITE |
دستور bar
براي رسم مستطيل توپُر مي باشد و بايد در آن مختصات دو سر يكي از قطرهاي مستطيل را نوشت:
bar(x1,y1,x2,y2);
كه x1 بالاي، y1 چپ، x2 پايين و y2 راست است.
دستور setfillstyle
اگر بخواهيم رنگ داخل شكلهاي مستطيل يا هر شكل توپري را تغيير دهيم از اين دستور استفاده مي كنيم.
setfillstyle(pattern, color);
در دستور اول نوع يا حالت پر شدن شكل را تعيين مي كنيم كه مي توانيد از اعداد 0 تا 12 در بخش pattern آن استفاده كنيد. (مي توانيد نام آنها را نيز بنويسيد اما اعداد در اينجا ساده ترند!) اما حالت 12 آن براي تعريف كاربر مي باشد كه در بخش هاي بعدي توضيح مي دهيم.
پارامتر دوم يعني color همان رنگ مورد نظر است و مانند دستور setcolor يا عدد يا اسم رنگ را مي نويسيم.
دستور setlinestyle
براي تعيين نوع خط و پهناي خط مي باشد. اين دستور داراي سه پارامتر به شرح زير است:
setlinestyle(line style, pattern, thickness);
در line styleيا پارامتر اول نوع خط را تعيين مي كنيم. انواع خطوط بين 0 تا 4 مي باشند.
از patternيا پارامتر دوم براي تعيين الگوي خط استفاده مي شود كه از 0 تا 4 است.
در پارامتر سوم يعني thickness پهناي خط را مشخص مي كنيم كه فقط مقادير 1 و 3 را قبول مي كند.
دستور arc يا كمان
اين دستور براي رسم كماني از دايره مي باشد و در آن علاوه بر مختصات مركز دايره، بايد اندازه شعاع، اندازه زاويه شروع و زاويه پاياني كمان نسبت به سطح افق را تعيين كنيم. هر زاويه بر حسب درجه است. فرمت كلي:
arc(x, y, start angle, end angle, radius);
دستور ellipse
براي رسم كماني از بيضي است و در آن مختصات مركز بيضي، زاويه شروع، زاويه پايان، اندازه شعاع افقي و اندازه شعاع عمودي را بايد تعيين كنيم. اگر بخواهيم بيضي به طور كامل رسم شود زاويه شروع را 0 و زاويه پايان را 360 قرار مي دهيم. فرمت كلي:
ellipse(x, y, start angle, end angel, xradius, yradius);
دستور floodfill
اگر بخواهيم داخل هر شكل نامنظم ديگري را پر كنيم از اين دستور استفاده مي كنيم. در هنگام استفاده از اين دستور بايد دقت داشته باشيم كه شكل كاملا بسته باشد و تمام شكل با يك رنگ كشيده شده باشد. اگر شكل حتي به اندازه يك نقطه باز باشد يا مختصات نقطه داخل شكل را اشتباه بنويسيد يا رنگ اشتباه باشد ممكن است كل صفحه رنگ شود. براي تعيين رنگ و نوع پر شدن از همان دستورهاي setfillstyle و setfillpattern استفاده مي كنيم.
______________________________________________________________________________
همينطور مي توانيد به مباحث قبلي برگرديد:
بخش اول برنامه نويسي گرافيك در زبان ++C
بخش دوم برنامه نويسي گرافيك در زبان ++C
بخش سوم برنامه نويسي گرافيك در زبان ++C