实验一 金刚石图案算法

合集下载

计算机图形学实验一报告

计算机图形学实验一报告

计算机图形学实验一报告————————————————————————————————作者:————————————————————————————————日期:ﻩ计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名学号专业班级指导教师日期成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总分指导教师签名二维图形的绘制1.实验内容(1)绘制金刚石图案金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。

当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。

请设计连线规则并编程实现。

(2)绘制魔术三角形绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。

(3)绘制递归圆应用递归的方法绘制如下所示的图案。

2.实验环境软硬件运行环境:Windows XP开发工具:visual studio 20083. 问题分析根据实验需求,需要在MFC环境中建立一个由“文件”、“绘图”和“帮助”这3个菜单项目组成的菜单,其中“文件”的子菜单为“退出”,完成退出应用程序的工作,“绘图”,的子菜单为“Diamond”,用于绘制金刚石图案等,“帮助”的子菜单为“关于”,用于显示开发人员信息;定义一个输人对话框类,提供个两个参数的输入界面。

最后在客户区输出图案。

1.金刚石图案:为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1。

以(p[i].x,p[i].y)为起点,以(p[j].x,p[j].y)为终点依次连接各线段形成金刚石图案。

计算机图形学实验报告绘制金刚石

计算机图形学实验报告绘制金刚石

《计算机图形学》实验报告1. 实验目的巩固对计算机图形学绘图基础知识,绘制金刚石图案2. 问题描述对题目分析,金刚石图案是由依次连接位于圆上的不同等分点的直线段构成,等分点越多,金刚石图案越复杂;要绘制一个半径300,20等分的金刚石图案;首先要设计金刚石图案的数学模型,然后定义画笔编程绘制图案;。

3. 算法的思想为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1.以(p[i].x,p[i].y)为起点,以(p[j].x,p[j].y)为终点依次连接各线段形成金刚石图案。

4.程序核心代码void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect rect;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));pOldPen=pDC->SelectObject(&NewPen);double thta;thta=2*PI/20;CPoint p[20];for(int i=0;i<20;i++){p[i].x=100*cos(i*thta);p[i].y=100*sin(i*thta);}for(i=0;i<=18;i++){for(int j=i+1;j<=19;j++){pDC->MoveTo(ROUND(p[i].x),ROUND(p[i].y));pDC->LineTo(ROUND(p[j].x),ROUND(p[j].y));}}pDC->SelectObject(pOldPen);NewPen.DeleteObject();ReleaseDC(pDC);}5.程序运行结果6.实验总结初次用C+ +绘图,看到是绘制金刚石,第一感觉是一定很复杂;其实不然,由于老师简化了实验题目要求,使我们的实验任务得以轻松了很多;但是好久没有动手编写代码了,感觉很多都忘记了,虽然这次的程序并不难,实验指导书上模型都已建好,但是实际操作还是有一些问题,有些错误改了很多次都总是没有结果,最后在同学的帮助下运行改错才得出结果;通过这次实验我了解到问题的难与易在于你是否动手实际操作了,有时看似简单永远不知道在哪个细节会出错!。

实验一:基本图形生成算法实验说明

实验一:基本图形生成算法实验说明

实验一基本图形生成一.实验学时4学时二.实验类型设计型实验三.实验目的和要求1、了解光栅化图形学的主要理论和知识。

2、了解VS的Windows窗口编程中几何图形的绘制调用接口。

3、掌握线段的生成算法原理和算法,掌握微分画线法、中点画线算法的原理,学会用C++程序进行算法的设计。

4、选作:掌握多边形填充算法的基本原理和方法,掌握有序边表法和扫描线种子填充算法的原理,采用C++进行算法的设计。

四、实验内容(一)完成一个图形生成算法的仿真环境,在一个窗口区域中画出坐标系和坐标网格,其中每个坐标网格模拟显示器上的一个像素点。

实验步骤如下:(1)在VS中打开实验的的工程。

(2)在工程中增加一个菜单项:打开linemenu.rc资源在下面增加一个多边形填充的选项。

操作界面图见图1所示。

