基于OpenCL的二维图形变换与裁剪实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二维图形变换与裁剪实验
目录
1.实验目的 (3)
2.实验内容 (3)
2.1 实验内容 (3)
2.2 实验任务 (3)
3.实验过程 (3)
3.1 创建基类 (3)
3.2 程序分析 (5)
3.2.1 数据结构设计 (6)
3.3 过程描述 (6)
3.3.1 添加线段类CLine (6)
3.3.1.1 CLine类的定义 (6)
3.1.1.2线段的绘制 (7)
3.3.1.3 线段的平移算法 (8)
3.3.1.4 线段的旋转算法 (9)
3.3.1.5 线段缩放算法 (10)
3.3.1.6 线段裁剪算法 (11)
3.3.2 添加圆类CCircle (16)
3.3.2.1 CCircle类的定义 (16)
3.3.2.2 圆的绘制算法 (17)
3.3.2.3 圆的平移算法 (18)
3.3.2.4 圆的旋转算法 (19)
3.3.2.4 圆的缩放算法 (19)
3.3.3 添加矩形类CTrangle (20)
3.3.3.1 CTrangle类的定义 (20)
3.3.3.2 矩形的绘制算法 (21)
3.3.3.3 矩形的平移算法 (22)
3.3.3.4 矩形旋转算法 (23)
3.3.3.5 矩形缩放算法 (24)
3.3.4 添加多边形类CPolygn (25)
3.3.4.1 CPolygon类的定义 (25)
3.3.4.2 多边形绘制算法 (26)
3.3.4.3 多边形平移算法 (27)
3.3.3.4 多边形旋转算法 (27)
3.3.3.5 多边形缩放算法 (28)
3.3.3.6 多边形裁剪算法 (29)
3.4 菜单事件 (35)
3.4.1 消息映射 (35)
3.4.2 事件实现 (36)
3.5 整体运行效果截图 (44)
4.实验体会 (44)
实验题目:基本图形生成算法实验
1.实验目的
1)掌握图形几何变换实现原理,基本几何、复合等;
2)掌握二维图形观察流程及变换。
3)掌握图形裁剪算法(二维线段、多边)的原理与实现方。
4)掌握面向对象知识实现图形类的编写方法,实现二维图形的变换换与裁剪。
2.实验内容
2.1 实验内容
二维图形变换与裁剪实验目的是掌握基本几何、复合二维图形变换与裁剪、窗口视图变换、图形裁减算法等,实验内容包括基于面向对象的方法建立图形类层次结构(如图形基类、点、线段、圆、多边形等),实现几种图形的表示、绘制、序列化(持久保存到磁盘文件)等,实现图形的几何变换(平移、旋转、缩放、复合变换);实现直线段缩放、复合变换);实现直线段缩放、复合变换);实现直线段缩放、复合变换);实现直线段裁剪(三选一:编码裁减算法、中点分割剪算法、Liang -Barsky算法)、多边形裁剪(二选一:多边形Sutherland -Hodgman裁剪算法、Weiler-Atherton裁剪算法)。在一个程序框架下实现,提交3次程序, 1份实验报告。
2.2 实验任务
1)使用Visual C++建立一个单文档程序,建立图形对象相关的基本图形类层次结构。在程序中增加图形变换菜单(各基本变换对应菜单项),图形的参数通过对话框提供(设计变换参数的对话框,如平移、旋转比例等),实现二维图形的变换。(提示:在各类中增加相应成员函数实现对象的几何变换;菜单选择变换弹出对应变换的参数对话框,对话框中提供参数后取出参数传递给图形对象,或基于鼠标交互通过调用图形变换成员函数实现对象的换)。
2)图形裁剪能用对话框或鼠标在视口中拖动形成矩裁剪窗,然后裁剪文档中已有的图形对象,显示本次裁剪结果。测试图形应包含直线段、多边形。
3.实验过程
3.1 创建基类
1. 创建CShape类,添加平移,旋转,缩放和剪切的虚函数,被所有图形类继承,序列化时通过向上转型和多态机制使用基类的方法绘制所有图形和执行相应操作,CShape类的定义如下:
class CShape : public CObject
{
DECLARE_SERIAL(CShape)//序列号
public:
//序列化
void Serialize(CArchive &ar);
//构造函数
CShape();
CShape(int w, int s, COLORREF c);
CShape(CShape &s);
/******************添加虚函数*********************/
//绘制
virtual void Draw(CDC *pDC);
//平移
virtual void Translate(int tx, int ty);
//缩放
virtual void Scale(int px,int py,float xr, float yr);
//旋转
virtual void Rotate(float angle, int xr, int yr);
//裁剪
virtual void Tailor(int cx1,int cy1,int cx2, int cy2);
//获取图形类型
virtual int getType();
virtual ~CShape();
protected:
int width;
int style;
COLORREF color;
int type;//图像类型
};
由于图形绘制过程中需要用到保存文件和打开保存文件的功能,因此在基类中需要添加序列化函数。
基类序列化函数的定义如下:
//序列化函数实现
void CShape::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
{
ar<