تور لحظه آخری
امروز : شنبه ، 25 اسفند 1403    احادیث و روایات:  امام علی (ع):شب و روز بر هر كس بگذرد، او را ادب مى‏كند، فرسوده‏اش مى‏نمايد و به مرگ نزديكش مى‏س...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها

تبلیغات

تبلیغات متنی

خرید پرینتر سه بعدی

سایبان ماشین

اجاره سند در شیراز

armanekasbokar

armanetejarat

Future Innovate Tech

آموزشگاه آرایشگری مردانه شفیع رسالت

پی جو مشاغل برتر شیراز

خرید یخچال خارجی

بانک کتاب

طراحی سایت تهران سایت

irspeedy

درج اگهی ویژه

تعمیرات مک بوک

قیمت فرش

خرید بلیط هواپیما

بلیط اتوبوس پایانه

خرید از چین

خرید از چین

خرید سرور اچ پی ماهان شبکه

خودارزیابی چیست

رزرو هتل خارجی

تولید کننده تخت زیبایی

سی پی کالاف

دوره باریستا فنی حرفه ای

چاکرا

استند تسلیت

کلینیک دندانپزشکی سعادت آباد

پی ال سی زیمنس

دکتر علی پرند فوق تخصص جراحی پلاستیک

تعمیر سرووموتور

تحصیل پزشکی در چین

مجله سلامت و پزشکی

تریلی چادری

خرید یوسی

مهاجرت به استرالیا

ایونا

تعمیرگاه هیوندای

کاشت ابرو با خواب طبیعی

هدایای تبلیغاتی

خرید عسل

صندوق سهامی

تزریق ژل

خرید زعفران مرغوب

تحصیل آنلاین آمریکا

سوالات آیین نامه

سمپاشی سوسک فاضلاب

مبل کلاسیک

بهترین دکتر پروتز سینه در تهران

صندلی گیمینگ

کفش ایمنی و کار

دفترچه تبلیغاتی

خرید سی پی

قالیشویی کرج

سررسید 1404

تقویم رومیزی 1404

ویزای توریستی ژاپن

قالیشویی اسلامشهر

قفسه فروشگاهی

چراغ خطی

ابزارهای هوش مصنوعی

آموزش مکالمه عربی

اینتیتر

استابلایزر

خرید لباس

7 little words daily answers

7 little words daily answers

7 little words daily answers

گوشی موبایل اقساطی

ماساژور تفنگی

قیمت ساندویچ پانل

مجوز آژانس مسافرتی

پنجره دوجداره

خرید رنگ نمای ساختمان

ناب مووی

خرید عطر

قرص اسلیم پلاس

nyt mini crossword answers

مشاوره تبلیغاتی رایگان

دانلود فیلم

 






آمار وبسایت

 تعداد کل بازدیدها : 1865322778




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

محاسبه و ترسیم انواع اتصال چند وجهی در زبان ++c -


