تور لحظه آخری
امروز : یکشنبه ، 16 دی 1403    احادیث و روایات:  امام محمد باقر(ع):هرچیز بهاری دارد و بهار قرآن ماه رمضان است.
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها

تبلیغات

تبلیغات متنی

صرافی ارکی چنج

صرافی rkchange

سایبان ماشین

دزدگیر منزل

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

armanekasbokar

armanetejarat

صندوق تضمین

Future Innovate Tech

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

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

موسسه خیریه

واردات از چین

حمية السكري النوع الثاني

ناب مووی

دانلود فیلم

بانک کتاب

دریافت دیه موتورسیکلت از بیمه

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

irspeedy

درج اگهی ویژه

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

دانلود فیلم هندی

قیمت فرش

درب فریم لس

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

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

تعمیرات پکیج کرج

لیست قیمت گوشی شیائومی

خرید فالوور

پوستر آنلاین

بهترین وکیل کرج

بهترین وکیل تهران

خرید از چین

خرید از چین

تجهیزات کافی شاپ

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

کاشت ابرو طبیعی و‌ سریع

قیمت بالابر هیدرولیکی

قیمت بالابر هیدرولیکی

قیمت بالابر هیدرولیکی

لوله و اتصالات آذین

قرص گلوریا

نمایندگی دوو در کرج

دوره آموزش باریستا

مهاجرت به آلمان

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

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

نوار اخطار زرد رنگ

ثبت شرکت فوری

تابلو برق

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

فروشگاه مخازن پلی اتیلن

قیمت و خرید تخت برقی پزشکی

کلینیک زخم تهران

خرید بیت کوین

خرید شب یلدا

پرچم تشریفات با کیفیت بالا و قیمت ارزان

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

پرواز از نگاه دکتر ماکان آریا پارسا

پارتیشن شیشه ای اداری

اقامت یونان

خرید غذای گربه

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

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

مشاوره تخصصی تولید محتوا

سی پی کالاف

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

چاکرا

استند تسلیت

تور بالی نوروز 1404

سوالات لو رفته آیین نامه اصلی

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

پی ال سی زیمنس

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

تجهیزات و دستگاه های کلینیک زیبایی

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

 






آمار وبسایت

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




هواشناسی

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

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
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]
[تعداد بازديد از اين مطلب: 273]

bt

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







-


گوناگون

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


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