计算机图形学实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);//调用

绘制递归圆的函数

}

//绘制递归圆

相关文档
最新文档