计算机图形学实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与通信工程学院
实验报告
课程计算机图形学
实验题目二维图形的绘制
学生姓名潘冰
学号3160602036
专业班级计算机1602
指导教师王新宇
日期2019.04.08
成绩评定表
实验一二维图形绘制
1.实验内容
1.1 绘制金刚石图案
金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。
请设计连线规则并编程实现。
图1金刚石图案示例
1.2 绘制魔术三角形
绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。
图2魔术三角形图案示例
1.3 绘制递归圆
应用递归的方法绘制如下所示的图案。
图3 递归圆图案示例
2.实验环境
软硬件运行环境:Windows 10
开发工具:Visual studio 2013
3.问题分析
3.1 绘制金刚石图案
把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,当n取偶数时,需要变化直线段起点位置。
n为偶数时,为避免直线段的重复连接,需设计一个二重循环:代表起点索引号的外层整型变量i从i=0循环到i=n-2(n-1次),代表终点索引号的内层整型变量j从j=i+1循环到j=n-1(n-i-1次)。以(Round(x[i]),Round(y[i]))为起点,以(Round(x[j]),Round(y[j]))为终点依次连接各线段形成金刚石图案。
n为奇数时,代表循环次数的整型变量i从0到n-1(n次),从当前起点(Round(x[(j - k) % nVertex]), Round(y[(j - k) % nVertex]))开始隔0个点画一条线,隔一个点画一条线,......,直至隔n/2-1个点画线为止。即可得到一笔画的金刚石图案。
3.2 绘制魔术三角形
用画刷绘制一个三角形区域,并对三个绘图区域进行颜色填充,构成魔术三角形。
3.3 绘制递归圆
确定内圆的中心点坐标和半径与其周围小圆的中心点坐标和半径,再根据递归的深度再算出递归后圆的半径,并计算出它们的圆中心点坐标。
4.算法设计
//DiamondView.h
class CDiamondView : public CView
{
……
public:
//参数输入和提示对话框
CDlgDiamond dlgDiamond;//金刚石绘制中的参数输入对话框
CDlgCircle dlgCircle;//递归圆绘制中的参数输入对话框
CDlgBezier dlgBezier;//Bezier曲线绘制中的参数输入对话框
CDlgB dlgB;//B样条曲线绘制中的参数输入对话框
CDlgHint dlgHint;//裁剪中的提示对话框
//用于裁剪时的裁剪窗口绘制的控制
BOOL IsCutting;
BOOL IsDrawing;
//裁剪窗口的左上角和右下角坐标
POINT RectP1;//左上角坐标
POINT RectP2;//右下角坐标
//绘图函数,需要实现
void DrawDiamond(int,int,int);//绘制金刚石
void DrawTriangle();//绘制魔术三角
void DrawRecursionCircle(int);//绘制递归圆
void Polaris();//北极星
void DrawBezier1(POINT p[4]);//已知点作为控制点绘制Bezier曲线
void DrawBezier2(POINT p[4]);//已知点作为曲线上的点绘制Bezier曲线
void DrawBCurve(POINT p[6]);//绘制B样条曲线
void Cut();//裁剪
……
};
//DiamondView.cpp
void CDiamondView::OnMenuDiamond()
{
IsCutting = FALSE;
if(dlgDiamond.DoModal()==IDOK)
DrawDiamond(dlgDiamond.m_nV ertex,dlgDiamond.
m_nRadius,100);//调用绘制金刚石的函数}
//绘制金刚石图案
//nV ertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间void CDiamondView::DrawDiamond(int nV ertex, int radius,int millisecond) {}
void CDiamondView::OnMenuTriangle()
{
IsCutting = FALSE;
DrawTriangle();//调用绘制魔术三角的函数
}
//绘制魔术三角
void CDiamondView::DrawTriangle()
{}
void CDiamondView::OnMenuCircle()
{
IsCutting = FALSE;
if(dlgCircle.DoModal()==IDOK)
DrawRecursionCircle(dlgCircle.m_nDepth);//调用
绘制递归圆的函数
}
//绘制递归圆