图1 菜单资源图对新增的菜单选项设置ID值见图2所示。

图2 ID定义界面图(3)在resource.h文件中增加ID_FILL的定义图3 ID定义界面图(4)在circle.cpp文件中增加一个多边形填充的处理switch(message){case WM_COMMAND:hdc=GetDC(hwnd);if(LOWORD(wParam) == ID_BACK){hnewpen=CreatePen(PS_SOLID,1,RGB(0,255,255));holdpen=(HPEN)SelectObject(hdc,hnewpen);DrawBackground(hdc);hnewpen=CreatePen(PS_SOLID,2,RGB(0,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);DrawAB(hdc);}else if(LOWORD(wParam)==ID_MID){hnewpen=CreatePen(PS_SOLID,2,RGB(255,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);DDACircle(hdc,1,5,20,RGB(0,255,255));}else if(LOWORD(wParam) == ID_BRE){hnewpen=CreatePen(PS_SOLID,2,RGB(255,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);p[0].SetX(0);p[0].SetY(0);p[1].SetX(5);p[1].SetY(8);p[2].SetX(1);p[2].SetY(10);p[3].SetX(0);p[3].SetY(0);ScanFill(hdc,p,RGB(0,255,255));}SelectObject(hdc,holdpen);DeleteObject(hnewpen);ReleaseDC(hwnd,hdc);break;(二)设计微分画线算法和中点画线算法程序,并进行调试。

计算机图形学上机指导——金刚石图案算法实现说明(MFC)

计算机图形学上机指导——金刚石图案算法实现说明(MFC)

金刚石图案算法实现说明1、设计要求:总体需求:将半径为r的圆周n等分,用直线将各等分点作隔点相连,形成的图案称为“金刚石”图案。

具体要求:1、在MFC环境中建立一个由“文件”、“绘图”和“帮助”这3个菜单项组成的菜单。

“文件”的子菜单为“退出”;“绘图”的子菜单为“Diamond”;“帮组”的子菜单为“关于”。

2、定义一个输入对话框类,提供两个参数的输入界面。

3、在客户区显示金刚石图案。

实现效果图如图1-1所示:图1-1 输入对话框及效果图2、具体步骤:1、点的设计1)类视图“ClassV iew”里选中TestClasses后右击,选择“New Class”,打开“New Class”对话框。

2)在“Class type”中选择“Generic Class”,并在“Name”中输入类名“P2D”,然后单击“Ok”。

(到此,在文件视图的“source file”下VC向导自动添加了“P2D.h”和“P2D.cpp”)3)打开“P2D.h”,作类的初始化定义:添加两个公有数据成员x,y,数据类型均为doulbe。

(思考:为什么要设为公有数据成员?)4)完成P2D类的定义。

2、对话框的设计1)在资源视图“Resource View”中选择“Dialog”,并右击,选择“Insert Dialog”。

2)在新建对话框内添加静态文本(static text)和编辑框(Edit Box)控件。

3)属性打开(Alt+Enter)。

Edit1控件的ID为IDC_EDIT1,并设置取值范围:5~50;Edit1控件的ID为IDC_EDIT2,并设置取值范围:200~500;4)双击对话框弹出“Adding a Class”对话框,保持默认值,添加一个新类“Create a new class”,单击“Ok”。

5)在弹出的“New class”对话框中填写对话框类名“InputDlg”,单击“Ok”。

(基类是MFC中的CDialog)6)对话框的设计。

实验1 金刚石图案算法

实验1  金刚石图案算法

实验1 金刚石图案算法一、实验目的在圆的基础上绘制金刚石图案。

金刚石图案是一个二维图案,仅使用二维坐标(x,y)就可以绘制:利用数学函数sin()及cos()函数计算点坐标,利用MoveTo()及LineTo ()函数将顶点连接起来,验证算法的正确性,并修改程序,加深对VC++绘图的理解。

二、实验任务将半径为r的圆周n等份,然后用直线将各等分点两两相连,形成的图案称为“金刚石”图案,并编程实现。

三、实验内容1.建立工程----“TestDiamond”。

