计算机图形学中点画圆实验
计算机图形学--圆的生成算法的实现
三、实验结果分析 1、显示圆上的 8 个对称点的算法如下:
void CirclePoints(int x,int y,int color) {
putpixel(x,y,color); putpixel(y,x,color); putpixel(-x,y,color); putpixel(y,-x,color); putpixel(x,-y,color); putpixel(-y,x,color); putpixel(-x,-y,color); putpixel(-y,-x,color); }
2 ) 7+ 3 2 7( 2 1)
5=2R-3R/
2
5(2R-3R/ 2 )/(R/ 2 ) 4.8
通过实际的程序运行进行比较,结论是中点画圆法速度比较快, 就算法本身而言,该算法仍可以在某些方面进行改进,如其中的浮点 运算改为整数运算等,执行速度将更快。生成直线和圆这类基础算法 在编程时要被无数次的调用,可能每生成一帧画面就要被调用成百上 千次,因此其执行速度是至关重要的。而这类基础算法的长度都很短, 即使多用一些分支,多用一些变量和语句,一般来说只不过是增加几 十个语句,这样的空间增加与算法极其重要的速度来比较是相对次要 的因素。因此在开发图形学的基础算法时,如果有可能提高算法的速 度,应不惜多占用一些存储空间。
2
{ int i,j; for(i=-n/2;i<=n/2;i++) for(j=-n/2;j<=n/2;j++) putpixel(x+j,y+i,color);
} void putpixelt(int x,int y,int color,int i) {int a[8]={1,1,1,1,0,0,0,0}; if(a[i%8])putpixel(x,y,color); } void EllipsePoints(int x,int y,int color) { putpixel(xo+x,yo+y,color);
计算机图形学实验报告-中点画圆算法
pDC->SetPixel((xc+x),(yc-y),c);
pDC->SetPixel((xc-x),(yc-y),c);
pDC->SetPixel((xc+y),(yc+x),c);
pDC->SetPixel((xc-y),(yc+x),c);
通过上机实践,更好地掌握中点画圆算法
实验仪器:
PC机、VC6.0
实验步骤、内容:
菜单
消息响应函数:
void CDrawCircleView::OnMidPoint()
{
CDC *pDC=GetDC();
int xc=200,yc=300,r=50,c=0;
int x,y; float d;
x=0;y=r;d=1.25-r;
pDC->SetPixel((xc+x),(yc+y),c);
pDC->SetPixel((xc-x),(yc+y),c);
pDC->SetPixel((xc+x),(yc-y),c);
pDC->SetPixel((xc-x),(yc-y),c);
pDC->SetPixel((xc+y),(yc+x),c);
pDC->SetPixel((xc-y),(yc+x),c);
pDC->SetPixel((xc+y),(yc-x),c);
pDC->SetPixel((xc-y),(yc-x),c);
while(x<=y)
{
if(d<0)
计算机图形学-设计算法绘制直线与圆
信息与计算科学专业基础课ComputerReport Of course 计算机图形学课程实验报告实验题目设计算法绘制直线与圆班级姓名学号指导教师日期实验说明 试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。
试验地点: 教九楼401 数学系机房实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。
实验内容实验题一实验题目1).用DDA 法在屏幕上画一条具有三个像素宽的直线段L1。
要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。
2).将课堂所讲的斜率0<K<1的中点画线算法推广到斜率K>1、-1<K<0和K<-1的情况,编写一通用的中点画线算法。
实验目的和意义1.了解如何利用C 语言和图形函数进行绘图;2. 熟悉并掌握C 语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3. 通过对Turbo C 进行图形程序设计的基本方法的学习,能绘制出简单的图形;4. 熟悉并掌握DDA 法在屏幕上画一条具有三个像素宽的直线段L1以及通用的中点画线算法。
通过DDA 法及用的中点画线算法,了解图形系统初始化、图形系统关闭和图设计算法绘制直线与圆实验2形模式的控制,并熟练运用图形坐标的设置,包括定点、读取光标以及图形颜色的设置。
程序制作步骤(包括算法思想、算法流程图等)1.自动搜索显示器类型和显示模式,初始化图形系统,通过printf 、scanf 语句控制线段的端点坐标和画线颜色的自由输入;2. DDAline:设直线之起点为(x1,y1),终点为(x2,y2),则斜率k 为: 则有:⑴.可通过计算由x 方向的增量x ∆引起y 的改变生成直线。
图形学实验报告-Bresenham算法画圆
计算机图形学实验报告姓名:张晓波学号:090081322010 年10月实验1 实用OpenGL 绘制二维图形实验目的1.进一步了解OpenGL程序的框架。
2.掌握利用OpenGL绘制简单视图的方法。
3.利用OpenGL中的Bresenham算法直接利用像素点绘制图形。
实验要求1.明确实验目的,按实验内容及基本步骤完成实验。
2.在实验过程中,结合思考与探究中的问题,通过实验进行理解。
3.理解并掌握本实验的内容。
实验内容及基本步骤1.绘制圆形分析:利用Bresenham算法,可以在自定了第一个点之后算出下一个点的位置,由于要保证斜率小于1,而且只在一个象限内绘制,所以找出的只是1/8圆弧,因此在找点的时候,利用对称性,同时找到8个点,进行绘制。
void Circle(int r){int x=0,y=r; //初始点int d=0; //声明决策变量d=3-2*r;while(x<=y){CircleVertex(x,y);//画圆上点FillCircle(x,y); //选取对应点,用矩形填充if(d<0)d=d+4*x+6;else{d=d+4*(x-y)+10;y --;}x++;}}void CircleVertex(int x, int y){glBegin(GL_POINTS);glVertex2f( x, y);//右上角glVertex2f(- x, y);//左上角glVertex2f( x,- y);//右下角glVertex2f(- x,- y);//左下角//上下侧四个点glVertex2f( y, x);//右上角glVertex2f(- y, x);//左上角glVertex2f( y,- x);//右下角glVertex2f(- y,- x);//左下角//左右侧四个点glEnd();}试验结果如下:2.填充圆形分析:在一次寻找确定出8个点之后,可以将其上下两端的点作为一组,左右两端的点作为一组分别绘制实心四边形。
计算机图形学课内实验
《计算机图形学课内实验》实验报告班级:计算机91姓名:程战战学号:2009055006日期:2012/11/7一、实验目的及要求基本掌握中点圆算法的编程实现。
二、实验环境Windows7 OS、VS编程环境三、实验内容输入任一点作为圆心坐标,并输入一个任意的半径,从而画出相应圆,并且对非法输入能够检测。
四、数据结构和算法描述1.数据结构:设要显示圆的圆心在原点(0,0),半径为R,起点在(0,R)处,终点在(,)处,顺时针生成八分之一圆,利用对称性扫描转换全部圆。
为了应用中点画圆法,我们定义一个圆函数F(x,y)=x2+y2-R2任何点(x,y)的相对位置可由圆函数的符号来检测:F(x,y) <0点(x,y)位于数学圆内=0点(x,y)位于数学圆上>0点(x,y)位于数学圆外如下图所示,图中有两条圆弧A和B,假定当前取点为Pi(xi,yi),如果顺时针生成圆,那么下一点只能取正右方的点E(xi+1,yi)或右下方的点SE(xi+1,yi-1)两者之一。
假设M是E和SE的中点,即,则:1、当F(M)<0时,M在圆内(圆弧A),这说明点E距离圆更近,应取点E作为下一象素点;2、当F(M)>0时,M在圆外(圆弧B),表明SE点离圆更近,应取SE点;3、当F(M)=0时,在E点与SE点之中随便取一个即可,我们约定取SE点。
2.中点圆算法思想如下:我们用中点M的圆函数作为决策变量di,同时用增量法来迭代计算下一个中点M的决策变量di+1。
(2-21) 下面分两种情况来讨论在迭代计算中决策变量di+1的推导。
1、见图(a),若di<0,则选择E点,接着下一个中点就是,这时新的决策变量为:(2-22)(a)(d i<0) 中点画线算法式(2-22)减去(2-21)得:d i+1=d i+2x i+3 (2-23)2、见图(b),若di≥0,则选择SE点,接着下一个中点就是,这时新的决策变量为:(2-24)(b)(d i≥0) 中点画线算法式(2-24)减去(2-21)得:d i+1=d i+2(x i-y i)+5 (2-25)我们利用递推迭代计算这八分之一圆弧上的每个点,每次迭代需要两步处理:(1)用前一次迭代算出的决策变量的符号来决定本次选择的点。
计算机图形学课程设计实验报告
《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham算法实验3:椭圆中点Bresenham算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
计算机图形学(中点画圆)
putpixel(xc-y,yc-x,color);
}
int main()
{
int gdriver = DETECT,gmode;
initgraph(&gdriver,&gmode,"");
MidpointCircle(3到判别式中,通过判断得到点的位置(仅有两种情况)。圆有很好的对称性,八对称性(其实是n对称性),只要求出右上方的八分之一部分就可以得到整个圆弧上的坐标,显然,判别式值小于0,中点在圆内,取正右方的点,d+2x+3;判别式大于等于0,中点在圆外或圆上,取右下方的点,d+2(x-y)+5; d的初值,将(1,R-0.5)代入判别式,=1.25 - R。为了提高效率,我们转化为整数运算,e = d - 0.25 = 1 - R。x++ 直到 x>y。
3、中点画圆法是利用圆心在坐标原点(0,0),半径为R(圆的方程X^2+Y^2=R^2),将每个像素的中点坐标代入圆的方程得到d,再通过d的值来确定中点与圆的位置。
中点画圆法绘出的只是一个完整圆弧的八分之一,然后根据圆良好的对称性,绘出和参考点对称的另外七个点,再用中点画圆法,以生成的这几个点为基础,绘出其它七段圆弧,构成一个完整的园。这七个点的坐标分别为:(x0+x,y0-y,c),(x0+x,y0+y,c),(x0-x,y0-y,c),(x0-x,y0+y,c),(x0-y,y0-x,c),(x0-y,y0+x,c),(x0+y,y0+x,c),(x0+y,y0-x,c)。
getch ();
计算机图形学圆的生成算法的实现
}
ReleaseDC(pDC>。
}
四、实验结果分析
调试是程序成功后,运行结果如下:中点算法生成的圆<蓝色圆弧)如图3-2,Bresenham算法生成的圆<黑色圆弧)如图3-3,中点算法生成的椭圆如图3-4。xHAQX74J0X
图3-2 中点法画圆效果图
pDC->SetPixel(-y+x0,-x+y0,c>。
pDC->SetPixel(y+x0,-x+y0,c>。
}
ReleaseDC(pDC>。
}
中点算法画椭圆。设中心在 ,长半轴为 ,短半轴为 。其VC程序设计代码如下:
void CMyView::OnMidpointellispe(>
{
CDC *pDC=GetDC(>。
pDC->SetPixel(y+x0,x+y0,color>。
pDC->SetPixel(-y+x0,x+y0,color>。
pDC->SetPixel(-y+x0,-x+y0,color>。
pDC->SetPixel(y+x0,-x+y0,color>。
}
ReleaseDC(pDC>。
}
Bresenham算法画圆。利用Bresenham画圆算法画出圆心在 、半径为R的圆,其VC程序设计代码如下:jLBHrnAILg
实验三圆的生成算法的实现
班级 08信计2班 学号20080502054姓名曲凯歌分数
计算机图形学圆弧生成算法具体程序实现
e=1-r;
this->CirclePoints(x,y,color,pDC);
while(x<=y)
{
if(e<0)
{
e+=2*x+3;
}
else
{
e+=2*(x-y)+5;
y--;
}
x++;
this->CirclePoints(x,y,color,pDC);
}
}
实验结果:
六:椭圆的绘制
(1):基本原理
while(dx<dy)
{
x++;
dx+=twobb;
if(d<0)
{
d+=bb+dx;
}
else
{
dy-=twoaa;
d+=bb+dx-dy;
y--;
}
pDC->SetPixel(xc+x,yc+y,color);
pDC->SetPixel(xc+x,yc-y,color);
pDC->SetPixel(xc-x,yc+y,color);
d =F(1,b-0.5)= b + a (b-0.5) -a b
= b + a (-b+0.25)
其中,每一步的迭代过程中需要随时的计算和比较从上部分转入下部分的条件是否成立,从而将逼近方向由x改为y。
2.代码实现及结果:
#include "math.h"
class CCircle
{
protected:
}
计算机图形学实验 圆的生成算法实现
实验三圆的生成算法实现班级 08信计学号 80姓名分数一、实验目的和要求:1、理解圆生成的基本原理2、掌握几种常见的圆的生成算法3、实现圆生成的函数,参数,中点画圆的算法….二、实验内容:1.利用生成圆弧的函数算法在屏幕上生成圆弧2.利用生成圆弧参数算法在屏幕上生成圆弧3.利用圆的中点算法在屏幕上生成圆弧4.比较三种算法的优缺点(1)实验代码:#include "Conio.h"#include "graphics.h"#define closegr closegraph#include "math.h"#define pie 3.1415926void initgr(void) /* BGI初始化 */{int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */initgraph(&gd, &gm, "");}void CirclePoints(int x,int y,int t,int s,int color){putpixel(t+x,s+y,color);putpixel(s+y,t+x,color);putpixel(s-y,t+x,color);putpixel(t-x,s+y,color);putpixel(s+y,t-x,color);putpixel(t+x,s-y,color);putpixel(t-x,s-y,color);putpixel(s-y,t-x,color);}void EllipsePoints(int x,int y,int t,int s,int color){putpixel(t+x,s+y,color);putpixel(t-x,s+y,color);putpixel(t+x,s-y,color);putpixel(t-x,s-y,color);}/*-----------------------------开平方法生成圆-----------------------------*/ void sqrtCircle(int radius,int color){float x,y;x=0;y=radius;CirclePoints(x,y,100,100,color);while(y>=x){x++;y=sqrt(radius*radius-x*x);CirclePoints((int)(x+0.5),(int)(y+0.5),100,100,color);}outtextxy(50,170,"sqrtCircle");}/*----------------------------参数法生成圆---------------------------------*/ void funCircle(int radius,int color){float x,y,afla;x=radius;y=0;afla=0;CirclePoints(x,y,200,200,color);while (afla<=pie/4){afla+=pie/400;x=radius*cos(afla);y=radius*sin(afla);CirclePoints((int)(x+0.5),(int)(y+0.5),200,200,color);outtextxy(100,250,"funCircle");}}/*----------------------------Bresenham算法生成圆-----------------------------*/BresenhamCircle(int R,int color){int x,y,dD,dHD,dDV,next;x=0;y=R;dD=2*(1-R);while(y>=0){CirclePoints(x,y,300,300,color);if(dD<0){dHD=2*(dD+y)-1;if(dHD<=0) next=0;else next=1;}else if(dD>0){dDV=2*(dD-x)-1;if(dDV<=0) next=1;else next=2;}else next=1;switch(next){case 0:x++;dD+=2*x+1;break;case 1:x++;y--;dD+=2*(x-y+1);break;case 2:y--;dD+=-2*y+1;break;} /*switch*/} /*while*/outtextxy(150,350,"BresenhamCircle");}/*----------------------------中点算法生成圆--------------------------------*/ void MidPointCircle(int radius,int color){int x,y,d,deltaE,deltaSE;x=0;y=radius;d=5-4*radius;deltaE=12;deltaSE=20-8*radius;CirclePoints(x,y,400,400,color);while(y>x){if(d<=0){d+=deltaE;deltaSE+=8;}else{d+=deltaSE;deltaSE+=16;y--;}deltaE+=8;x++;CirclePoints(x,y,400,400,color);}outtextxy(250,450,"MidPointCircle");}/*---------------------------开平方法生成椭圆---------------------------------*/void sqrtEllipse(int a,int b,int color){float x,y;x=0;y=b;EllipsePoints(x,y,300,100,color);while(x<a){x++;y=sqrt(b*b-(x*x*b*b)/(a*a));EllipsePoints((int)(x+0.5),(int)(y+0.5),300,100,color);}outtextxy(350,100,"sqrtEllipse");}/*---------------------------参数法生成椭圆-----------------------------------*/void funEllipse(int a,int b,int color){float x,y,afla;x=a;y=0;afla=0;EllipsePoints(x,y,400,200,color);while(afla<=pie/2){afla+=pie/400;x=a*cos(afla);y=b*sin(afla);EllipsePoints((int)(x+0.5),(int)(y+0.5),400,200,color);}outtextxy(450,200,"funEllipse");}/*---------------------------中点算法生成椭圆---------------------------------*/void MidPointEllipse(double a,double b,int color){double x,y,d,xP,yP,squarea,squareb;squarea=a*a;squareb=b*b;xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb)));yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb)));x=0;y=b;d=4*(squareb-squarea*b)+squarea;EllipsePoints(x,y,500,300,color);while(x<=xP){if(d<=0) d+=4*squareb*(2*x+3);else{d+=4*squareb*(2*x+3)-8*squarea*(y-1);y--;}x++;EllipsePoints(x,y,500,300,color);}x=a;y=0;d=4*(squarea-a*squareb)+squareb;EllipsePoints(x,y,500,300,color) ;while(y<yP){if(d<=0) d+=4*squarea*(2*y+3);else{d+=4*squarea*(2*y+3)-8*squareb*(x-1);x--;}y++;EllipsePoints(x,y,500,300,color);}outtextxy(480,380,"MidPointsEllipse");}int main(void){initgr(); /* BGI初始化 *//*****此部分添加你自己的代码,例如line(25, 25, 220, 220);circle(100, 100, 50);等等*****/sqrtCircle(50,105);funCircle(50,5);BresenhamCircle(50,35);MidPointCircle(50,255);sqrtEllipse(50,80,220);funEllipse(50,80,180);MidPointEllipse(50,80,150);getch(); /* 暂停一下,看看前面绘图代码的运行结果 */ closegr(); /* 恢复TEXT屏幕模式 */return 0;}(2)实验结果:三、实验结果分析. 1、该程序实现了三种算法的圆的绘制2、三种算法很好的实现了圆的生成3、中点算法生成圆优于其他两种算法。
计算机图形学作业-给定圆心,半径,弧度和起始点绘制圆弧分解
如果di<0,说明M在圆内,下一点取(xi,yi-1) 即xi+1=xi, yi+1=yi-1, 新的判别式为
di 1 F ( xi 0.5 xc , yi 2 yc ) di 2 yi 2 yc 3
如果di>=0,说明M在圆外或圆上,下一点取(xi-1,yi-1) 即xi+1=xi-1, yi+1=yi-1 新的判别式为
hi 1 di 2xi 2xc 2 yi 2 yc 5
• void MidPointCircle(int x0,int y0,int xc,int yc,int R,int color) • { • int x,y,h; • x=x0; • y=y0; • d=x*x+xc*xc-2x*xc+2x-2xc+y*y+yc*yc-y+yc-2*y*yc-R*R+1; • CirclePoint(x,y,color); • while(L(x,y)>1&&y>yc) // L(x,y)当前点到终点的距离 • { • if(h<0) h+=2*x-2xc+3; • else • { • h+=2*x-2xc-2*y+2*yc+5;
2 2
为了消除在计算判别式初始值产生的浮点数运算,将用 4d来代替d。
下述程序使用中点画圆算法绘制一个1/8圆弧。
void MidPointCircle(int r,int color) { int x,y,d x=0; y=r; d=5-4r; CirclePoint(x,y,color); while(x<=y) { if(d<=0) d+=8x+12; else { d+=8(x-y)+20;y--; } x++; CirclePoint(x,y,color); } }
计算机图形学实验 光栅 中点画圆
}
MidPointCircle部分
void CCGView::MidPointCircle(int r,COLORREF color)
{
int x,y;
int e;
x=0;y=r;e=1-r;
CirclePoints(x,y,color);
3、思考能否像实验五那样,做出一个菜单来实现画圆?
三、实验设备:
微机,Visual C++6.0
四、
1、打开VC,打开原来建立的工程CG。文件名应该为cg.dsw。
2、在CGView.cpp文件中(类CCGView中),添加函数voidMidPointCircle(int r, COLORREF color)和voidCirclePoints(int x, int y, COLORREF color)。方法如下:在VC界面的ClassView中,右键单击CCGView类,出现图1所示的界面,点击“Add Member Function…”菜单,出现图2的对话框,在其中分别完成对函数MidPointCircle和CirclePoints的定义和声明。
图1
图2
3、在函数体voidMidPointCircle(int r, COLORREF color)和voidCirclePoints(int x, int y, COLORREF color)中,实现中点画圆的算法。具体代码参考教材P34和P36。需要注意的是,CirclePoints函数中调用Setpixel函数之前需要得到设备上下文,即在函数体前部加入如下代码:
这样圆就可以画出。
2、如果不打开cg.dsw文件而是打开ccgview.cpp文件进行编程,会造成什么后果?
计算机图形学实验报告模板圆的扫描转换
北京联合大学应用文理学院实验报告课程名称计算机图形学实验(实训)名称圆的扫描转换班级信息与计算科学2009级姓名学号同组者实验(实训)日期完成日期本实验(实训)所用学时统计预习实验(实训)报告总计评阅意见:成绩北京联合大学应用文理学院实验报告一、实验目的1、掌握用中点画圆法进行圆的扫描转换方法;2、掌握用Bresenham画圆法进行圆的扫描转换方法;3、理解中点画圆法与Bresenham画圆法的区别;二、算法原理介绍1、中点画圆算法假设x坐标为xp的各像素点中,与该圆弧最近者已确定,为P(xp,yp),那么,下一个与圆弧最近的像素只能是正右方的P1(xp+1,yp),或右下方的P2(xp+1,yp-1)两者之一。
令M为P1和P2的中点,易知M的坐标为(xp+1,yp-0.5)。
显然,若M在圆内,则P1离圆弧近,应取为下一个像素;否则应取P2。
判别式d:d = F(M)=F(xp+1,yp-0.5)=(xp+1)^2+(yp-0.5)^2-R^2d的初始值为:d0 = F(1,R-0.5)=1+(R-0.5)^2-R^2=1.25-R在d≥0的情况下,取右下方像素P2,d = F(xp+2,yp-1.5)=(xp+2)^2+(yp-1.5)^2-R^2=d+2(xp-yp)+5在d<0的情况下,取正右方像素P1,d = F(xp+2,yp-0.5)=(xp+2)^2+(yp-0.5)^2-R^2=d+2xp+32、 Bresenham画圆算法假设生成圆心在坐标原点,半径为r,从x=0到x=y的1/8圆弧。
xi+1=xi +1相应的y则在两种可能中选择:y=yi,或者y=yi-1选择的原则是考察理想的y值是靠近yi还是靠近yi-1判别式:d i+1=2(xi+1)2+yi2+(yi-1)2-2r2判断式d的初始值为:d0= 3-2r。
如果d i+1>=0,则y=yi-1,di+2 =d i+1 + 4(xi- yi)+10如果d i+1<0,则y=yi,d i+2 =d i+1+ 4x i+6三、程序源代码1、中点画圆算法#include"graphics.h"#include"math.h"#include"conio.h"main(){void MidPointCircle(int,int);/*定义主函数变量,MidPointCircle中点画圆算法函数*/int gdriver,gmode; /*gdriver和gmode分别表示图形驱动器和模式*/gdriver=DETECT; /*DETECT是自动选择显示模式*/initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");/*图形驱动文件的路径*/ MidPointCircle(200,YELLOW); /*定义圆的半径和颜色*/getch();/*getch();会等待你按下任意键,再继续执行下面的语句*/closegraph();/*关闭图形系统*/return(0); /*返回值为0*/}void MidPointCircle(int r,int color) /*定义函数变量半径和颜色*/{ int x,y;float d; /*float类型中小数位数为7位,即可精确到小数点后7位 */x=0; y=r; d=1.25-r;while(x<y) /*满足条件x<y时进入循环,不满足跳出*/{ if(d<0){d+=2*x+3; x++;}else { d+=2*(x-y)+5; x++; y--;}putpixel(x+200,y+200,color); putpixel(y+200,x+200,color);putpixel(200-x,y+200,color); putpixel(y+200,200-x,color);putpixel(200+x,200-y,color); putpixel(200-y,x+200,color);putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);/* putpixel 在指定位置画一像素*/}}2、 Bresenham画圆算法#include"graphics.h"#include"math.h"#include"conio.h"main(){void Bresenham_Circle(int,int);/* Bresenham_Circle为 Bresenham画圆算法函数*/int gdriver,gmode;gdriver=DETECT;initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");Bresenham_Circle(200,YELLOW); /*定义圆的半径和颜色*/getch();closegraph();return(0);}void Bresenham_Circle(int R,int color){ int x,y,delta,delta1,delta2,direction;x=0;y=R;delta=2*(1-R);while(y>=0) /*满足条件y>=0时进入循环,不满足跳出*/{putpixel(x+200,y+200,color); putpixel(y+200,x+200,color);putpixel(200-x,y+200,color); putpixel(y+200,200-x,color);putpixel(200+x,200-y,color); putpixel(200-y,x+200,color);putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);if(delta<0){delta1=2*(delta+y)-1;if(delta1<=0)direction=1;else direction=2;}else if(delta>0){delta2=2*(delta-x)-1;if(delta2<=0) direction=2;else direction=3;}elsedirection=2;switch (direction)/*switch语句,即“切换”语句;case即“情况*/ {case 1:x++;delta+=2*x+1;break;/*执行 break 语句会退出当前循环或语句*/case 2:x++;y--;delta+=2*(x-y+1);break;case 3: y--;delta+=(-2*y+1);break;}}}四、实验结果图1中点画圆算法生成的圆半径r=200,颜色为黄色图2 Bresenham画圆算法生成的圆半径R=200,颜色为黄色五、总结与体会通过运用 C 语言环境下的图像显示设置,本次实验我学会了用中点画圆法、Bresenham 画圆法进行圆的扫描转换,更加深刻的理解了中点画圆法、Bresenham 画圆法进行圆的扫描转换的生成原理。
计算机图形学-画椭圆和圆
}
x++;
glVertex2i(x +xc, y +yc);
glVertex2i(y +xc, x +yc);
glVertex2i(y +xc, -x +yc);
glVertex2i(x +xc, -y +yc);
glVertex2i(-x +xc, -y +yc);
glVertex2i(-y +xc, -x +yc);
绘图过程如下:
.输入直线的两端点P0(X0,Y0)和P1(X1,Y1)。
.计算初始值△x, △y,d=△x-2△y,x=X0,y=Y0.
.绘制点(x,y)。判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y;否则(x,y)更新为(x+1,y),d更新为△y。
.当直线没有画完时,重复步骤 ,否则结束。
intx = 0;
inty =b;
Ellipsepot(x0,y0, x, y);
// 1
while(sqb*(x + 1) < sqa*(y - 0.5))
{
if(d < 0)
{
d += sqb*(2 * x + 3);
}
else
{
d += (sqb*(2 * x + 3) + sqa*((-2)*y + 2));
glVertex2i(198,2);
glEnd();
glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序
中心画圆算法实验报告
一、实验目的1. 理解并掌握中心画圆算法的基本原理和实现方法。
2. 能够运用中心画圆算法绘制圆形图形。
3. 培养编程实践能力和问题解决能力。
二、实验原理中心画圆算法是一种基于圆的几何特性的画圆方法。
其基本原理如下:设圆心坐标为(x0,y0),半径为r,要绘制圆,只需计算圆上每个点的坐标(x,y),使得它们满足以下方程:(x - x0)² + (y - y0)² = r²通过迭代计算圆上每个点的坐标,并将这些点绘制出来,即可得到一个完整的圆形图形。
三、实验环境1. 操作系统:Windows 102. 编程语言:C#3. 开发工具:Visual Studio 20194. 显示设备:分辨率不低于1280720四、实验步骤1. 创建一个新的C# Windows窗体应用程序项目。
2. 在窗体上添加一个画布控件(Canvas)。
3. 编写代码,实现以下功能:(1)获取圆心坐标和半径:当用户在画布上点击时,记录点击位置作为圆心坐标;当用户拖动鼠标时,记录鼠标移动的距离作为圆的半径。
(2)绘制圆形:遍历圆上的每个点,使用中心画圆算法计算每个点的坐标,并在画布上绘制。
(3)显示圆心坐标和半径:在画布上显示圆心坐标和半径的长度。
(4)动画演示:在绘制圆形的过程中,逐步显示每个点的坐标和绘制结果。
(5)显示运算结果:在绘制圆形的过程中,显示每个点的坐标和运算结果。
五、实验结果与分析1. 实验结果通过实验,成功实现了中心画圆算法的绘制圆形功能。
在窗体上,用户可以点击确定圆心坐标,拖动鼠标确定圆的半径,程序将根据中心画圆算法绘制圆形图形,并在画布上显示圆心坐标和半径的长度。
同时,程序还实现了动画演示和显示运算结果的功能。
2. 实验分析(1)中心画圆算法在绘制圆形时具有较高的效率,尤其是在绘制较大半径的圆形时,其效率更加明显。
(2)在实现过程中,通过遍历圆上的每个点,使用中心画圆算法计算每个点的坐标,并在画布上绘制,可以保证绘制出的圆形图形具有较高的精确度。
华科大图形学报告 中点Bresenham 算法 画直线 画圆 线刷子 日地月模型 光照模型
计算机图形学上机实验报告计算机科学与技术学院班级: 0 9 1 1 班学号: U200915XXX姓名: XXXX指导教师:徐海银完成日期: 2011/12/06目录实验一实验目的与要求------------------------------------1实验内容与分析------------------------------------1实验结果显示---------------------------------------3实验体会---------------------------------------------8源代码------------------------------------------------8实验二实验目的与要求------------------------------------18实验内容与分析------------------------------------18实验结果显示---------------------------------------19实验体会---------------------------------------------19源代码-----------------------------------------------20实验一(基本图元绘制)实验目的与要求(1)理解glut程序框架; (2)理解窗口到视区的变换 ;(3)理解OpenGL实现动画的原理; (4)添加代码实现中点Bresenham算法画直线;(5)添加代码实现改进Bresenham算法画直线;(6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改);(7)适当修改代码实现具有宽度的图形(线刷子或方刷子)。
实验内容与分析①中点Bresenham 算法画直线思想:仅考虑0≤k≤1,由于最大位移方向为x,因此,每次x方向上加1,而y方向上或加1或加0。
计算机图形学画圆实验报告
洛阳理工学院实验报告用纸(2)画理想圆流程图如图-1:图-1:画理想圆流程图(3)中点画圆法图-2 中点画圆法当前象素与下一象素的候选者数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
(4)Bresenham画圆法Bresenham画线法与中点画线法相似,,它通过每列象素中确定与理想直线最近的象素来进行直线的扫描的转换的。
通过各行,各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的的象素。
该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求对象。
假设x列的象素已确定,其行下标为y。
那么下一个象素的列坐标必为x+1。
而行坐标要么不变,要么递增1。
是否递增1取决于如图所示的误差项d的值。
因为直线的起始点在象素中心,所以误差项d的初始值为0。
X下标每增加1,d的值相应递增直线的斜率值,即d=d+k(k=y/x为直线斜率)。
一旦d>=1时,就把它减去,这样保证d始终在0、1之间。
当d>0.5时,直线与x+1垂直网络线交点最接近于当前象素(x,y)的右上方象素(x+1,y+1);而当d<0.5时,更接近于象素(x+1,y),当d=0。
5时,与上述二象素一样接近,约定取(x+1,y+1)。
令e=d-0。
5。
则当e>=0时,下一象素的y下标增加1,而当e〈0时,下一象素的y下标不增。
E的初始值为-0.5.(二)实验设计画填充点流程图,如图-3:图-3:圆的像素填充过程NS图画理想圆,记录圆心坐标,计算半径大小,并记录是否开始填充否是初始化计数器、标志变量,设置最大计数值调用Bresenha m画圆算法否是填充标记是否为真(While)计数变量小于最大计数值循环变量temp + 1填充计算出来的temp个坐标点计算需要填充坐标数组的前temp个坐标附录图-4 Bresenham画圆算法最终效果图。
中点画圆算法实验报告
中点画圆算法实验报告篇一:计算机图形学实验报告-中点画圆算法班级R数学111大连交通大学姓名实验报告同组人课程名称: 计算机图形学成绩实验名称: 中点画圆算法指导老师篇二:中点算法画填充圆实验报告中点算法画填充圆实验报告一(实验题目中点算法画填充圆。
中点画圆算法内容:1,输入圆心位置和圆的半径,得到圆周上的第一个点Point1;(假设起始点为坐标原点,后面将通过坐标平移来处理非圆心在圆点)2,计算决策关键参数的初始值,P = 5/4 - r;3,在每个Xn的位置,从n = 0开始,更具决策值P来判断:如果P<0,下一个点的位置为(Xn+1,Yn);并且执行P = P + 2*x+3;如果P>=0,下一个点的位置为(Xn+1,Yn-1);并且执行P = P + 2.0*(x-y)+5;4,通过对称原理计算其他7个对称相关点;5,移动坐标到圆心点(x1,y1)X = X + x1;Y = Y + y1;6,如果X<Y重复执行3到5的步骤,否则结束该算法源代码:#include<GL/glut.h>GLint xc = 0;GLint yc = 0;int p[200][200];class screenPt{private:GLint x,y;public:screenPt(){x = y = 0;}void setCoords(GLint xCoordValue,GLint yCoordValue){ x = xCoordValue;y = yCoordValue;}GLint getx() const{return x;}GLint gety() const{return y;}void incrementx(){x++;}void decrementy(){y--;}};void setPixel(GLint xCoord,GLint yCoord){p[xCoord][yCoord]=1;//设置边缘色为1glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void circlePlotPoints(GLint xc,GLint yc,screenPt circPt) {setPixel(xc + circPt.getx(),yc + circPt.gety());setPixel(xc - circPt.getx(),yc + circPt.gety());setPixel(xc + circPt.getx(),yc - circPt.gety());setPixel(xc - circPt.getx(),yc - circPt.gety());setPixel(xc + circPt.gety(),yc + circPt.getx());setPixel(xc - circPt.gety(),yc + circPt.getx());setPixel(xc + circPt.gety(),yc - circPt.getx());setPixel(xc - circPt.gety(),yc - circPt.getx());}void circleMidpoint(GLint radius)screenPt circPt;GLint p = 1 - radius;circPt.setCoords(0,radius);void circlePlotPoints(GLint,GLint,screenPt); circlePlotPoints(xc,yc,circPt);while(circPt.getx()<circPt.gety()){circPt.incrementx();if(p<0)p+=2*circPt.getx()+1;else{circPt.decrementy();p+=2*(circPt.getx() - circPt.gety())+1;}circlePlotPoints(xc,yc,circPt);}}void getPixel(int x , int y , int& Color ) {Color=p[x][y];}void setPixel2 (GLint xCoord , GLint yCoord) {//p[i][j]=1;填充色为2p[xCoord][yCoord]=2;glColor3f(0.0,1.0,1.0);glPointSize(5);glBegin (GL_POINTS);glVertex2f(xCoord , yCoord);glEnd ();}void boundaryFill4 (int x, int y, int fillColor,int borderColor) {int interiorColor;getPixel (x, y, interiorColor);if((interiorColor != borderColor ) &&(interiorColor !=fillColor)){setPixel2 (x, y);boundaryFill4 (x + 1, y , fillColor, borderColor);boundaryFill4 (x - 1, y , fillColor, borderColor);boundaryFill4 (x , y + 1, fillColor, borderColor);boundaryFill4 (x , y - 1, fillColor, borderColor);}void renderScene(void ){glClear(GL_COLOR_BUFFER_BIT);gluOrtho2D(-500,500,-500,500);glPointSize(3);circleMidpoint(30);boundaryFill4(100, 100, 2, 1);glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("一个OpenGL程序");glutDisplayFunc(&renderScene);glutMainLoop((本文来自: 博旭范文网:中点画圆算法实验报告));return 0;}运行结果:实验总结:这次试验总的来说,就是根据书里的实验思想,再稍加修改就可以得到正确的答案。
计算机图形学实习(实验二)
西北农林科技大学实习报告课程 计算机图形学 学院 理学院 专业年级 信计061 姓名袁金龙学号15206012报告日期2009-5-6实验二 圆的扫描转换算法1.实验目的:了解和掌握中点算法Bresenham 算法。
2.实验步骤:1)对直线、圆弧的几何形状及相对位置进行分析,选定比较合适的算法模型。
2)画出程序流程图; 3)编写程序的源程序; 4)编辑源程序并进行调试;5)进行特殊模式的运行测试,并结合情况进行调整。
6)打印源程序或把源程序以文件的形式提交。
3.实验原理:首先画出的是第一象限内(R R [0,x R 的1/8圆弧,此时中点Bresenham 花圆酸法要从(0,R )到(R R 顺时针地确定最佳逼近于该圆弧的像素序列。
然后根据对称法来画出另七个部分。
(1)输入圆的半径R(2)计算初始值d=1-R,x=0,y=R(3) 绘制点(x,y )及其在八分圆中的另外7个对称点(4)判断d 的符号。
若d<0,则先将d 更新为d+2x+3,再将(x,y )更新为(x+1,y );否则先将d 更新为d+2(x-y)+5,再将(x,y )更新为(x+1,y-1) (5)当x<y 时,重复步骤(3)和(4);否则结束4.流程图:5.实验内容:1)问题:请用中点Bresenhan画圆算法画出圆心在(-10,10),半径为10的圆 2)正确的图形和交点坐标:图1:圆心在(-10,10),半径为10的圆-150-100-50050100图2:圆心在(-10,10),半径为100的圆3)程序代码:function []=circle(a,b,r)%(a,b)为圆心,r为半径x=0;y=r;d=1-r;while x<=yplot(x+a,y+b,'r+');plot(-x+a,y+b,'r+');plot(-x+a,-y+b,'r+');plot(x+a,-y+b,'r+');m=[x+a,y+b;-x+a,y+b;-x+a,-y+b;x+a,-y+b]plot(y+a,x+b,'r+');plot(-y+a,x+b,'r+');plot(-y+a,-x+b,'r+');plot(y+a,-x+b,'r+');plo t(a,b,'b*')n=[y+a,x+b;-y+a,x+b;-y+a,-x+b;y+a,-x+b]hold on;grid on;if(d<0)d=d+2*x+3;elsed=d+2*(x-y)+5;y=y-1;endx=x+1;end。
计算机图形学实验报告实验2
大学实验报告学院: 计算机科学与信息专业:计算机科学与技术班级:计科101 喻志华学号1008060024 实验组实验时间2013/3/30 指导教师吴云成绩实验项目名称圆和椭圆的生成算法实验目的根据圆的Brensenham算法、中点算法和中点改进算法,以及椭圆的中点算法,编写程序,实现圆与椭圆的绘制。
实验要求1.圆、椭圆的中点算法2.圆的优化后的算法:二次差分法3.编制源程序;4.对于一些较为重要的算法,可以摘抄在报告中;实验原理 1.中点算法A.构造函数 F(X,Y)=X2+Y2-R2,则可知F(M)< 0:M在圆,取TF(M)≥ 0:M在圆外,取BB.第一个M点的值有:(一)DM0 = F(M0)= F(1,R-0.5)= 12+(R-0.5)2-R2=1.25-R若 D=d-0.25则判别式d<0等价于D<-0.25。
即DM0=1-R与DM0=1.25-R等价。
(二)如果dM<0,表示下一中点M在圆,选择T点,且:dMT= F(MT)= F(xp+2,yp-0.5) 则:∆dMT= dMT - dM=2xp+3(三)如果dM>0,表示下一中点M在圆外,选择B点,且: dMB= F(xMB,yMB)= F(xp+2,yp-1.5)则:∆dMB= dMB - dM=2xp-2yp +52.中点改进算法——增量算法与圆同理,对于某中点MdM=F(M)=b2(x+1)2+a2(y-0.5)2-a2b2(1)若d=0,则M在椭圆弧上,取T/B点(2)若d<0,则M在椭圆弧,应取T点(3)若d>0,则M在椭圆弧外,应取B点A.上半部分雷同圆的推导,得到结论:d1<0, d1=d1+b*b*(2*x+3);d1>=0, d1=d1+(b*b*(2*x+3)+a*a*(-2*y+2))每次判断是否转入下部分:b*b*(x+1) < a*a*(y-0.5)说明还在上部分B.下部分,y变化较快,每次减1,根据d值决定选L或者R点,知道y=0.分L和R两种情况推导,得到结论:d2 <0,d2 =d2+b*b*(2*x+2)+a*a*(-2*y+3)d1>=0, d2=d2+a*a*(-2*y+3)实验环境Visual C++ 6.0/ Windows XP实验步骤1.新建工程MFC2.插入两个对话框,绘制圆的命名为InputDlg,绘制椭圆的命名为InputDlg,且设置其各控件ID,变量名如下:3.在fileview中,头文件HeyjieCircle1_1Bview.h和HeyjieCircle1_1Bview.cpp中添加代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学实验》报告
2016年春季学期
实验:中点画圆
实验时间:2016年12月8日
实验地点:信息学院2204
实验目的:中点画圆
程序代码:#include <glut.h>
void init (void)
{
glClearColor (1.0, 1.0, 1.0, 0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}
class screenPt
{
private:
GLint x, y;
public:
screenPt ( ) {
x = y = 0;
}
void setCoords (GLint xCoordValue, GLint yCoordValue) { x = xCoordValue;
y = yCoordValue;
}
GLint getx ( ) const {
return x;
}
GLint gety ( ) const {
return y;
}
void incrementx ( ) {
x++;
}
void decrementy ( ) {
y--;
}
};
void setPixel (GLint xCoord, GLint yCoord) {
glBegin (GL_POINTS);
glVertex2i (xCoord, yCoord);
glEnd ( );
}
void circleMidpoint (GLint xc, GLint yc, GLint radius) {
screenPt circPt;
GLint p = 1 - radius;
circPt.setCoords (0, radius);
void circlePlotPoints (GLint, GLint, screenPt);
circlePlotPoints (xc, yc, circPt);
while (circPt.getx ( ) < circPt.gety ( )) {
circPt.incrementx ( );
if (p < 0)
p += 2 * circPt.getx ( ) + 1;
else {
circPt.decrementy ( );
p += 2 * (circPt.getx ( ) - circPt.gety ( )) + 1;
}
circlePlotPoints (xc, yc, circPt);
}
}
void circlePlotPoints (GLint xc, GLint yc, screenPt circPt) {
setPixel (xc + circPt.getx ( ), yc + circPt.gety ( ));
setPixel (xc - circPt.getx ( ), yc + circPt.gety ( ));
setPixel (xc + circPt.getx ( ), yc - circPt.gety ( ));
setPixel (xc - circPt.getx ( ), yc - circPt.gety ( ));
setPixel (xc + circPt.gety ( ), yc + circPt.getx ( ));
setPixel (xc - circPt.gety ( ), yc + circPt.getx ( ));
setPixel (xc + circPt.gety ( ), yc - circPt.getx ( ));
setPixel (xc - circPt.gety ( ), yc - circPt.getx ( ));
}
void displaymiddlepoint(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
//glBegin(GL_LINES);
circleMidpoint(0,0,100);
glEnd();
glFlush();}
void main(int argc,char** argv)
{glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(50,100);
glutInitWindowSize(400,300);
glutCreateWindow("An example opengl program");
init();
glutDisplayFunc(displaymiddlepoint);
glutMainLoop();}
实验结果:。