واضح آرشیو وب فارسی:سایت ریسک: محاسبه و ترسیم انواع اتصال چند وجهی در زبان ++c the_king 24 خرداد 1388, 11:36فرض کنیم که چند نقطه متمایز داشته باشیم، با اتصال این نقاط به همدیگر یک چند وجهی ایجاد می شود. اما در کل چند شکل متفاوت چند وجهی را می توان با این نقاط ایجاد کرد، بطوریکه هر گره (نقطه) تنها به دو گره دیگر متصل گردد؟ برنامه زیر که توسط توابع گرافیکی ++Turbo C تحت DOS نوشته شده، این حالات متفاوت را محاسبه کرده و نمایش می دهد. کلاس shape وظیفه ذخیره سازی و نمایش مشخصات چند وجهی را دارد. #include "iostream.h" #include "conio.h" #include "graphics.h" class shape { private: int m_sides; int *pos_x,*pos_y; int m_width,m_height; int m_min_x,m_min_y; int m_x,m_y; int set_video_mode(); void set_text_mode(); void find_shapes(int *,int,int *,int *); void show_shape(int *,int *,int *); public: shape(int); ~shape(); void set_pos(int,int,int); void paint(int,int); void pause(); int get_x(); int get_y(); int get_width(); int get_height(); } shape::shape(int sides) { int i; if (sides<3) sides=3; m_sides=sides; pos_x=new int[m_sides]; pos_y=new int[m_sides]; for (i=0;i<m_sides;i++) { pos_x[i]=0; pos_y[i]=0; } m_x=0; m_y=0; m_width=0; m_height=0; } shape::~shape() { delete[] pos_x; delete[] pos_y; } void shape::set_pos(int index,int x,int y) { if ((index>=0) && (index<m_sides)) { pos_x[index]=x; pos_y[index]=y; } } int shape::set_video_mode() { int graphdriver=VGA; int graphmode=VGAHI; int errorcode; if (getgraphmode()>=0) return 1; if (getgraphmode()!=grNoInitGraph) return 0; initgraph(&graphdriver, &graphmode, ""); errorcode=graphresult(); if (errorcode==grOk) return 1; cout << endl << "Graphics Error : " << endl; cout << " " << grapherrormsg(errorcode) << endl; return 0; } void shape::set_text_mode() { closegraph(); } void shape::show_shape(int *nodes,int *x,int *y) { int i,j; setcolor(BLUE); setlinestyle(SOLID_LINE,0,NORM_WIDTH); rectangle(*x,*y,*x+m_width+9,*y+m_height+9); setcolor(WHITE); for (i=0;i<m_sides;i++) { if (i==m_sides-1) j=0; else j=i+1; line( *x+pos_x[nodes[i]]-m_min_x+5, *y+pos_y[nodes[i]]-m_min_y+5, *x+pos_x[nodes[j]]-m_min_x+5, *y+pos_y[nodes[j]]-m_min_y+5); } setcolor(RED); setfillstyle(SOLID_FILL,RED); for (i=0;i<m_sides;i++) pieslice( *x+pos_x[i]-m_min_x+5, *y+pos_y[i]-m_min_y+5, 0,360,2); *x+=m_width+11; if (*x>640-m_width-10) { *x=0; *y+=m_height+11; } } void shape::find_shapes(int *nodes,int index,int *x,int *y) { int pos,temp; if (index==m_sides) { if (nodes[m_sides-1]>nodes[1]) show_shape(nodes,x,y); return; } find_shapes(nodes,index+1,x,y); for (pos=index+1;pos<m_sides;pos++) { temp=nodes[pos]; nodes[pos]=nodes[index]; nodes[index]=temp; find_shapes(nodes,index+1,x,y); nodes[index]=nodes[pos]; nodes[pos]=temp; } } void shape::paint(int base_x,int base_y) { int x; int y; int min_x=pos_x[0]; int min_y=pos_y[0]; int max_x=pos_x[0]; int max_y=pos_y[0]; int *nodes; int i; if (set_video_mode()==0) return; setcolor(WHITE); settextstyle(SMALL_FONT,HORIZ_DIR,0); outtextxy(base_x,base_y,"All Styles of Shape :"); x=base_x; y=base_y+14; nodes=new int[m_sides]; for (i=0;i<m_sides;i++) { nodes[i]=i; if (pos_x[i]<min_x) min_x=pos_x[i]; else if (pos_x[i]>max_x) max_x=pos_x[i]; if (pos_y[i]<min_y) min_y=pos_y[i]; else if (pos_y[i]>max_y) max_y=pos_y[i]; } m_width=max_x-min_x+1; m_height=max_y-min_y+1; m_min_x=min_x; m_min_y=min_y; find_shapes(nodes,1,&x,&y); if (x==0) y=y-m_height-11; m_x=x; m_y=y+6; delete[] nodes; } void shape::pause() { setcolor(WHITE); settextstyle(SMALL_FONT,HORIZ_DIR,5); outtextxy(4,460,"Press ESC key to exit."); while (getch()!=27); set_text_mode(); } int shape::get_x() { return m_x; } int shape::get_y() { return m_y; } int shape::get_width() { return m_width; } int shape::get_height() { return m_height; } int main() { clrscr(); shape a(3),b(4),c(5),d(6); a.set_pos(0,0,0); a.set_pos(1,40,20); a.set_pos(2,0,40); a.paint(0,0); b.set_pos(0,0,0); b.set_pos(1,40,0); b.set_pos(2,40,40); b.set_pos(3,0,40); b.paint(0,a.get_y()+a.get_height()+11); c.set_pos(0,0,0); c.set_pos(1,40,0); c.set_pos(2,40,40); c.set_pos(3,20,60); c.set_pos(4,0,40); c.paint(0,b.get_y()+b.get_height()+11); d.set_pos(0,8,0); d.set_pos(1,22,0); d.set_pos(2,30,20); d.set_pos(3,22,40); d.set_pos(4,8,40); d.set_pos(5,0,20); d.paint(0,c.get_y()+c.get_height()+11); d.pause(); return 0; } کتابخانه گرافیکی EGAVGA.BGI و فونت LITT.CHR که برنامه برای اجرای صحیح به آنها نیاز دارد، به همراه کد کامل برنامه و فایل اجرایی EXE ضمیمه این پست می باشد. the_king 24 خرداد 1388, 12:22تعریف کتابخانه های بکار رفته در پروژه : #include "iostream.h" #include "conio.h" #include "graphics.h" تعریف کلاس : shape class shape { متغیر های خصوصی کلاس : private: تعداد نقاط (گره ها) در چند وجهی : int m_sides; مختصات طولی و عرضی هر یک از نقاط (دو آرایه پویا خواهند بود) : int *pos_x,*pos_y; طول و عرض کادر چند وجهی : int m_width,m_height; حداقل مختصاتی که نقاط خواهند داشت : int m_min_x,m_min_y; موقعیتی که چند وجهی ترسیم در آن خواهد شد : int m_x,m_y; تابعی که برای ورود به حالت گرافیکی اجرا می شود : int set_video_mode(); تابعی که برای برگشت به حالت متنی اجرا می شود : void set_text_mode(); این تابع به جستجوی حالتهای مختلف چند وجهی می پردازد : void find_shapes(int *,int,int *,int *); نمایش یک حالت خاص از چند وجهی : void show_shape(int *,int *,int *); توابع عمومی کلاس : shape public: تعریف تابع سازنده کلاس : shape(int); تعریف تابع نابود کننده کلاس : ~shape(); تعریف تابعی برای تعیین کردن مختصات نقاط : void set_pos(int,int,int); تعریف تابعی برای ترسیم تمامی حالت های چند وجهی : void paint(int,int); تعریف تابعی که منتظر فشار کلیدی از سوی کاربر و بازگشت به حالت متنی می شود : void pause(); تعریف تابعی که موقعیت x ترسیم حالت بعدی را دریافت می کند : int get_x(); تعریف تابعی که موقعیت ترسیم y حالت بعدی را دریافت می کند : int get_y(); تعریف تابعی که طول کادر چند وجهی را دریافت می کند : int get_width(); تعریف تابعی که عرض کادر چند وجهی را دریافت می کند : int get_height(); کد تابع سازنده کلاس : } shape::shape(int sides) { یک متغیر داخلی برای حلقه : int i; حداقل تعداد نقاط باید سه باشد وگرنه چند وجهی حاصل نمی شود : if (sides<3) وگرنه اگر تعداد نقاط کمتر از 3 بود، به زور کتک 3 شود : sides=3; تعداد نقاط در متغیر خصوصی کلاس ثبت شود : m_sides=sides; یک آرایه برای نگهداری مختصات x نقاط ایجاد شود : pos_x=new int[m_sides]; یک آرایه برای نگهداری مختصات y نقاط ایجاد شود : pos_y=new int[m_sides]; برای اولین تا آخرین نقطه چند وجهی... for (i=0;i<m_sides;i++) مقدار اولیه مختصات x و y را (0,0) می نماییم : { pos_x[i]=0; pos_y[i]=0; } و مختصات x و y ترسیم چند وجهی هم (0,0) شود : m_x=0; m_y=0; بدیهی است که طول و عرض یک چند وجهی که تمامی نقاط اش (0,0) است نیز 0 در 0 است : m_width=0; m_height=0; } کد تابع نابود کننده کلاس : shape::~shape() { حافظه آرایه هایی که برای نگهداری مختصات x و y نقاط چند وجهی ایجاد شده بود آزاد شود : delete[] pos_x; delete[] pos_y; } کد تابعی که مختصات یک نقطه از چند وجهی را دریافت می کند : void shape::set_pos(int index,int x,int y) { اگر اندیس (شماره) نقطه در آرایه های مختصات x و y نقاط قابل قبول بود... if ((index>=0) && (index<m_sides)) { مختصات x و y نقطه در آرایه های مربوطه ثبت شود : pos_x[index]=x; pos_y[index]=y; } } کد تابعی که برای ورود به حالت گرافیکی اجرا می شود : int shape::set_video_mode() { درایور گرافیکی VGA انتخاب شود : int graphdriver=VGA; و Mode گرافیکی 16 رنگی 640x480 انتخاب شود : int graphmode=VGAHI; یک متغیری که شماره خطای احتمالی را نگهداری خواهد کرد : int errorcode; اگر اکنون در حالت گرافیکی هستیم... if (getgraphmode()>=0) پس نیازی به ورود به حالت گرافیکی نیست و از تابع خارج خواهیم شد : return 1; ولی اگر ایجاد یک حالت گرافیکی با خطایی روبرو شود... if (getgraphmode()!=grNoInitGraph) از تابع خارج می شویم : return 0; در غیر اینصورت حالت گرافیکی را تنظیم می کنیم : initgraph(&graphdriver, &graphmode, ""); و شماره خطای احتمالی را می خوانیم : errorcode=graphresult(); اگر خطایی بروز نکرده باشد... if (errorcode==grOk) از تابع خارج می شویم : return 1; وگرنه یک پیغام بروز خطا را نمایش می دهیم : cout << endl << "Graphics Error : " << endl; و در ادامه متن خطای رخ داده را نمایش می دهیم : cout << " " << grapherrormsg(errorcode) << endl; و از تابع خارج می شویم : return 0; } the_king 27 خرداد 1388, 00:57کد تابعی که برای بازگشت از حالت گرافیکی به حالت متنی فراخوانی می شود : void shape::set_text_mode() { حالت گرافیکی را از بین می بریم : closegraph(); } کد تابعی برای نمایش یک حالت از چند وجهی : void shape::show_shape(int *nodes,int *x,int *y) { دو متغیر داخلی را برای استفاده در حلقه تعریف می کنیم : int i,j; ابتدا رنگ آبی را برای ترسیم کادر دور چند وجهی انتخاب می کنیم : setcolor(BLUE); شیوه ترسیم خط را روی حالت 1 پیکسلی ساده تنظیم می کنیم : setlinestyle(SOLID_LINE,0,NORM_WIDTH); و کادری را دور چند وجهی ترسیم می کنیم، بطوریکه در مجموع 9 پیکسل در طول و عرض از چند وجهی بزرگتر باشد : rectangle(*x,*y,*x+m_width+9,*y+m_height+9); رنگ سفید را برای ترسیم خطوط چند وجهی انتخاب می کنیم : setcolor(WHITE); از اولین تا آخرین نقطه از چند وجهی... for (i=0;i<m_sides;i++) { اگر نقطه اندیس i ام آخرین نقطه چند وجهی باشد... if (i==m_sides-1) نقطه بعدی را اندیس 0 ام (اولین نقطه) در نظر می گیریم : j=0; وگرنه... else نقطه بعدی را اندیس i + 1 ام در نظر می گیریم : j=i+1; در هر صورت، از نقطه اندیس i ام به نقطه بعدی (اندیس j ام) یک خط رسم می کنیم، 5+ برای آن است که چند وجهی به کادر پیرامون اش نچسبد و اندکی فاصله داشته باشد : line( *x+pos_x[nodes[i]]-m_min_x+5, *y+pos_y[nodes[i]]-m_min_y+5, *x+pos_x[nodes[j]]-m_min_x+5, *y+pos_y[nodes[j]]-m_min_y+5); } برای رسم کردن دایره نقاط (گره ها)، رنگ قرمز را انتخاب می کنیم : setcolor(RED); شیوه پر کردن را انتخاب می کنیم تا هنگام ترسیم دایره، داخل اش توخالی نباشد و پر شود : setfillstyle(SOLID_FILL,RED); از اولین تا آخرین نقطه چند وجهی... for (i=0;i<m_sides;i++) یک دایره کامل 360 درجه ای به شعاع 2 پیکسل را در مختصات نقطه اندیس i ام رسم می کنیم : pieslice( *x+pos_x[i]-m_min_x+5, *y+pos_y[i]-m_min_y+5, 0,360,2); برای ترسیم چند وجهی در حالت بعدی مختصات x را جلوتر می بریم (به سمت راست) : *x+=m_width+11; اگر از کادر صفحه 640x480 پیکسلی خارج شده ایم... if (*x>640-m_width-10) { به مختصات 0 افقی بر گشته و پایین تر می رویم : *x=0; *y+=m_height+11; } } کد تابعی که به جستجوی حالتهای مختلف چند وجهی می پردازد : void shape::find_shapes(int *nodes,int index,int *x,int *y) { دو متغیر تعریف می کنیم که اولی یکی از نقاط چند وجهی را انتخاب کند و دومی برای تعویض مقدار آن نقطه با مقدار نقطه دیگر بکار رود : int pos,temp; اگر حالت جدیدی برای چند وجهی پیدا شده است... if (index==m_sides) { و اگر حالت پیدا شده تکراری نباشد... if (nodes[m_sides-1]>nodes[1]) آن حالت پیدا شده را ترسیم کن : show_shape(nodes,x,y); و از تابع خارج شو : return; } وگرنه برای جستجوی یک حالت جدید ادامه بده : find_shapes(nodes,index+1,x,y); از این نقطه اندیس index به بعد... for (pos=index+1;pos<m_sides;pos++) { مقدار نقطه را با نقطه index عوض کن : temp=nodes[pos]; nodes[pos]=nodes[index]; nodes[index]=temp; و پس از این جابجایی برای جستجوی یک حالت جدید ادامه بده : find_shapes(nodes,index+1,x,y); و در انتها مقدار نقطه عوض شده را به وضعیت قبلی اش برگردان : nodes[index]=nodes[pos]; nodes[pos]=temp; }




این صفحه را در گوگل محبوب کنید

[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 275]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن