实验报告计算机图形学实验报告——C字曲线算法计算机图形学实验报告——C字曲线算法1)算法原理介绍实验环境:Microsoft Visual C++C字线算法原理:C曲线由控制多边形通过一系列割角变换生成,具有连续性。
C 曲线容易在计算机上快速产生, 用于计算机图形的实时处理。
实验中还应用了C 曲线的凸包性、保凸性、局部无依赖性等性质。
本实验程中GetMaxX()函数得到屏幕上的X方向上的最大值;GetMaxY()数得到屏幕上的Y方向上的最大值;c(n,300,150,MaxX-300,150)函数画出C字样图形。
2)程序设计文档说明一、课程设计目的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。
1.了解Visual C++ 2005绘图的基本概念2.了解Visual C++2005绘图环境3.了解Visual C++2005绘图环境4. 掌握用Visual C++ 2005绘图的基本命令二、课程设计内容仿照Windows的附件程序“画图”, 用C++语言编制一个具有交互式绘制和编辑多种图元功能的程序“C字曲线算法”,实现以下功能对应的设计内容:(1) 能够以交互方式在图形绘制区绘制直线(折线);(2)设置C字曲线的迭代次数,分析不同迭代次数的变化情况;(3)通过帮助文档了解和使用函数。
三、实验步骤1.新建MFC应用程序1.1新建工程。
运行VC++6.0,新建一个MFC AppWizard[exe]工程,并命名,选择保存路径,确定。
1.2选择应用程序的类型,选择“单文档”,则可以通过菜单打开对话框2.建立单文档应用程序,在其中调用对话框2.1 查看工程资源在单击完成之后,即建立了一个工程,在工程的左侧资源视图可以看到MFC向导为该程序提供的一些资源。
分别如下所示:3.运行程序可以得到如下图形界面:4、界面使用点击左上角中间图表会出现迭代次数选择,确定后即可。
3)核心程序源代码// TestView.cpp : implementation of the CTestView class//#include "stdafx.h"#include "Test.h"#include "TestDoc.h"#include "TestView.h"#include "InputDlg.h"#define ROUND(x) int(x+0.5)//四舍五入#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView) //{{AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUC, OnMenuc)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestView construction/destructionCTestView::CTestView(){// TODO: add construction code here}CTestView::~CTestView(){}BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CTestView drawingvoid CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CTestView printingBOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CTestView diagnostics#ifdef _DEBUGvoid CTestView::AssertValid() const{CView::AssertValid();}void CTestView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CTestDoc* CTestView::GetDocument() // non-debug version is inline {ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));return (CTestDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CTestView message handlersvoid CTestView::GetMaxX()//获得屏幕的最大x值函数{CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;}void CTestView::GetMaxY()//获得屏幕的最大y值函数{CRect Rect;GetClientRect(&Rect);MaxY=Rect.bottom;}void CTestView::c(int n,double x1,double y1,double x2,double y2)//C字函数{CClientDC dc(this);double x3,y3;x3=(x1+y1+x2-y2)/2;y3=(x2+y2+y1-x1)/2;if(n==0){dc.MoveTo(ROUND(x1),ROUND(y1));dc.LineTo(ROUND(x2),ROUND(y2));return;}c(n-1,x1,y1,x2,y2);c(n-1,x1,y1,x3,y3);c(n-1,x3,y3,x2,y2);}void CTestView::OnMenuc()//菜单函数{// TODO: Add your command handler code hereInputDlg dlg;if(dlg.DoModal()==IDOK){n=dlg.m_n;}RedrawWindow();AfxGetMainWnd()->SetWindowText("案例29:C字曲线");GetMaxX();GetMaxY();c(n,300,150,MaxX-300,150);}4)实验结果抓图迭代11次得到的C字样函数:5)实验收获实验心得及总结分析:通过上机编程实习同时查阅资料,我掌握了基本的图形软件开发技术。
在改变迭代次数时,迭代会从新在原来迭代的基础上进行增减或减少,当迭代次数增加时由于计算量的增加程序运行时间会加长,同时得到更加接近于“C”字样的图形。
我也学习到了在VC环境下的基本软件设计操作,以及直线,圆,椭圆的画法,怎样设置线宽,线型和颜色填充。
总的来说,就是要动手,只有自己动手了,书本上学的知识才能融会贯通,才能应用于实际。