从大作业来看,选择CAD系统的小组比较多,但部分同学对CAD绘图系统的链表数据结构设计不合理,导致后续缩放、旋转、选中、文件保存及读取等功能实现上比较棘手。
现给大家参考兼容多图形的数据结构设计,个人认为在图形操作及文件方面比较容易管理。
参考数据结构:
//记录每个图元点的位置信息,坐标点的链表结构
typedef struct PRIMITIVE_POINT {
double x, y; //the point coordinate.
PRIMITIVE_POINT *next;
}primitive_point;
//记录每个图元的头结点
typedef struct PRIMITIVE_HEAD {
size_t type;// the type of current primitive
bool fill_state; //Set a fill when fill_state = 1
COLOR fill_color; //The color of fill color
COLOR line_color; //Set line color
STYLE line_style; //Set line style
size_t line_width; //Set line width
bool selected_state; //The state is set to 1 if a user selects the primitive
OTHER other_parameters; //Set other parameters for extension
primitive *p; //A pointer points to the primitive
}primitive_head;
//利用**数组**或**链表**连接各个图元
primitive_head primitive_head_array[MAX_PRIMITIVE_NUMBER];
参考数据结构图:
图中红色点表示每个primitive对应的点,每个形状可以由若干图元构成。链表中仅保存图元信息(点位置)即可,通过头结点的type获取当前的形状信息,然后获取链表中每个节点的具体含义。
图中的primitive_head_array,也可以用链表结构表示。
矩形采用三个节点存储,是为了防止旋转操作情况下歧义形状的绘制。
通过上述链表结构定义,所有图形均可以通过同一种数据结构表达,能够有效降低代码复用性,提高开发效率。
除此之外,该数据结构也比较容易添加自定义图形(例如demo中的房子、鱼、立方体等),并容易修改固定的自定义图形。