ادامهٔ برنامهنویسی ویندوز و گرافیک سهبعدی با Visual C++
ادامهٔ برنامهنویسی ویندوز
با وجود آنکه برنامهنویسی توضیحدادهشده بهسرعت پیچیده میشود، دانشجویان میتوانند مفاهیم را بهخوبی درک کنند. اگرچه عملی نیست که از آنها خواسته شود همهچیز را کاملاً از صفر برنامهنویسی کنند، تکلیفهای دانشجویان معمولاً با یک برنامهٔ نمونه از مجموعهٔ گستردهای از مثالهایی که در حال توسعهٔ آنها بودهایم آغاز میشوند.
در گرافیک دوبعدی، اغلب از دانشجویان خواستهایم یک سامانهٔ کوچک CAD توسعه دهند که شامل دایرهها، کمانها، Rubber Banding و حتی عملیات Snap-to-Grid برای ترسیمهای دقیق باشد. ذخیرهٔ داده در فایل نیز با استفاده از تابع Serialize از کلاس Document، که دسترسی به فرایند عادی فایلکردن ویندوز را فراهم میکند، گنجانده میشود. برنامههایی مشابه شکل ۵ اغلب میتوانند نتیجهٔ پروژههای دانشجویی باشند. این برنامه قابلیت تنظیم Snap-to-Grid، قالب چندسندی و پسوند فایل سفارشی دارد. همانطور که در شکل ۵ دیده میشود، دو سند باز هستند که 2Sq.snp سند فعال است و پنجرهٔ فایل Open نیز برای دسترسی به فایل دیگری آماده است.
همچنین میتوان با قرار دادن تابعهایی که دانشجویان میتوانند در برنامهنویسی خود از آنها استفاده کنند، افق آنها را گسترش داد. در دنیای گرافیک دوبعدی، یکی از امکاناتی که در ارائهٔ بعدی MAE 473/573 بررسی خواهیم کرد، افزودن کلاسها و تابعهایی برای ترسیم نمودارها به فایلهای نمونهٔ برنامه است. در حال حاضر یک تابع پایه برای رسم منحنی دوبعدی و یک رسمکنندهٔ کانتور رنگی داریم که مثلاً برای ترسیم توزیع دما یا تنش قابل استفاده است.
شکل ۶ نمودارهای نمونه برای یک تیر با بارگذاری انتهایی را نشان میدهد. طرح تیر با نسخهای از برنامهٔ ترسیم با ماوس ساخته شده است. نمودار تنش کششی تیر و نمودار کانتور تنش در تابع OnDraw کلاس View، با استفاده از ابزارهای رسم نمودار و بر پایهٔ دادههایی که توسط کد برنامه در تابع OnNewDocument کلاس Document تولید شدهاند، ترسیم شدهاند. این تابع هنگام آغاز برنامه اجرا میشود.
گرافیک سهبعدی
یکی از دشواریهای آموزش گرافیک کامپیوتری، تعیین مقدار نرمافزارهای ازپیشآمادهای است که باید در اختیار دانشجویان قرار گیرد و در مقابل، چه مقدار برنامهنویسی مستقل باید توسط آنها انجام شود. اگر از دانشجویان خواسته شود همهچیز را از صفر برنامهنویسی کنند، حتی برای برنامههایی که صرفاً جذابیت متوسطی دارند نیز تلاش بسیار زیادی لازم خواهد بود. از سوی دیگر، اگر بیش از حد از تابعهای «جعبهسیاه» استفاده شود، دانشجویان میتوانند برنامههایی چشمگیر تولید کنند، در حالی که از مسائل مهم برنامهنویسی و جزئیات نظری گرافیک کامپیوتری، مانند موارد مطرحشده در Foley و van Dam، دور بمانند.
در کار با گرافیک سهبعدی، ما با در اختیار قرار دادن کلاسها و تابعهای پایهٔ سهبعدی برای دانشجویان به یک سازش موفق رسیدهایم. کدنویسی کامل این کلاسها و تابعها در برنامههای نمونه قرار دارد و در کلاس برای بحث دربارهٔ نظریه و برنامهنویسی استفاده میشود. از دانشجویان همچنین خواسته میشود بهعنوان بخشی از پروژههای برنامهنویسی خود، کد موجود در مثالها را اصلاح و گسترش دهند. این اصلاحات شامل حذف خطوط پنهان در یک الگوریتم تصویرسازی، بهبود تابعهای چرخش سهبعدی و ایجاد نمایشهای جامد سهبعدی برای اکستروژنها و اجسام حاصل از دوران بوده است. ساختار برنامهنویسی شیءگرای C++ در مثالها باعث میشود تمرکز روی بخشهای مشخص برنامه و بررسی نظریهٔ مرتبط با آنها بهآسانی امکانپذیر باشد.
برای تولید اشیای جامد سهبعدی، از مجموعهای از کلاسهای مشتقشده برای نمایش شیء استفاده کردهایم. نخستین کلاس BasePoint است که مختصات سراسری شیء را در سه بعد نگه میدارد. دومین کلاس Points است که همهٔ رأسهای تشکیلدهندهٔ شیء را در مختصات محلی، یعنی نسبت به BasePoint، نگه میدارد. سومین کلاس Polygons است که هر یک از چندضلعیهای تشکیلدهندهٔ جسم را بر حسب رأسها تعریف میکند. در نهایت، کلاس Shapes برای توصیف یک شکل مشخص از طریق تعریف نقطهٔ پایه، رأسها و چندضلعیهای آن استفاده میشود.
با تغییر نقطهٔ پایه میتوان یک شکل را بهآسانی جابهجا کرد؛ با چرخاندن رأسها میتوان آن را دوران داد و با تصویرسازی و ترسیم چندضلعیها میتوان آن را نمایش داد. قطعهکد زیر از اعلان کلاس Shapes گرفته شده است تا سازماندهی آن را نشان دهد. در خط ۰۱ میتوان دید که Shapes از Polygons مشتق شده و Polygons نیز از Points و BasePoint مشتق شده است. خط ۰۳ سازندهٔ خالی Shapes و خطوط ۰۴، ۰۵ و ۰۶ فهرست آرگومان تابعی را نشان میدهند که واقعاً یک شکل را تعریف میکند. مختصات نقطهٔ پایه، تعداد رأسها، اشارهگرهای مختصات رأسها، تعداد چندضلعیها، تعداد نقاط هر چندضلعی و موارد مشابه در آرگومانها قرار گرفتهاند. کدنویسی این تابع در منبع نشان داده نشده است.
01 class Shapes : Polygons {
02 public:
03 Shapes(){};
04 void Shapes::AdjustShape (double Xbp, double Ybp, double Zbp, int NPts,
05 double* ptX, double* ptY, double* ptZ, int NPolys, int* ptNPPts,
06 int* ptMPPts){……….}
07 void Shapes::RotateX(double thetaX){
08 Points::PRotateX(thetaX); }
09 void Shapes::RotateY(double thetaY){
10 Points::PRotateY(thetaY); }
11 void Shapes::RotateZ(double thetaZ){
12 Points::PRotateZ(thetaZ);
13 void Shapes::Move(double nx, double ny, double nz){
14 Basepoint::MoveBP(dx,dy,dz);
15 void Shapes::Dmove(double dx, double dy, double dz){
16 Basepoint::DmoveBP(nx,ny,nz);
17 void Shapes::Show(CDC* aDC){
18 Polygons::Trace(aDC); }
بااینحال، خطوط ۰۷ تا ۱۸ تابعهای کامل باقیماندهٔ کلاس Shapes را نشان میدهند. برای مثال، خطوط ۰۷ و ۰۸ با فراخوانی تابع Points که همهٔ رأسهای شکل را میچرخاند، شکل را حول محور X و از مسیر نقطهٔ پایهٔ آن دوران میدهند. خطوط ۱۳ و ۱۴ میتوانند با فراخوانی تابع BasePoint و تغییر مختصات نقطهٔ پایه، شکل را در فضای سهبعدی جابهجا کنند. تابع Show در خطوط ۱۷ و ۱۸ با فراخوانی تابع Polygons، که ترسیم هر چندضلعی را انجام میدهد، شکل را روی صفحه نمایش میدهد.
این ساختار برنامه بسیار مقاوم و کاربردی از آب درآمده است. الگوریتمهای تصویرسازی را میتوان با تمرکز روی تابع Trace از کلاس Polygons مطالعه کرد. از این روش برای حذف خطوط پنهان و تصویرسازی استریو استفاده شده است. سازندههای سطح بالاتر شکل نیز بهسادگی برای استوانهها و اجسام حاصل از دوران نوشته شدهاند. همچنین یک کلاس منحنی Bezier نوشته شده که از کلاسهای BasePoint و Points استفاده میکند. دانشجویان میتوانند کدنویسی تابعهای خاص را بررسی کنند و تکلیفهایی برای اصلاح یا بهبود آنها انجام دهند. شکل ۷ چند تصویرسازی سادهٔ سهبعدی حاصل از برنامههای پایه را نشان میدهد و شکل ۸ نمایش نسخهای با قابلیت حذف خطوط پنهان و منحنی Bezier را ارائه میکند.
جزئیات مربوط به OpenGL، جمعبندی درس، منابع و همهٔ شکلهای اصلی سند در مقالهٔ بعدی آمده است.