2. 编写Diamond()函数:(1)指定n、及r的值;(2)根据等分点数,计算金刚石图案的等分角“theta”,theta=2*PI/n;(3)将等分点坐标存储在数组中;(4)设计二重循环,将各等分点两两相连。

3.OnDraw()中调用Diamond()函数。

4.注意:(1)用到sin()等数学函数,所以在CtestDiamondView.cpp中添加“#include "math.h"”语句;(2)为了简单起见(没有使用面向对象的方法定义“点”类,没有使用动态内存分配),初始化存储点坐标的数组x[]和y[]为固定大小,即x[i]和y[i]共同表示第i个点的x和y坐标。

5.代码(1)Diamond()函数void CTestDiamondView::Diamond(CDC *pDC, int n, double r){//n为等分点的个数,r为圆的半径double Theta;//thta为圆的等分角double PI=3.1415926;double x[40];double y[40];int MaxX=700;int MaxY=700;//圆心设定为(350 ,350)Theta=2*PI/n;for(int i=0;i<n;i++) //等分圆{x[i]=r*cos(i*Theta)+MaxX/2;y[i]=r*sin(i*Theta)+MaxY/2;}for(i=0;i<=n-2;i++) //二次循环,点点连接{for(int j=i+1;j<=n-1;j++){pDC->MoveTo(int(x[i]),int(y[i]));pDC->LineTo(int(x[j]),int(y[j]));}}}(2)OnDraw()函数void CTestDiamondView::OnDraw(CDC* pDC){CTestDiamondDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCPen PenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔pDC->SelectObject(&PenBlue);Diamond(pDC,31, 300 );}。

金刚石人工合成PPT课件

金刚石人工合成PPT课件

三、金刚石人工合成
1.1 高温高压(HTHP)法 高温高压法泛指温度超过1500℃,压强超过109Pa 的
条件下制备金刚石的方法,国外一般称作温度梯度法 ,国内称作温度差法,简称HTHP。1967年,美国通 用公司(GE)研究小组首次提出HTHP法,经过几年 的研究工作,在1971年时,合成出世界上首颗5mm( 约1克拉)单晶金刚石(Ib型),其颜色为黄色,整个 生长过程中晶体的平均生长速率大约为2.5 mg/h,随 后,又研究并制备出了无色(IIa型)和蓝色(IIb型) 大单晶金刚石。但是,这并没有实现大批量的生产, 首先是由于实验设备较大,其次要想长出再现性比较 好的单晶所花费的成本是比较巨大的。
三、金刚石人工合成
由于金刚石具有上述优异性能和用途,加之在自然界 中储量极少,开采极为困难,从古到今,金刚石一直被称 为“贵族材料”。人们很早就尝试以人工合成来补充 天然储量的不足。
• 自从1796年发现金刚石是由纯碳元素组成的晶体后,人 类在人工合成金刚石方面才开始了有目标的漫长而艰 苦的探索。但直到20世纪中叶,由Simon和Berman通过 实验和推测获得了石墨-金刚石平衡相图,才使人工合 成成为可能。
三、金刚石人工合成
燃烧火焰法
燃烧火焰也是一种等离子体,其也有两种形式的装置:一种 通常是用于开放式的火焰;另一种适用于腔体的火焰,其电子密 度在106~108 cm-3;电子能量在0.05~1 eV 范围内。火焰法采 用本生式燃烧,即在碳源气体中预先混合氧气,再进行扩散燃 烧。只要氧气适量,就能形成由焰心、内焰(还原焰)、外焰 (氧化焰)构成的本生火焰。这样,选用适当的材料作为基板 ,将基板设置在内焰中,并保持一定的温度,内焰等离子体中 形成的部分碳的游离基团(如C2等)就可以在基板上生长出金 刚石。虽然燃烧火焰法不适宜外延高品质、大尺寸的单晶金刚 石膜,但作为一种研究手段,还是简捷易行的。

石墨转化为金刚石的压力条件计算过程

石墨转化为金刚石的压力条件计算过程

石墨转化为金刚石的压力条件计算过程首先呢,我们得知道一些基本的物理知识。

石墨和金刚石都是由碳元素组成的,但是它们的结构不一样哦。

这就像同样是积木搭起来的东西,一个是松散的,一个是超级紧密的。

那从石墨变成金刚石,需要很大的压力改变它的结构。

在计算这个压力条件的时候,我们要考虑到很多因素。

比如说碳原子之间的距离还有它们相互作用力啥的。

我觉得这部分虽然理论性强了点,但真的很关键哦!
然后呢,我们大概要用到一些物理公式。

这里我就不把那些公式写得特别详细啦,毕竟大家要是有兴趣可以自己去查嘛。

不过呢,一般就是关于物质结构和力的那些公式。

按照我的经验,在找合适公式这一步上,可以多参考几本权威的物理书籍或者在网上搜搜看不同的讲解,这样能加深理解。

接下来,就是代入数据啦。

这时候你可能会问,数据从哪里来呢?哈有些数据是通过实验得到的,有些呢是已经被科学家们研究出来的常量。

这一步可得小心点哦!千万不能把数据代错了,不然整个计算就全错啦。

计算的过程中,可能会遇到一些小困难。

比如说计算结果看起来不太对,或者中间某个步骤算着算着就糊涂了。

这时候呢,别着急!我刚开始算的时候也经常这样。

你可以回头检查一下前面的数据代入有没有问题,或者重新审视一下自己用的公式对不对。

绘制金刚石图案pdf

绘制金刚石图案pdf

知识要点自定义二维坐标系。

二维点类的定义方法。

对话框的创建及调用方法。

金刚石图案算法。

一维堆内存的分配与释放。

设计个性化的菜单项与工具栏。

创建Test工程模板。

一、案例需求1.案例描述将半径为r的圆周n等份,然后用直线段将每一个等分点和其他所有等分点连接,形成的图案称为金刚石图案。

使用对话框读入等分点个数与圆的半径,以屏幕客户区中心为圆心,请使用MFC的基本绘图函数绘制蓝色直线段构成的金刚石图案。

2.功能说明(1)程序运行界面提供“文件”、“图形”和“帮助”3个弹出菜单项。

“文件”菜单项提供“退出”子菜单,用于退出工程;“图形”菜单项提供“绘图”子菜单,用于绘制金刚石图案;“帮助”菜单项提供“关于”子菜单,用于显示开发信息。

(2)工具栏提供与子菜单项“退出”、“绘图”、“关于”相对应的图标按钮。

(3)单击“绘图”子菜单或“绘图”图标按钮,弹出图1-1(a)所示的输入对话框,读入圆的等分点个数和圆的半径,单击输入对话框的OK按钮绘制金刚石图案。

(4)自定义屏幕二维坐标系,原点位于客户区中心,x轴水平向右为正,y轴垂直向上为正。

以二维坐标系原点为圆心绘制半径为r的圆,将圆的n等分点使用直线段彼此连接形成金刚石图案,如图1-1(b)所示。

3.案例效果图案例的输入对话框和绘制效果如图1-1所示。

(a)输入对话框(b)金刚石图案图1-1输入对话框及效果图二、案例分析本案例设计的目的是使用Visual C++的MFC开发平台来建立一个Test工程,为后续的案例设计提供一个通用的工程模板。

Test工程包含了菜单设计、工具栏图标按钮设计、输入对话框设计和关于对话框设计等任务。

在建立Test工程模板的基础上,本案例以绘制金刚石图案为例,讲解二维点类CP2的设计方法和CTestView类的修改方法。

1.菜单和工具栏按钮根据案例的功能要求,需要在MFC环境中建立一个由“文件”、“图形”和“帮助”3个菜单项组成的弹出菜单,其中“文件”菜单项的子菜单为“退出”,用于退出Test工程,如图1-2所示;“图形”菜单项的子菜单为“绘图”,用于调用输入对话框绘制金刚石图案,如图1-3所示;“帮助”菜单项的子菜单为“关于”,用于显示开发人员信息,如图1-4所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
n = dlg.m_n;
r = dlg.m_r;
}
else
{
return;
}
RedrawWindow();
p = new CP2[n];
Diamond();
delete []p;
}
CRect Rect;
GetClientRect(&Rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(Rect.Width(),Rect.Height());
pDC->SetViewportExt(Rect.Width(),-Rect.Height());








1程序开始运行界面:
2点击绘图按钮开始绘图:
3金刚石图案界面:


通过对金刚石图案算法的学习,我理解、领会了一维动态数组内存的分配和释放方法,逐渐了解了MFC的神奇之处。
懂得算法和能够实现它是两码事。尤其是对于MFC来说,某一个算法你很了解,但是到了真正去实现的时候就会发现很多的困难,出现一大堆的错误。因此,只有真正的去实现了才算懂了这个算法。
pOldPen=pDC->SelectObject(&NewPen);
double Alpha,Theta;
Theta=2*PI/n;
Alpha=PI/2-Theta;
for(int i=0;i<].x = r*cos(i*Theta + Alpha);
p[i].y = r*sin(i*Theta + Alpha);
2)根据等分点的个数计算金刚石图案的等分角
3)计算金刚石图案的起始角
4)将圆等分后的顶点坐标存储与数组P中;
5)设计一个二重循环,代表起点的外层整型变量i从i= 0循环到i= n-2,代表终点的内层整型变量j从j=i+1循环到j=n-1.以p[i]为起点,以p[j]为终点连接各线段构成金刚石图案。

