the_king
مدیرکل انجمن
فرض کنیم که چند نقطه متمایز داشته باشیم، با اتصال این نقاط به همدیگر یک چند وجهی ایجاد می شود.
اما در کل چند شکل متفاوت چند وجهی را می توان با این نقاط ایجاد کرد، بطوریکه هر گره (نقطه) تنها به دو گره دیگر
متصل گردد؟
برنامه زیر که توسط توابع گرافیکی ++Turbo C تحت DOS نوشته شده، این حالات متفاوت را محاسبه کرده
و نمایش می دهد. کلاس shape وظیفه ذخیره سازی و نمایش مشخصات چند وجهی را دارد.
کتابخانه گرافیکی EGAVGA.BGI و فونت LITT.CHR که برنامه برای اجرای صحیح به آنها نیاز دارد، به همراه
کد کامل برنامه و فایل اجرایی EXE ضمیمه این پست می باشد.
اما در کل چند شکل متفاوت چند وجهی را می توان با این نقاط ایجاد کرد، بطوریکه هر گره (نقطه) تنها به دو گره دیگر
متصل گردد؟
برنامه زیر که توسط توابع گرافیکی ++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 << "\t" << 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 ضمیمه این پست می باشد.