计算机图形学画圆实验报告
计算机图形学报告
![计算机图形学报告](https://img.taocdn.com/s3/m/f7c7d485d0d233d4b14e6965.png)
淮阴工学院计算机科学系实验报告书课程名:《计算机图形学》题目:实验2圆或椭圆的绘制班级:学号:姓名:1、实验内容或题目1、通过实验,进一步理解和掌握DDA和中点算法;2、掌握以上算法生成直线段、椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段、椭圆或圆的绘制。
2、实验目的与要求用DDA算法或中点(Besenham)算法实现直线段、椭圆或圆的绘制。
3、实验步骤与源程序⑴实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。
⑵源代码#include "stdio.h"#include "conio.h"#include "graphics.h"#include<time.h>#include<math.h>void ellipsepoint(long x0,long y0,long x,long y,long color){putpixel((int)(x0+x),(int)(y0+y),(int)color);putpixel((int)(x0-x),(int)(y0+y),(int)color);putpixel((int)(x0+x),(int)(y0-y),(int)color);putpixel((int)(x0-x),(int)(y0-y),(int)color);}void midpointellipse(long x0,long y0,long a,long b,long color) {long x,y,d,sa,sb,xp,yp;sa=a*a,sb=b*b;xp=(long)((float)sa/(float)sqrt((float)(sa+sb)));yp=(long)((float)sb/(float)sqrt((float)(sa+sb)));x=0,y=b,d=sa+4*sb-4*sa*b;while(x<xp){if(d<0){d=d+4*sb*(2*x+3);x++;}else{d=d+4*sb*(2*x+3)+4*sa*(2-2*y);x++;y--;}ellipsepoint(x0,y0,x,y,color);}x=a,y=0,d=4*sa+sb-4*a*sb;while(y<yp){if(d<0){d=d+4*sa*(2*y+3);y++;}else{d=d+4*sa*(2*y+3)+4*sb*(2-2*x);y++;x--;}ellipsepoint(x0,y0,x,y,color);}}main(){clock_tstart=clock(),end,t;intgraphdriver=VGA,graphmode=VGAHI;initgraph(&graphdriver,&graphmode,"");midpointellipse(300,200,300,180,RED);end=clock();t=end-start;printf("%d\n",t);getch();closegraph();}4、测试数据与实验结果(可以抓图粘贴)5、结果分析与实验体会在这次实验中,我们遇到了很多困难,刚开始我们在实现圆的绘制时,调试后,要么就是没有图形,要么就是在左上角有个四分之一的圆,在其过程中,代码也改了好多次。
三次贝塞尔曲线画圆
![三次贝塞尔曲线画圆](https://img.taocdn.com/s3/m/90f85e8b0408763231126edb6f1aff00bed570c5.png)
三次贝塞尔曲线画圆贝塞尔曲线是一种数学表达方式,由法国数学家皮耶尔·贝塞尔在19世纪提出。
它可以用于描述平滑曲线,并且在计算机图形学、动画设计以及工程绘图等领域得到了广泛应用。
正因如此,贝塞尔曲线的研究与应用,成为了众多数学爱好者探索的方向。
然而,你有没有想过,用三次贝塞尔曲线能够画出一个完美的圆呢?通过数学的推理与实践,证明了用三次贝塞尔曲线可以准确地绘制出一个圆形。
让我们一起进入数学的世界,探寻其中的奥秘。
首先,我们需要了解什么是三次贝塞尔曲线。
三次贝塞尔曲线由四个点决定,分别为起始点P0、控制点P1、控制点P2和终止点P3。
起始点和终止点是曲线的端点,而控制点则决定了曲线的形状。
要绘制一个圆形,我们可以先确定圆的四个象限的中点,分别称为顶点A、B、C和D。
将这四个顶点连接起来,即可形成一个矩形。
然后,我们需要计算出控制点的坐标,使得贝塞尔曲线通过圆的四个顶点,并且在圆的切线处平滑过渡。
假设圆的半径为r,我们可以得到控制点的坐标如下:点A的控制点为(A.x, A.y + r * ?? / ??)点B的控制点为(B.x + r * ?? / ??, B.y)点C的控制点为(C.x, C.y - r * ?? / ??)点D的控制点为(D.x - r * ?? / ??, D.y)现在,我们已经确定了绘制圆所需的所有点的坐标。
接下来,使用这些点来绘制三次贝塞尔曲线。
在计算机图形学中,三次贝塞尔曲线的绘制通常使用参数t的变化来实现。
我们可以将0≤t≤1作为参数的范围,通过改变t的值,可以逐步绘制贝塞尔曲线。
数学表达式如下:X(t) = (1-t)^3 * P0.x + 3 * (1-t)^2 * t * P1.x + 3 * (1-t) * t^2 * P2.x + t^3 * P3.xY(t) = (1-t)^3 * P0.y + 3 * (1-t)^2 * t * P1.y + 3 * (1-t) * t^2 * P2.y + t^3 * P3.y其中,P0、P1、P2和P3分别为起始点、控制点、控制点和终止点的坐标。
计算机图形学--圆的生成算法的实现
![计算机图形学--圆的生成算法的实现](https://img.taocdn.com/s3/m/9e5fbf4ab90d6c85ec3ac6cf.png)
计算机图形学--圆的生成算法的实现实验三 圆的生成算法的实现班级 信计 学号51姓名 程芳超 分数一、实验目的和要求:1、掌握圆的生成算法的基本原理2、熟悉圆的生成算法,利用Turbor 实现中点画圆算法、圆的Bresenham 算法。
二、实验内容:1、熟悉圆上的8个对称点的算法,利用中点画圆算法画圆并在屏幕上显示出来;2、使用Bresenham 画圆法生成一个圆;3、利用line()函数画圆:.圆的参数方程222(0)(0)x x y y r +++=;圆心为o(x0,y0)。
以下为各程序的实现代码: 1、中点画圆算法:运行结果为:#include "Conio.h"#include "graphics.h"#include "stdio.h"#include "math.h"#define closegr closegraph#define xo 300#define yo 250#define DELTA 1.0#define max 100typedef struct{int x; int y;}Point;typedef struct{int pointNum;Point *vertices;}Polygon;void initgr(void){int gd = DETECT, gm = 0;registerbgidriver(EGAVGA_driver);initgraph(&gd, &gm, "");}void putpixels(int x,int y,int color,int n) { 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);putpixel(xo-x,yo+y,color);putpixel(xo+x,yo-y,color);putpixel(xo-x,yo-y,color);}void CirclePoints(int x,int y,int color) {putpixel(xo+x,yo+y,color);putpixel(xo+y,yo+x,color);putpixel(xo-y,yo+x,color);putpixel(xo-x,yo+y,color);putpixel(xo+y,yo-x,color);putpixel(xo+x,yo-y,color);putpixel(xo-x,yo-y,color);putpixel(xo-y,yo-x,color);}void MidPointCircle1(int radius,int color) {int x,y;float d;x=0; y=radius; d=5.0/4-radius;CirclePoints(x,y,color);while(y>x){if(d<=0)d+=2.0*x+3;else{d+=2.0*(x-y)+5;y--;}x++;CirclePoints(x,y,color);}}main(){initgr();cleardevice();MidPointCircle1(150,4);getch();closegraph();}运行结果为:2圆的Bresenham算法:#include <graphics.h>#include <stdio.h>#include <conio.h>#include<math.h>void BresenhamCircle(xc,yc,radius,color) int xc,yc, radius,color;{int x,y,d;x=0 ;y=radius ;d=3-2*radius ;while(x<y){plot_circle_points(xc,yc,x,y,color) ; if(d<0)d+=4*x+6;else{d+=4*(x-y)+10;y--;}x++;}if(x==y)plot_circle_points(xc,yc,x,y,color) ;}plot_circle_points(xc,yc,x,y,color)int xc,yc,x,y,color;{putpixel(xc+x,yc+y,color);putpixel(xc-x,yc+y,color);putpixel(xc+x,yc-y,color);putpixel(xc-x,yc-y,color);putpixel(xc+y,yc+x,color);putpixel(xc-y,yc+x,color);putpixel(xc+y,yc-x,color);putpixel(xc-y,yc-x,color);}main(){int a,b,c,e ;int graphdriver=DETECT ;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();a=300;b=300;c=150;e=3;BresenhamCircle(a,b,c,e );getch();closegraph();}运行结果为:3、利用line()函数画圆#include <stdio.h>#include <stdlib.h>#include <math.h>#include <conio.h>#include <graphics.h>main(){int i,r,xx[46],yy[46],x0,y0; float t=360/45*3.14/180;int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,""); cleardevice();setbkcolor(14);setcolor(4);x0=300;y0=250;r=200;for(i=0;i<46;i++){xx[i]=x0+r*cos(i*t);yy[i]=y0-r*sin(i*t);}for(i=0;i<45;i++)line(xx[i],yy[i],xx[i+1],yy[i+1]);settextstyle(1,0,5);outtextxy(300,200,"O");line(300,250,500,250);getch();closegraph();return 0;}运行结果为:三、实验结果分析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);}若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他七个点,因此要扫描转换1/8圆弧就可以求出表示整个圆弧的像素集。
圆绘制算法实验报告
![圆绘制算法实验报告](https://img.taocdn.com/s3/m/386d015d0640be1e650e52ea551810a6f524c89a.png)
一、实验背景圆是几何图形中最基本的图形之一,在计算机图形学中,绘制圆是图形处理的基础。
本实验旨在通过实现圆的绘制算法,加深对计算机图形学基本概念和方法的理解,提高编程能力。
二、实验目的1. 掌握圆的基本绘制方法;2. 熟悉Bresenham算法和中点算法的原理;3. 理解并实现圆的绘制算法;4. 分析不同算法的优缺点,提高算法选择能力。
三、实验内容1. Bresenham算法画圆2. 中点算法画圆四、实验原理1. Bresenham算法画圆Bresenham算法是一种光栅扫描算法,用于绘制圆、椭圆、直线等图形。
该算法的基本思想是:根据圆的几何特性,计算出每个像素点是否应该被绘制。
对于圆的绘制,我们可以利用以下公式:\[ x^2 + y^2 = r^2 \]其中,\( x \) 和 \( y \) 分别表示圆上一点的横纵坐标,\( r \) 表示圆的半径。
Bresenham算法的步骤如下:(1)初始化参数:设置起始点(0, r),终止点(r, 0),步长 \( p \);(2)计算判别式 \( p = 2x - y \);(3)根据判别式的值,更新 \( x \) 和 \( y \) 的值;(4)重复步骤(2)和(3),直到 \( x = y \);(5)绘制圆。
2. 中点算法画圆中点算法是一种基于Bresenham算法的改进算法,它利用圆的对称性,减少了计算量。
中点算法的步骤如下:(1)初始化参数:设置起始点(0, r),终止点(r, 0),步长 \( p \);(2)计算判别式 \( p = 1 - 2x \);(3)根据判别式的值,更新 \( x \) 和 \( y \) 的值;(4)重复步骤(2)和(3),直到 \( x = y \);(5)绘制圆。
五、实验步骤1. 创建一个OpenGL窗口,用于显示绘制的圆;2. 使用Bresenham算法绘制圆;3. 使用中点算法绘制圆;4. 比较两种算法的绘制效果,分析优缺点;5. 编写代码实现两种算法,并进行测试。
《计算机图形学》实验4实验报告
![《计算机图形学》实验4实验报告](https://img.taocdn.com/s3/m/d5f18962a517866fb84ae45c3b3567ec102ddca5.png)
实验4实验报告格式实验报告格式《计算机图形学》实验4实验报告实验报告实验题目:参数曲线绘制实验内容:1 圆的参数曲线绘制。
2显式数学曲线描绘程序。
显式数学曲线描绘程序。
3贝赛尔曲线绘制。
贝赛尔曲线绘制。
编写程序调用验证之。
编写程序调用验证之。
参考资料:1 circleParam.java2 explicitCurve.java3 BezierLine.java4 数学曲线绘制.ppt 和实验3的参考ppt基本概念:(详细叙述自己对实验内容的理解)(详细叙述自己对实验内容的理解)(1)圆的参数曲线绘制: 圆的参数曲线绘制就是按照圆的定义,利用步长,圆的参数曲线绘制就是按照圆的定义,利用步长,得在显示得在显示域上每一点的位置,然后绘制,圆是图形中经常使用的元素,圆是图形中经常使用的元素,圆被定义为所有离一中心位置圆被定义为所有离一中心位置),(yc xc 距离为给定值距离为给定值R 的点集,其函数方程为:222)()(R yc y xc x =-+-参数方程为:{)20(cos sin p £<+=+=t tR Xc X t R Yc Y根据已知的Xc 和Yc ,以及t 可以确定一个圆。
可以确定一个圆。
(2)显示数学曲线描绘程序:显示曲线的绘制就是在已知的坐标系上,按照方程要求在固定的点画点,然后连接成一条线,例如如果曲线的方程式:c bx ax y ++=2,利用这个公式的递推演算,我们依次从-x 到+x 来绘制。
来绘制。
(3)贝塞尔曲线的绘制:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点两侧的曲线的弧度。
它是应用于二维图形应用程序的数学曲线。
它是应用于二维图形应用程序的数学曲线。
曲线的定义有四个点:曲线的定义有四个点:曲线的定义有四个点:起始起始点、终止点(也称锚点)以及两个相互分离的中间点。
滑动两个中间点,贝塞尔曲线的形状会发生变化。
例如下面的公式:)10)(()(0,££=å=t t B p t p ni n i i算法设计:(详细叙述自己设计的的算法)(详细叙述自己设计的的算法)(1)圆的算法设计:本例体现的主要是圆的快速算法,这里的主要算法是:本例体现的主要是圆的快速算法,这里的主要算法是:{)20(cos sin p £<+=+=t t R Xc X t R Yc Y t 是圆的某一点与X 轴之间的夹角。
计算机图形学实习报告bresenham画圆算法
![计算机图形学实习报告bresenham画圆算法](https://img.taocdn.com/s3/m/3b39de59453610661ed9f496.png)
计算机图形学实习报告实习时间:2016年4月6日学院:专业名称:学号:姓名:实习地点:一、实习目的熟悉Visual C++开发环境,能够自己搭建OpenGL图形开发框架,并用C/C++语言实现Bresenham画圆算法。
通过本实验教学环节,可以使学生对图元生成算法的实现过程、验证方法有一个初步的了解,通过实现Bresenham画圆算法,理解图元的参数表示法、光栅扫描、显示输出的概念。
实验的基本要求是:利用Visual C++开发环境,搭建OpenGL Win32控制台图形开发框架,完成Bresenham画圆算法程序的输入、编译和调试运行。
二、实习内容与过程1.Visual C++开发环境熟悉;2.了解Win32控制台开发框架,并搭建OpenGL Win32控制台图形开发框架,如图1-1;图1-1添加OpenGL库3.完成Bresenham画圆算法程序的输入、编译和运行,在屏幕上输出实现结果,Bresenham画圆算法改写如图1-2所示,运行结果如图1-3;图1-2部分Bresenham算法代码图1-3运行结果4.掌握程序调试的方法;5.修改算法参数,查看结果的不同,如图1-4;图1-4修改参数运行结果三、出现问题及解决方法1.在搭建OpenGL图形开发框架时,刚开始不知道在哪里加入“opengl32.lib glu32.lib”,后来在“Bresenham解决方案→属性→链接器→输入→附加依赖项”中进行加入,完成了OpenGL图形开发框架的搭建。
2.刚开始不知道如何利用Bresenham算法画两个圆,后来直接在drawCircle()函数中多次调用bresenhamcircle()函数就可以了,还可以修改相关参数,如图2-1:图2-1四、实习体会这次实习,主要是熟悉Visual C++开发环境,能够自己搭建OpenGL图形开发框架,并用C/C++语言实现Bresenham画圆算法。
在这次实习中加深了对图元生成算法的实现过程、验证方法的了解,也通过实现Bresenham画圆算法,理解了图元的参数表示法、光栅扫描、显示输出的概念,渐渐地开始自己思考实现想要实现的功能。
计算机学实验报告(画圆)
![计算机学实验报告(画圆)](https://img.taocdn.com/s3/m/952b87d333d4b14e852468a1.png)
计科本082班李凤艳学号0804402214一、实验名称计算机画圆二、实验目的通过上机实验编程实现计算机画圆,充分理解体会学习,图形学学画图的原理,加深印象。
三、实验内容实现计算机画圆四、源程序由于系统自动生成很多代码,大部分都一样,在此程序中省略,只列出一些关键实现代码。
void CMovecircleView::OnDraw(CDC* pDC){CMovecircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect Rect;GetClientRect(&Rect);CDC MemDC;CDC Picture;CBitmap Bitmap,*OldBitmap;//CBitmap Bitmap;//CBitmap &OldBitmap;Bitmap.LoadBitmap(IDB_BITMAP1);MemDC.CreateCompatibleDC(pDC);OldBitmap=MemDC.SelectObject(&Bitmap);MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);MemDC.SetBkMode(TRANSPARENT);MemDC.SetTextColor(RGB(255,255,255));MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);MemDC.TextOut(100,50,"欢迎来到计算机图形学");pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);}void CMovecircleView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_bLButtonDown = TRUE; // 设左鼠标键按下为真m_pStart = point;SetCapture(); // 设置鼠标捕获CView::OnLButtonDown(nFlags, point);}void CMovecircleView::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default ReleaseCapture();if (m_bLButtonDown){CDC* pDC = GetDC(); // 获取设备上下文pDC->SelectStockObject(NULL_BRUSH);pDC->SelectObject(pLinePen); // 选择笔pDC->SetROP2(R2_COPYPEN); // 设置为覆盖绘图方式CPoint center; // 圆心//calculate the centercenter.x=(float(m_pStart.x+point.x))/2;center.y=(float(m_pStart.y+point.y))/2;// nRadius is a class member, doublenRadius=sqrt(double(point.y-m_pStart.y)*(point.y-m_pStart.y)+(point.x-m_pStart.x)*(point.x-m_pStart.x))/2;pDC->Ellipse(center.x-nRadius, center.y-nRadius, center.x+nRadius, center.y+nRadius);ReleaseDC(pDC); // 释放设备上下文m_bLButtonDown = FALSE; // 重设左鼠标键按下为假m_bErase = FALSE; // 重需要擦除为假}CView::OnLButtonUp(nFlags, point);}void CMovecircleView::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default if(m_bLButtonDown==TRUE){CDC* pDC = GetDC(); // 获取设备上下文pDC->SelectObject(pGrayPen); // 选取灰色笔pDC->SelectStockObject(NULL_BRUSH);pDC->SetROP2(R2_XORPEN); // 设置为异或绘图方式if (m_bErase){ // need to erasepDC->Ellipse(old_center.x-nRadius,old_center.y-nRadius,old_center.x+nRadius, old_center.y+nRadius);}else // 需要擦除为假m_bErase = TRUE; // 设需要擦除为真CPoint center;center.x=(float(m_pStart.x+point.x))/2;center.y=(float(m_pStart.y+point.y))/2;nRadius=sqrt((double)(point.y-m_pStart.y)*(point.y-m_pStart.y)+(point.x-m_pStart.x)*(point.x-m_pStart.x))/2;pDC->Ellipse(center.x-nRadius, center.y-nRadius, center.x+nRadius, center.y+nRadius);old_center=center;ReleaseDC(pDC); // 释放设备上下文}CView::OnMouseMove(nFlags, point);}五、运行结果六、实验小结这是计算机图形学的第一次实验,通过本次实验我掌握了图形学画图的基本方法以及一些操作的基本要求,在试验中碰到了一些问题,通过同学之间互动,顺利解决了。
计算机图形学实验三:圆的生成算法的实现
![计算机图形学实验三:圆的生成算法的实现](https://img.taocdn.com/s3/m/54f2fa75a26925c52cc5bf50.png)
实验三:圆的生成算法的实现班级 08信计学号 20080502069 姓名分数一、实验目的和要求1、理解圆的基本原理。
2、掌握几种常见的圆生成算法。
3、利用TurboC实现圆生成的中点画圆算法。
4、理解圆生成的基本原理,掌握几种常见的圆生成算法。
5、利用Visual C++ 实现圆生成的中点画圆的算法。
6、利用Visual C++ 实现圆的Bresenham算法。
7、简单了解其他算法。
二、实验内容:1.利用中点画图算法,在屏幕上生成任意一段圆弧。
2.利用图的对称性,将(1)题生成的圆弧扩展为一个整圆。
3.利用bresebham算法设计出一段圆弧。
三、实验步骤:1.预习教材关于圆的生成原理。
2.仿照教材关于圆生成的中点画圆算法和bresenham算法,使用C++实现该算法。
3.调试、编译、运行程序。
四、实验结果分析:1.这里用圆生成的中点画圆算法为例来绘制一个圆。
程序代码:#include<graphics.h>#include<conio.h>void circlepoints(int x,int y,int color){int m,n;float xasp,yasp;float aspectratio;m=200;n=200;getaspectratio(&xasp,&yasp);aspectratio = xasp/yasp;putpixel(x+m,y*aspectratio+n,color);putpixel(y+m,x*aspectratio+n,color);putpixel(-y+m,x*aspectratio+n,color);putpixel(-x+m,y*aspectratio+n,color);putpixel(y+m,-x*aspectratio+n,color);putpixel(x+m,-y*aspectratio+n,color);putpixel(-x+m,-y*aspectratio+n,color);putpixel(-y+m,-x*aspectratio+n,color); }void midpointcircle(int r,int c){int x,y;float d;x=0; y=r; d=5.0/4-r;circlepoints(x,y,c);while(y>x){if(d<=0)d+=2.0*x+3;else{d+=2.0*(x-y)+5;y--;}x++;circlepoints(x,y,c);}}void main(){int a,b;int graphdriver = DETECT;int graphmode = 0;initgraph(&graphdriver,&graphmode,"");cleardevice();a= 200; b= 200;midpointcircle(a,b);getch();closegraph();}运行结果:2.利用bresenham算法生成圆的代码:#include<graphics.h>#include<stdio.h>#include<conio.h>void BresenhemCircle(int centerx, int centery, int radius, int color, int type);void main(){int drive=DETECT,mode;int i,j;initgraph(&drive,&mode,"");BresenhemCircle(300,200,100,150,0);getch();closegraph();}void BresenhemCircle(int centerx, int centery, int radius, int color, int type){int x =type = 0;/*初始横坐标为原点*/int y = radius; /*初始纵坐标远离原点*/int delta = 2*(1-radius);int direction;while (y >= 0){getch();if (!type)/*执行*/{/*在上半圆画两点*/putpixel(centerx+x, centery+y, color);putpixel(centerx-x, centery+y, color);/*在下半圆画两点*/putpixel(centerx-x, centery-y, color);putpixel(centerx+x, centery-y, color);getch();}else{line(centerx+x, centery+y, centerx+x, centery-y); line(centerx-x, centery+y, centerx-x, centery-y); getch();}if (delta < 0){if ((2*(delta+y)-1) < 0)direction = 1;elsedirection = 2;}else if(delta > 0){if ((2*(delta-x)-1) > 0)direction = 3;elsedirection = 2;}elsedirection=2;switch(direction){case 1:x++;delta += (2*x+1); break;case 2:x++;y--;delta += 2*(x-y+1); break;case 3:y--;delta += (-2*y+1); break;}}}实验结果:。
图形学画圆实验报告参考模板
![图形学画圆实验报告参考模板](https://img.taocdn.com/s3/m/d831ca3a240c844768eaee3b.png)
4.2.3程序实现与上机实习(二)一、实验目的编写圆和椭圆的扫描转换算法程序,验证算法的正确性。
二、实验任务1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;2.添加鼠标程序,实现交互式画圆;3.编写中点画椭圆法的扫描转换程序;4.添加鼠标程序,实现交互式画椭圆;三、实验内容1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。
通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为x’=x+x0y’=y+y0即p’1(x0 +x, y+y0)其它7个对称点分别是:p’2(x0+y,y+x0), p’3 (x0+y,y0-x),p’4 (x0+x,y0-y),p’5 (x0-x,y0-y),p’6 (x0-y,y0-x),p’7 (x0-y,y0+x),p’8 (x0-x,y0+y)算法程序如下:{int x,y;float d;x=0;y=r;d=1.25-r;CirPot(x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}(x0+R,y0)else{d+=2*(x-y)+5;x++; y--;}CirPot(x0,y0,x,y,color);} /* while*/} /* MidpointCiecle */int CirPot(int x0,int y0,int x,int y,int color){Setpixel((x0+x),(y0+y));Setpixel((x0+y),(y0+x));Setpixel((x0+y),(y0-x));Setpixel((x0+x),(y0-y));Setpixel((x0-x),(y0-y));Setpixel((x0-y),(y0-x));Setpixel((x0-y),(y0+x));Setpixel((x0-x),(y0+y));}程序实现步骤:(1)建立MidPointCircle工程文件;(2)右击CMidPointCircleView类,建立成员函数void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color)int CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color)(3) 编写成员函数代码,程序如下:void CMidPointCircleView::MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) {int x,y;float d;x=0;y=r;d=1.25-r;CirPot(pDC,x0,y0,x,y,color);while (x<=y){if(d<0){d+=2*x+3; x++;}else{d+=2*(x-y)+5;x++; y--;}CirPot(pDC,x0,y0,x,y,color);} /* while*/}int CMidPointCircleView::CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) {pDC->SetPixel((x0+x),(y0+y),color);pDC->SetPixel((x0+y),(y0+x),color);pDC->SetPixel((x0+y),(y0-x),color);pDC->SetPixel((x0+x),(y0-y),color);pDC->SetPixel((x0-x),(y0-y),color);pDC->SetPixel((x0-y),(y0-x),color);pDC->SetPixel((x0-y),(y0+x),color);pDC->SetPixel((x0-x),(y0+y),color);return 0;}(4)编写OnDraw(CDC* pDC)函数,程序如下:void CMidPointCircleView::OnDraw(CDC* pDC){CMidPointCircleDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereMidpointCircle(pDC,100, 100, 10, RGB(255,0,0));MidpointCircle(pDC,500, 300, 60, RGB(255,255,0));}(6)编译、运行程序,查看结果。
计算机图形学 实验2圆弧生成算法
![计算机图形学 实验2圆弧生成算法](https://img.taocdn.com/s3/m/07fcb729192e45361066f5e2.png)
int graphdriver=DETECT;
int graphmode;
initgraph(&graphdriver,&graphmode,"");
Mid_Circle(c);
_getch();
closegraph();
}
程序调试:
输入半径68,“回车”得结果如下图;
四、实验总结:
通过本次实验使我掌握了圆弧的中点画圆算法和掌握了在TC平台上,进行图形程序设计的方法。由程序的调试结果可知,我们采用的是1/8画圆法,我们可以用八对称性求出整个圆弧。在做实验之前老师先给我们讲了圆弧的中点画圆算法的知识,然后我们才开始编程、调试、运行、测试,直到做完实验我们才完全掌握圆弧的中点画圆算法,所以只有理论与实践相结合才能完全掌握所学知识。希望自己在以后的课堂上专心听课,为实践打好理论基础。
首先要熟悉图形的生成算法原理,然后根据算法原理,编写相应的绘图程序。
三、实验内容:
编写图形程序:中点画圆弧算法程序,并调试运行。
圆弧生成算法程序如下:
#include<stdio.h>
#include <conio.h>
#include<graphics.h>
void Mid_Circle(int r)
{
int d,x,y; int color=255;பைடு நூலகம்
x=0;
y=r;
d=1.25-r;
while(x<=y)
{
if(d<0)
{
d+=2*x+3;
}
else
计算机图形学实验三 圆的生成算法的实现
![计算机图形学实验三 圆的生成算法的实现](https://img.taocdn.com/s3/m/c4408712a8114431b90dd850.png)
实验三圆的生成算法的实现班级 08信计学号 60姓名段丹丹分数一、实验目的与要求1. 掌握Bresenham画圆算法的基本思想。
2. 编写Bresenham算法画圆的基本函数并尽量完善。
3、熟悉圆的生成算法,掌握圆的绘制,利用TurboC来实现圆的生成算法。
3、熟悉生成圆的中点算法和正负法。
4、理解圆生成的基本原理。
二、实验步骤与内容:在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状,原因是图形信号时连续,而在光栅显示系统中,用来表示图形的却是一个个离散的像素,这种用离散量表示连续两引起的失真现象称之为走样,用于减少或消除这种效果的技术称为饭走样技术。
采用反走样可适当减轻锯齿效果,但需要以额外的软件或者硬件来实现。
通常的,我们利用画图算法,在屏幕上生成任意一段八分之一圆弧,再利用图的对称性,将那段圆弧扩展为一个整1.圆的特征圆被定义为到给定中心位置(x,y)距离为r的点集。
圆心位于远点的圆有4条对称轴:分别为:x=0,y=0,x=y,x=-y.若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他7个点,这个性质叫做8对称型。
因此只要扫描转换八分之一圆弧,就可以求出整个圆弧的像素集。
2.生成圆的中点算法在第i点已经选择A时,第i+1点只能选择B或C,D为圆弧与直线BC的交点,M为线段BC的中点,M在圆内选B,M在圆外选C设圆的方程为F(x,y)=0,M在圆内时F(M)<0, M在圆外时F(M)>0 ,M在圆上时F(M)=0主要算法:设d i=F(M),则d i>0,选C;d i< = 0,选Bd i=F(x i +1,y i,r - 1/2)= (x i +1)2+(y i,r - 1/2)2- R2d i+1=F(x i+1 +1,y i+1,r - 1/2)= (x i+1 +1)2+(y i+1,r - 1/2)2- R2初始条件:(x0,y0,r)=(0,R)d0=F(x0 +1,y0,r – 1/2)=5/4-R结束条件:x i>=y i圆心为任意点(x c,y c)。
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/fafefaaebb0d4a7302768e9951e79b896802683b.png)
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
计算机图形学实习(实验二)
![计算机图形学实习(实验二)](https://img.taocdn.com/s3/m/fa9b6d136edb6f1aff001faf.png)
西北农林科技大学实习报告课程 计算机图形学 学院 理学院 专业年级 信计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。
计算机图形学课内实验
![计算机图形学课内实验](https://img.taocdn.com/s3/m/261babc605087632311212b1.png)
《计算机图形学课内实验》实验报告班级:计算机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)用前一次迭代算出的决策变量的符号来决定本次选择的点。
计算机图形学画圆实验报告
![计算机图形学画圆实验报告](https://img.taocdn.com/s3/m/aba7c4d96bec0975f565e237.png)
洛阳理工学院实验报告用纸(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画圆算法最终效果图。
计算机图形学画圆方法
![计算机图形学画圆方法](https://img.taocdn.com/s3/m/e6e456ded15abe23482f4d6f.png)
浙江大学城市学院实验报告课程名称计算机图形学实验项目名称画圆方法实验成绩指导老师(签名)日期一. 实验目的和要求通过实验加深对Bresenham圆生成算法的理解。
二. 实验内容和原理(1)数据输入项(或者函数参数)为:圆心坐标与半径(2)输出圆。
三. 实验设计与分析Besenham圆①创建一个application,将其全部保存,②双击划圆按扭,定义参数如下:x,y,x0,y0,r,direction : integer;delta,delta1,delta2 : integer;color1 : integer;③编写代码如下if self.Edit1.Text = '' thenbeginApplication.MessageBox('圆心坐标X没有输入!','提示',0);abort;endelse if self.Edit2.Text = '' thenbeginApplication.MessageBox('圆心坐标Y没有输入!','提示',0);abort;endelse if self.Edit3.Text = '' thenbeginApplication.MessageBox('圆半径没有输入!','提示',0);abort;endelsex0:= strtoint(Edit1.Text);y0:=strtoint(Edit2.Text);r:=strtoint(Edit3.Text);x:=0;y:=r;delta:=2*(1-r);color1:= clGreen;while y>=0 dobeginimage1.canvas.Pixels[x0+x,y0+y]:=color1;image1.canvas.Pixels[x0-x,y0+y]:=color1;image1.canvas.Pixels[x0+x,y0-y]:=color1;image1.canvas.Pixels[x0-x,y0-y]:=color1;if delta<0 thenbegindelta1:=2*(delta+y)-1;if delta1<=0 then direction:=1else direction:=2;endelse if delta>0 thenbegindelta2:=2*(delta-x)-1;if delta2<=0 then direction:=2else direction:=3;endelsedirection:=2;case direction of1 : begininc(x);delta:=delta+2*x+1;end;2 : begininc(x);dec(y);delta:=delta+2*(x-y+1);end;3 : begindec(y);delta:=delta+(-2*y+1);end;end;end;end;④双击演示按扭,定义参数如下:x,y,x0,y0,r,direction : integer;delta,delta1,delta2 : integer;color1 : integer;⑤编写代码如下if self.Edit1.Text = '' thenbeginApplication.MessageBox('圆心坐标X没有输入!','提示',0);abort;endelse if self.Edit2.Text = '' thenbeginApplication.MessageBox('圆心坐标Y没有输入!','提示',0);abort;endelse if self.Edit3.Text = '' thenbeginApplication.MessageBox('圆半径没有输入!','提示',0);abort;endelsex0:= strtoint(Edit1.Text);y0:=strtoint(Edit2.Text);r:=strtoint(Edit3.Text);x:=0;y:=r;delta:=2*(1-r);color1:= clGreen;while y>=0 dobeginimage1.canvas.Pixels[x0+x,y0+y]:=color1;image1.canvas.Pixels[x0-x,y0+y]:=color1;image1.canvas.Pixels[x0+x,y0-y]:=color1;image1.canvas.Pixels[x0-x,y0-y]:=color1;if delta<0 thenbegindelta1:=2*(delta+y)-1;if delta1<=0 then direction:=1else direction:=2;endelse if delta>0 thenbegindelta2:=2*(delta-x)-1;if delta2<=0 then direction:=2else direction:=3;endelsedirection:=2;case direction of1 : begininc(x);delta:=delta+2*x+1;end;2 : begininc(x);dec(y);delta:=delta+2*(x-y+1);end;3 : begindec(y);delta:=delta+(-2*y+1);end;end;end;⑥双击退出按扭,编写代码如下:Close;⑦双击清屏按扭,编写代码如下:image1.Canvas.Brush.Color:=clwhite;image1.Canvas.FillRect(Rect(0,0,350,250));Form3.Edit1.Clear;Form3.Edit2.Clear;Form3.Edit3.Clear;⑧保存,完成。
计算机图形学实验03
![计算机图形学实验03](https://img.taocdn.com/s3/m/e6f6a49f1eb91a37f0115ca2.png)
计算机图形学实验03
《计算机图形学》实验报告
圆(椭圆)的生成算法
一、实验教学目标与基本要求
1.实现圆的生成算法;
2.实现椭圆的生成算法;
二、实验课程内容 (2学时)
1.写出完整的圆的Bresenham生成算法;
2.写出完整的椭圆的中点生成算法;
三、算法思想
1.圆的Bresenham生成算法:
如果我们构造函数 F(_,y)=_+y-R,则对于圆上的点有F(_,y)=0,对于圆外的点有F(_,y)_gt;0,对于圆内的点F(_,y)_lt;0 。
与中点画线法一样,构造判别式:d=F(M)=F(_p+1,yp-0.5)=(_p+1)+(yp-0.5)-R。
若d_lt;0,则应取P1为下一象素,而且再下一象素的判别式为:
222d=F(_p+2,yp-0.5)=(_p+2)+(yp-0.5)-R=d+2_p+3
若d≥0,则应取P2为下一象素,而且下一象素的判别式为:
d=F(_p+2,yp-1.5)=(_p+2)+(yp-
1.5)-R=d+2(_p-yp)+5我们这里讨论的第一个象素是(0,R),判别式d的初始值为:d0=F(1,R-0.5)=1.25-R。
为了进一步提高算法的效率,将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
2.椭圆的中点生成算法:
椭圆中点生成算法是将椭圆在第一象限中分为两个部分:
1)对于斜率绝对值小于1的区域内在_方向取单位量;
2)对于斜率绝对值大于1的区域内在y方向取单位量;
斜率可以通过椭圆的标准方程中获得为K = - (ry_ry)__/(r__r_)_y;这里中点椭圆222222222。
计算机图形学中点画圆实验
![计算机图形学中点画圆实验](https://img.taocdn.com/s3/m/7876241d79563c1ec5da71e0.png)
《计算机图形学实验》报告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();}实验结果:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
洛阳理工学院实验报告用纸
(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画圆算法最终效果图。