关键是这句话:
也就是你除了实例代码外,不需要看任何的关于openGL的相关资料。你的任务就是利用多态实现各种图形的绘制,这些图形的定义是用.txt(文本文件)定义的。你需要读取这些文本文件,生成相应的四类对象(多边形,圆,变换,缩放)。
你还要过载操作符,比如<<,图形定义文件的读写
下面我给出程序的整体框架:
· 类的定义
class Shape //此为抽象类
{
public:
Shape(void)
{}
virtual void draw(void) = 0;
virtual bool ReadShape(ifstream& in) = 0; //参数是你打开的图形定义的文件流,请看看
};
class Translator : public Shape
{
private:
float position[3]; //变换的坐标值
public:
Translator()::Shape() {} //参数为空,因为需要从文件中读取
virtual void draw(void)
{
glTranslatef(position[0], position[1], position[2]);
}
virtual bool ReadShape(ifstream& in)
{
//从文件中读取该图形的参数
//具体的代码请自己写
}
};
class Scalor : public Shape
{
private:
float scale[3]; //变换的坐标值
public:
Scalor()::Shape() {} //参数为空,因为需要从文件中读取
virtual void draw(void)
{
glScalef(scale[0], scale[1], scale[2]);
}
virtual bool ReadShape(ifstream& in)
{
//从文件中读取该图形的参数
//具体的代码请自己写
}
};
class Polygon : public Shape
{
private:
int colour[3];
int num_vert;
float* vertex[3];//这个数组(注意,是二维数组)根据动态生成,存放多边形的各个定点坐标
virtual void draw(void)
{
glColor3f(colour[0], colour[1], colour[2]);
glBegin(GL_LINE_LOOP);
for(int i = 0; i < num_vert; i++)
{
glVertex3f(vertex[i][0], vertex[i][1], vertex[i][2]);
}
glEnd();
}
};
class Circle : public Polygon
{
private:
int colour[3];
float radius;
int num_segments;
float* vertex[3];//这个数组(注意,是二维数组)根据动态生成,存放多边形的各个定点坐标
virtual void draw(void)
{
glColor3f(colour[0], colour[1], colour[2]);
glBegin(GL_LINE_LOOP);
//画圆:可能是根据定义的分段数,计算出每个分段的坐标,然后画线
for(int i = 0; i < num_segments; i++)
{
//计算起点终点坐标
//画线
//算法请自己编写
}
glEnd();
}
};
· 改写main函数,实现从文件中读取图形的配置,生成一个图形对象列表(请考虑使用单链表实现)
//公共变量,存放文件中定义的图形列表
vector
int main(int argc, char** argv) // Create Main Function For Bringing It All Together
{
//从参数中的到要打开的文件名
//读取文件内容,生成以上定义的各种图形,保存在一个集合shpaes中
window w(argc, argv);
return 0;
}
· 定义了以上类结构后,改写原来给出的draw函数:
void draw(void)
{
//遍历shapes集合,绘制图形
//注:此处我使用foreach,只是为了好写,c++不支持foreach,你理解后修改
foreach(Shape* pShape in shapes)
{
pShapge->draw();
}
}
· 从文件中读取图形数据,题目要求你要使用overloaded operators,请查阅相关书籍实现,我实在没有时间去详细写了
注:以上是作业制作的思路,所用的语法等并不完全符合C++,请斟酌使用