//////////////////////////////////////////////////////////////////////
CP2::CP2()
{
x = 0;
y = 0;
}
CP2::~CP2()
{
}
函数Diamond()的实现
void textView::Diamond()
{
CDC *pDC=GetDC();
pDC->SetViewportOrg(Rect.Width()/2,Rect.Height()/2);
Rect.OffsetRect(-Rect.Width()/2,-Rect.Height()/2);
CPen NewPen,*pOldPen;
NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
}
for(i = 0;i <= n - 2;i++)
{
for(int j = i + 1;j <= n - 1;j++)
{
pDC->MoveTo(Round(p[i].x),Round(p[i].y));
pDC->LineTo(Round(p[j].x),Round(p[j].y));
}
}
pDC->SelectObject(pOldPen);


程序核心代码如下所示:
二维点类CP2
P2.h
// P2.h: interface for the CP2 class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_P2_H__3A3FB2AE_1A86_441C_B418_E6BD1A317145__INCLUDED_)
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "122055141.h"
#include "P2.h"
#ifdef _DEBUG
#undef THIS_FILE
课程名称
计算机图形学
班级
实验日期
姓 名
学号
实验成绩
实验名称
实验一 金刚石图案算法







通过对MFC的学习,学会自定义二维坐标系、二维点类的定义、工程模板的建立、对话框的创建、自定义菜单和工具栏、调试方法、理解金刚石图案的算法。




VC++ 6.0




1)自定义二维坐标系;
2)二维点类的定义方法;
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
NewPen.DeleteObject();
ReleaseDC(pDC);
}
函数OnDrawpic()的实现
void textView::OnDrawpic()
{
// TODO: Add your command handler code here
CInputDlg dlg;
if(IDOK == dlg.DoModal())
#define AFX_P2_H__3A3FB2AE_1A86_441C_B418_E6BD1A317145__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CP2
{
public:
CP2();
virtual ~CP2();
public:
double x;
double y;
};
#endif // !defined(AFX_P2_H__3A3FB2AE_1A86_441C_B418_E6BD1A317145__INCLUDED_)
P2.cpp
// P2.cpp: implementation of the CP2 class.
3)对话框的创建和调试方法;
4)金刚石图案算法;
5)一维堆内存的分配与释放;
6)设计个性化的菜单项与工具栏;
7)对程序进行改善,使其更加完美。









1菜单和工具按钮的设计
删除多余的菜单按钮,只保留三个即可,如下图所示:
2关于对话框的设计
4输入对话框的设计
5金刚石图案算法:
1) 读入圆的等分点个数n与圆的半径r;
相关文档
最新文档