计算机图形学--圆的的生成算法的实现
画圆环算法c程序
![画圆环算法c程序](https://img.taocdn.com/s3/m/d1c4dbccbdeb19e8b8f67c1cfad6195f312be80c.png)
画圆环算法c程序全文共四篇示例,供读者参考第一篇示例:画圆环是计算机图形学中常见的基本图形之一,常用于游戏开发、动画制作等领域。
在计算机中,画圆环的算法有多种,其中最常用的是中点画圆算法。
本文将介绍使用C语言实现中点画圆算法的程序,并进行详细分析和讲解。
1. 算法原理中点画圆算法是一种简单而高效的算法,其基本原理是通过逐渐逼近圆形的方法,利用对称性和中点的位置进行迭代计算。
具体步骤如下:(1)给定圆的半径r和圆心坐标(x0, y0),设置初始点P(0, r)作为起点,并计算判别式d=1-r。
(2)在每次迭代中,分别取直线y=x和y=-x两侧的中点,分别计算两种情况下的判别式值,并根据判别式值的大小决定下一个中点的位置。
(3)重复进行上述步骤,直到计算完整个圆的一周。
2. C程序实现下面是使用C语言实现中点画圆算法的程序代码:```c#include <stdio.h>#include <graphics.h>void plot_circle_points(int x0, int y0, int x, int y) { // 绘制圆的八个对称点putpixel(x0 + x, y0 + y, WHITE);putpixel(x0 - x, y0 + y, WHITE);putpixel(x0 + x, y0 - y, WHITE);putpixel(x0 - x, y0 - y, WHITE);putpixel(x0 + y, y0 + x, WHITE);putpixel(x0 - y, y0 + x, WHITE);putpixel(x0 + y, y0 - x, WHITE);putpixel(x0 - y, y0 - x, WHITE);}void midpoint_circle(int x0, int y0, int r) { int x = 0, y = r;int d = 1 - r;plot_circle_points(x0, y0, x, y); while (x < y) {if (d < 0) {d = d + 2 * x + 3;x++;} else {d = d + 2 * (x - y) + 5;x++;y--;}plot_circle_points(x0, y0, x, y);}}delay(5000);closegraph();return 0;}```以上是一个简单的使用C语言实现中点画圆算法的程序代码。
计算机图形学第3章 基本图形生成算法
![计算机图形学第3章 基本图形生成算法](https://img.taocdn.com/s3/m/c7a0630e10661ed9ad51f3c2.png)
例题:有点P0(4,3);P1(6,5);P2(10,
6 );P3(12,4),用以上4点构造2次B样条曲线。
2.1.7 非均匀有理B样条
非均匀有理B样条NURBS(Non Uniform Rational BSpline);
3.2.2
Bresenham画圆法
该算法是最有效的算法之一。
不失一般性,假设圆心(xc,yc) ,圆上的点(x′,y′),则:
x' x xc
y ' y yc
圆心为原点,半径为R的位于第一象限1/8圆弧的画法,即(0, R)~( R , R )。
2 2
yi ), 思想:每一步都选择一个距离理想圆周最近的点P( xi , 使其误差项最小。
画其他曲线。
3.3
自由曲线的生成
正弦函数曲线
指数函数曲线
多项式函数曲线
自 由 曲 线
概率分布曲线及样条函数曲线
3.3.1 曲线的基本理论
基本概念
2.1.4
规则曲线:可用数学方程式表示出来的,如抛物 线等。
自由曲线:很难用一个数学方程式描述的,如高
速公路等。可通过曲线拟合(插值、逼近)的方法来
例题: 利用Bresenham算法生成P (0,0)到Q(6,5)的直 线所经过的像素点。要求先 列出计算式算出各点的坐标 值,然后在方格中标出各点。
(1,1)
3.1.5 双步画线法 原理
模式1:当右像素位于右下角时,中间像素位于底线 模式4:当右边像素位右上角时,中间像素位于中线 模式2和模式3:当右像素位于中线时,中间像素可能位于底线 上,也可能位于中线上,分别对应于模式2和模式3,需进一步 判断。 当0≤k≤1/2时,模式4不可能出现,当1/2≤k≤1时,模式1不 可能出现。
Bresenham算法画圆并填充实验报告 09009202 陶园
![Bresenham算法画圆并填充实验报告 09009202 陶园](https://img.taocdn.com/s3/m/00c84754ad02de80d4d84083.png)
计算机图形学实验报告实验二Bresenham算法画圆并填充学号:09009202 姓名:陶园成绩:东南大学计算机科学与工程学院二〇一一年十一月一.实验题目Bresenham算法画圆并填充二.算法思想1.首先,真实的线条是连续的,但是计算机中的线条是离散的,是由很多点组成的,那么画线的重点就是如何高效地找到这些离散的点来更好地画出想要的图形。
2.实验要求用Bresenham算法实现画圆。
那么首先先要了解Bresenham算法是一种什么算法。
经过查阅,我找到Bresenham直线算法和画圆算法。
直线是圆的基础。
Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。
这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。
是计算机图形学中最先发展出来的算法。
Bresenham画圆算法又称中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。
为了简便起见,考虑一个圆心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。
Bresenham直线算法流程图圆的八对称性所以,只需要知道圆上的一个点的坐标 (x, y) ,利用八对称性,就能得到另外七个对称点的坐标。
和直线算法类似,Bresenham画圆算法也是用一系列离散的点来近似描述一个圆。
Bresenham画圆算法的流程图三.源代码#include "stdlib.h"#include "math.h"#include <gl/glut.h>//按坐标画点void draw(GLint xCoord, GLint yCoord){glBegin(GL_POINTS);//以点的形式glVertex2i(xCoord, yCoord);//在(xCoord, yCoord)坐标下画点glEnd();glFlush();//强制刷新}void Circle(GLint x,GLint y){int a=abs(x);//将x的绝对值赋给aint b=abs(y);//将y的绝对值赋给bint c=a*-1;//使c=a的相反数int d=b*-1;//使d=b的相反数draw(x, y); draw(y, x);draw(-x, y); draw(y, -x);draw(x, -y); draw(-y, x);draw (-x, -y); draw(-y, -x);//按照圆的对称性以圆心为对称点将四个象限的圆周画出for(int i=c;i<=a;i++){for(int j=d;j<=b;j++){draw(i,j);}}//以a,b,c,d为边界用点填充该圆}//主函数void BresenhamCircle(GLint r){int d, d1, d2, direct;GLint x,y;x=0;y=r;d = 2*(1-r);while(y>=0){Circle(x,y);if(d < 0){d1 = 2* (d+ y) -1;if(d1 <=0)direct = 1;elsedirect = 2;}else{if( d > 0){d2 = 2*(d-x)-1;if(d2 <= 0)direct = 2;elsedirect = 3;}elsedirect = 2;}switch(direct){case 1:x++;d+=2*x + 1;break;case 2:x++; y--;d+=2*(x-y+1) + 1;break;case 3:y--;d+=-2*y + 1;break;}}}void RenderScene(void){BresenhamCircle(50);//主函数调用}//当窗口大小改变时由GLUT函数调用void ChangeSize(GLsizei width, GLsizei Height){GLfloat aspectRatio;if (Height == 0){Height = 1;}glViewport(0, 0, width, Height);//指定视口矩形左下角glMatrixMode(GL_PROJECTION);//指定当前矩阵,对投影矩阵应用随后的矩阵操glLoadIdentity();// 装载单位矩阵aspectRatio = (GLfloat)width / (GLfloat) Height;if (width <= Height){glOrtho(-100.0, 100.0, -100.0 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);}else{glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);}glMatrixMode(GL_MODELVIEW);//指定当前矩阵,对模型视景矩阵堆栈应用随后的矩阵操作glLoadIdentity();// 装载单位矩阵}//主程序入口void main(void){glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置初始显示模式,指定单缓存窗口,指定RGB 颜色模式的窗口glutCreateWindow("圆");//创建窗口,窗口名称为“圆”glutDisplayFunc(RenderScene);//进行画图glutReshapeFunc(ChangeSize);//重画回调函数glutMainLoop();//进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环}四.结果截屏五.出现问题及解决方案1.对于如何填充整个圆一开始没有好的方法,后来决定每画一个点,就将该横坐标的所有纵坐标点画出,从下到上,整个填充圆从中间到两边形成。
计算机图形学实验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/8f39fa649ec3d5bbfd0a74db.png)
信息与计算科学专业基础课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 的改变生成直线。
计算机图形学——圆的扫描转换(基本光栅图形算法)
![计算机图形学——圆的扫描转换(基本光栅图形算法)](https://img.taocdn.com/s3/m/1a643c78001ca300a6c30c22590102020740f237.png)
计算机图形学——圆的扫描转换(基本光栅图形算法)与直线的⽣成类似,圆弧⽣成算法的好坏直接影响到绘图的效率。
本篇博客将讨论圆弧⽣成的3个主要算法,正负法、Bresenham 法和圆的多边形迫近法,在介绍算法时,只考虑圆⼼在原点,半径为R的情况。
⼀、正负法1、基本原理假设已选取Pi-1为第i-1个像素,则如果Pi-1在圆内,就要向圆外⽅向⾛⼀步;若已在圆外就要向圆内⾛⼀步。
总之,尽量贴近圆的轮廓线。
2、正负法的具体实现1)圆的表⽰:设圆的圆⼼为(0,0),半径为R,则圆的⽅程为:F(x,y)=x2+y2–R2=0当点(x,y)在圆内时,F(x,y)<0。
当点(x,y)在圆外时,F(x,y)>0。
2)实现步骤第1步:x0=0,y0=R第2步:求得Pi(x i,y i)后找点P i+1的原则为:当P i在圆内时(F(xi,yi)≤0),要向右⾛⼀步得P i+1,这是向圆外⽅向⾛去。
取x i+1= x i+1, y i+1= y i当P i在圆外时(F(xi,yi)>0),要向下⾛⼀步得P i+1,这是向圆内⽅向⾛去,取x i+1= x i, y i+1= y i-1⽤来表⽰圆弧的点均在圆弧附近且 F(xi, yi)时正时负假设已经得到点(x i, y i),则容易算出F(x i, y i),即确定了下⼀个点(x i+1, y i+1),则如何计算F(x i+1, y i+1),以确定下下个点(x i+2, y i+2)?分为两种情况:右⾛⼀步后:x i+1=x i+1,y i+1=y i,此时:F(x i+1, y i+1)=x i+12+y i2-R2=x i2+y i2-R2+2x i+1 = F(x i, y i)+2x i+1下⾛⼀步后:x i+1=x i,y i+1=y i-1, 此时:F(x i+1, y i+1)=x i2+(y i-1)2-R2= F(x i, y i)-2y i+1由此可得:确定了F(xi+1, yi+1)之后,即可决定下⼀个点(xi+2, yi+2),选择道理同上。
计算机图形学圆的生成算法的实现
![计算机图形学圆的生成算法的实现](https://img.taocdn.com/s3/m/a35b36f93186bceb19e8bbcb.png)
}
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姓名曲凯歌分数
计算机图形学圆弧生成算法具体程序实现
![计算机图形学圆弧生成算法具体程序实现](https://img.taocdn.com/s3/m/f64b5813a216147917112873.png)
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:
}
计算机图形学直线曲线和圆等等算法代码及截图
![计算机图形学直线曲线和圆等等算法代码及截图](https://img.taocdn.com/s3/m/74a60c757fd5360cba1adb09.png)
计算机图形学期中作业姓名:学号:专业:计算机科学与技术班级:2班基本算法:#include <graphics.h>#include<stdio.h>#include <conio.h>#include<math.h>#define ROUND(a) ((int)(a+0.5))void lineDDA (int x1, int y1, int x2, int y2,int color) //DDA 画直线 int ROUND(float a) {return (int)(a+0.5);} {int i;float x,y,k;k=(float)(y2-y1)/(x2-x1);x=(float)x1, y=(float)y1;if (k<=1)for (i=x1 ; i<=x2 ; i++){ putpixel (ROUND(x), ROUND(y),color);x=x+1;y=y+k;}elsefor (i=y1;i<=y2;i++){ putpixel (ROUND(x), ROUND(y),color);x=x+1/k;y=y+1;}void lineBre(int xs, int ys, int xe, int ye,int color) //Bresenham画直线{ int x,y, k, steps;float m, e;m=(float)(ye-ys)/(xe-xs);e=m-0.5;steps=xe-xs;x=xs;y=ys;for (k=0; k<steps; k++){putpixel(x,y,color);if(e>=0){y=y+1;e= e-1;}x=x+1;e=e+m;}void Bs_Mid_Line(int x1,int y1,int x2,int y2,int color) //笔刷画直线{int i,j; int x,y;int a,b; a=y1-y2;b=x2-x1;int cy=(a<=0 ? 1:(a=-a,-1));int cx=(b>=0 ? 1:(b=-b,-1));x=x1; y=y1; for(i=-2; i<=2;i++)for(j=-2; j<=2;j++)putpixel(x,y,color);int d,d1,d2;if(-a<=b) //直线斜率绝对值小于等于1{ d=2*a+b;d1=2*a;d2=2*(a+b);while(x!=x2){if(d<0){x+=cx;y+=cy;d+=d2;}else{x+=cx;d+=d1;}for(i=-2; i<=2;i++)for(j=-2; j<=2;j++)putpixel(x+i,y+j,color);}}else //直线斜率绝对值大于1{ d=2*b+a;d1=2*b;d2=2*(a+b);while(y!=y2){ if(d<0){y+=cy;d+=d1;}else{x+=cx;y+=cy;d+=d2;}for(i=-2; i<=2;i++)for(j=-2; j<=2;j++)putpixel(x+i,y+j,color);}}}void line (int x1,int y1,int x2,int y2,int color)//驻点比较画直线{int x,y,n;int f;n=(x2-x1)+(y2-y1);x=x1;y=y1;f=y*x2-y2+x;for (int i=1; i<=n; i++){ putpixel(x,y,color);if (f>=0){x=x+1;y=y;}else{x=x;y=y+1;}f=y*x2-y2*x;}}void circleMidpoint (int xc, int yc, int r)//中点画圆法{int x=0;int y=r;int p=1-r;void circleplotpoints(int, int, int, int);circleplotpoints(xc, yc, x,y);while(x<y){x++;if ( p<0)p+=2*x+1;else{y--;p+=2*(x-y)+1;}circleplotpoints(xc, yc, x,y);}}void circleplotpoints (int xc, int yc, int x, int y){putpixel(xc+x, yc+y,YELLOW);putpixel(xc-x, yc+y,YELLOW);putpixel(xc+x, yc-y,YELLOW);putpixel(xc-x, yc-y,YELLOW);putpixel(xc+y, yc+x,YELLOW);putpixel(xc-y, yc+x,YELLOW);putpixel(xc+y, yc-x,YELLOW);putpixel(xc-y, yc-x,YELLOW);}arc(int xc, int yc, double r, double ts, double te) //数值微分法产生园弧(DDA算法){ double rad, tsl ,tel, deg, dte,ta, ct,st;int x,y,n,i;rad=0.0174533;tsl=ts*rad;tel=te*rad;if (r<5.08)deg=0.015;else if (r<7.62)deg=0.06;else if (r<25.4)deg=0.075;elsedeg=0.15;dte=deg*25.4/r;if (tel<tsl)tel=tel+6.28319;n=(int)((tel-tsl)/dte+0.5);if (n==0)n=(int)(6.28319/dte+0.5);ta=tsl;x=xc+r*cos(tsl);y=yc+r*sin(tsl);moveto (x,y);for ( i=1; i<=n; i++){ta=ta+dte;ct=cos(ta);st=sin(ta);x=xc+r*ct;y=yc+r*st;lineto (x,y);}x=xc+r*cos(tel);y=yc+r*sin(tel);lineto (x,y);return (0);}void circleBre(int r) //Bresenham画园算法{ int x=0, y=r, d=3-2*r;while (x<y){putpixel (x,y,RED);if (d<0)d=d+4*x+6;else{d=d+4*(x-y)+10;y=y-1;}x=x+1;}if (x==y)putpixel(x,y,RED);}ellipse (int xc, int yc, double a, double b, double alp, double ts, double te) //角度DDA法产生椭圆弧{double rad, tsl, tel, alpl, deg, dte, r, ta, a1,a2,b1,b2; int x,y,n,i;rad=0.0174533;tsl=ts*rad;tel=te*rad;alpl=alp*rad;a1=a*cos(tsl);b1=cos(alpl);a2=b*sin(tsl);b2=sin(alpl);r=(a>b)?a:b;if (r<5.08)deg=0.015;else if (r>7.62)deg=0.06;else if (r<25.4)deg=0.075;elsedeg=0.15;dte=deg*25.4/r;if (tel<tsl)tel+=6.28319;n=(int)(6.28319/dte+0.5); ta=tsl;x=xc+a1*b1-a2*b2;y=yc+a1*b2+a2*b1;moveto (x,y);for (i=1;i<=n;i++){ta+=dte;a1=a*cos(ta);a2=b*sin(ta);x=xc+a1*b1-a2*b2;y=yc+a1*b2+a2*b1;lineto (x,y);}a1=a*cos(tel);a2=b*sin(tel);x=xc+a1*b1-a2*b2;y=(int)yc+a1*b2+a2*b1;lineto (x,y);return(0);}void ellipse (int x0, int y0, int a, int b, int dt) {int x,y,n,i;float t1, t=0.0;t1=(float)dt*0.0174533;n=360/dt;moveto (x0+a, y0);for (i=1;i<n; i++){t=t+t1;x=(int)x0+a*cos(t);y=(int)y0+b*sin(t);lineto (x,y);}lineto (x0+a, y0);}Par(int xs, int ys, int xm, int ym, int xe, int ye) //二次曲线的参数拟合法{double d, d1, ax, ay, bx,by;int n,i;ax=(xe-2*xm+xs)*2.0;ay=(ye-2*ym+ys)*2.0;bx=(xe-xs-ax);by=(ye-ys-ay);n=(int)sqrt(ax*ax+ay*ay)/4;n=(int)sqrt(n*100);moveto (xs,ys);d=1.0/n;d1=d;for (i=0; i<=n;i++){ lineto ((int)( ax*d1*d1+bx*d1+xs), (int) (ay*d1*d1+by*d1+ys));d1=d1+d;}lineto (xe, ye);return (0);}void main(){printf("1: DDA画直线.\n");printf("2: Bresenham 画直线.\n");printf("3: 笔刷画直线.\n");printf("4: 驻点比较画直线.\n");printf("5: 中点画圆法.\n");printf("6: 数值微分法产生园弧(DDA算法).\n");printf("7: Bresenham画园算法.\n");printf("8: 角度DDA法产生椭圆弧.\n");printf("9: 二次曲线的参数拟合法.\n");printf("0: 退出.\n\n");while(true){printf("请输入你要选择的方法:\n");int a;scanf("%d",&a);switch(a){case 0:exit(0);case 1:initgraph(640, 480);lineDDA(100,100,400,450,YELLOW);break;case 2:initgraph(640, 480);lineBre(100, 100, 450, 500,YELLOW);break;case 3:initgraph(640, 480);Bs_Mid_Line(100,100,450,500,YELLOW);break;case 4:initgraph(640, 480);line (100,100,450,500,YELLOW);break;case 5:initgraph(640, 480);circleMidpoint (100, 100, 50) ;break;case 6:initgraph(640, 480);arc(200, 200, 100, 30, 90);break;case 7:initgraph(640, 480);circleBre(100);break;case 8:initgraph(640, 480);ellipse (100, 100, 50, 60, 20, 30, 90) ; break;case 9:initgraph(640, 480);Par(100, 100, 300, 350, 50, 100);break;case 10:default :printf("错误\n");}getch();cleardevice();closegraph();}}程序运行截图如下:。
《计算机图形学》实验报告
![《计算机图形学》实验报告](https://img.taocdn.com/s3/m/54c38d9d59f5f61fb7360b4c2e3f5727a5e924d2.png)
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
计算机图形学实验三:圆的生成算法的实现
![计算机图形学实验三:圆的生成算法的实现](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/b07bf587f18583d0496459e7.png)
12直线生成算法圆弧绘制算法图元的概念33.1 图元的概念为其颜色值。
3.1 图元的概念3.1 图元的概念12直线生成算法圆弧绘制算法图元的概念33.2 直线生成算法曲线和各种复杂的图形均是离散成许多直线段来绘制,因而直线是二维图形生成技术的基础。
数学上的理想直线没有宽度,是由无数个点构成的集合。
对直线进行光栅化时,只能在显示器所给定的有限个像素组成的点阵中,选择能最好地逼近于该直线的一组像素,并对这些像素进行写操作。
这就是通常所说的用显示器绘制直线,即直线的扫描转换。
直线扫描转换的主要工作:快速找出像素点阵中最近的网格点3.2 直线生成算法画一条从近直线的像素序列,并填入色彩数据的过程。
这一过程也称为直线光栅化。
需要解决的问题►连续性►粗细、亮度要均匀►像素逼近待画直线►速度3.2 直线生成算法 问题1问题3.2 直线生成算法常用的直线生成算法有三种:►►►►►►3.2 直线生成算法基本思路:是用数值方法求解微分方程的一种方法,即根据长移动,由此产生连续的像素坐标3.2 直线生成算法设起点和终点坐标分别为Δx令即第3.2 直线生成算法于是有步的结果加上一个增量得到。
该算法在方向增量为3.2 直线生成算法3.2 直线生成算法下图中,用公式(表示,但显示时要用像素来表示,即采用舍入的办法得到最靠近空心圆点的像素,用这些像素(下图中的实心圆点)来表示直线。
3.2 直线生成算法void LineDDA(int{int} }3.2 直线生成算法►►想位置的偏移;►►整运算,运行效率低且取整运算不利于硬件实现基本思路:假定直线斜率P(x p,y的中点,---如果取---如果取---M与问题转换为如何判断构造判别式假设直线方程为:则由数学知识可知有下面的关系:F(F(F(所以,欲判断Q点下方,只需要把中点并检查它的符号。
构造判别式d=F(=a(当d<0取右上方当d≥0取右方P判别式的增量算法当增量为若增量为其它斜率的情况时再将算法设计:画线从d0可以用d0算法设计:例:用中点画线法12345void MidpointLine (int x { int a, b, d} /* mid PointLine */设直线的起点坐标为的情况来说明该算法。
计算机图形学划线实验报告
![计算机图形学划线实验报告](https://img.taocdn.com/s3/m/bbe16cb0f424ccbff121dd36a32d7375a517c641.png)
计算机图形学划线实验报告《计算机图形学》实验报告实验⼀直线、圆(弧)⽣成算法⼀、实验⽬的及要求1. 了解光栅图形显⽰器的⼯作原理和特点;2. 学习C/VC环境下的基本绘图⽅法;3. 实践与巩固直线的基本⽣成算法。
4. 掌握直线扫描转换算法的原理及实现;5. 学习圆(弧)的基本⽣成算法;6. 实践圆(弧)的基本⽣成算法;7. 掌握圆弧扫描转换算法的原理及实现;⼆、理论基础1、有关直线⽣成算法有DDA(数值微分)、中点画线线算法、Bresenham⽣成算法数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。
假设起点的坐标为整数。
让x递增1,y相应递增k。
中点划线算法中若直线在x⽅向增加⼀个单位,y的增量只能在0、1之间。
假设当前像素点已经确定,下⼀像素点就只可能有两种情况,将这两点的中点带⼊直线⽅程中,通过中点在直线的上、下⽅来判断下⼀点的坐标。
Bresenham算法是通过各⾏、各列像素中⼼构造⼀组虚拟⽹络格线,按直线从起点到中点的顺序计算直线与各垂直⽹格线的交点,然后确定该列像素中与此交点最近的像素。
2、有关画圆的算法圆的扫描转换(中点画圆法)、Bresenham画圆算法圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第⼀象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。
之后通过对称画出全部圆。
Bresenham画圆算法考虑圆在第⼀象限上的点,每确定⼀像素,则下⼀像素有三种可能,通过判断右下⽅的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。
三、算法设计与分析1、数值微分法int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|<=1float dx,dy,k,x,y;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x<=x1;x++){pDC->SetPixel(x,int(y+0.5),color);y=y+k;}该程序中每⼀步的x、y值是⽤前⼀步的值加上⼀个增量来获得的。
计算机图形学-画椭圆和圆
![计算机图形学-画椭圆和圆](https://img.taocdn.com/s3/m/033c2fb7a300a6c30c229ffa.png)
}
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程序
简述中点画圆算法的原理与特点
![简述中点画圆算法的原理与特点](https://img.taocdn.com/s3/m/0b22cdbe4793daef5ef7ba0d4a7302768e996f84.png)
简述中点画圆算法的原理与特点中点画圆算法是一种用于绘制圆形的计算机图形学算法,它通过计算圆弧上的点坐标来进行绘制。
该算法的原理是从圆弧的一个起始点开始,按照顺时针或逆时针方向依次计算下一个点的坐标,直到绘制完整的圆弧。
中点画圆算法的原理如下:1.获得圆的半径r和圆心坐标(h,k)。
2.设置初始点(x0,y0)为(0,r)。
3.计算初始决策参数d=1/4-r。
4.在每条径向的切点上绘制像素,每次转变d的符号。
5.根据决策参数的变化情况选择8个可能的下一个点中的一个,并将d根据选择情况进行相应的更新。
特点:1.中点画圆算法具有高效性,相较于传统的连续采样和扫描线算法,中点画圆算法具有更低的运算成本,绘制速度更快。
2.算法能够绘制出较为平滑的圆弧,不会产生明显的锯齿状边缘。
3.算法适用于绘制任意大小的圆,且绘制结果与圆的大小无关。
4.算法实现简单,仅需要基本的数学运算,可以在计算机图形学中广泛应用。
具体步骤及示例说明:假设要绘制一个圆的半径r为8个像素,圆心坐标为(20,20)。
1.设置初始点(x0,y0)为(0,r)。
2.计算初始决策参数d=1/4-r。
在此例中,初始决策参数d=1/4-8=-73.根据初始决策参数d的值选择下一个点的坐标。
由于d<0,所以选择坐标(x1,y1)为(x0+1,y0)=(1,8)。
更新决策参数d=d+(2x1+1)-(2y1-1)=-7+3-16=-20。
4.绘制点(x1,y1),即第一个点(1,8)。
5.重复以上步骤,直到决策参数d>0。
下一个点的坐标(x2,y2)根据决策参数的值选择。
由于d<0,所以选择坐标(x2,y2)为(x1+1,y1-1)=(2,7)。
更新决策参数d=d+(2x2+1)-(2y2-1)=-20+5-14=-296.绘制点(x2,y2)。
以此类推,直到决策参数d>0,产生了一个完整的圆。
通过上述步骤,可以得到以半径r为8的圆的像素坐标集合,绘制出了一个圆。
计算机图形学实验三 圆的生成算法的实现
![计算机图形学实验三 圆的生成算法的实现](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/7b54b4f759f5f61fb7360b4c2e3f5727a5e924bf.png)
中点圆生成算法中点圆生成算法是计算机图形学中一种常见的绘制圆形的算法,其原理比较简单却能够高效地绘制圆形。
下面将从原理、步骤以及优缺点三个方面对中点圆生成算法进行阐述。
一、原理中点圆生成算法是利用对称性质,以圆心为基点,左上、左下、右上、右下四个位置的点关于当前绘制点的对称点来圆形绘制。
因为每个点都是基于上一步的绘点而确定,因此使得算法计算量较小,绘制速度较快。
二、步骤中点圆生成算法的具体实现可以分解为以下几个步骤:1. 设置圆形中心点的坐标及半径长度,以及圆形线条的粗细等属性。
2. 初始化第一个点位置,初值为(0, r),其中r为圆形半径。
3. 设置绘制一个八分之一圆的条件,即x <= y。
4. 根据对称性质,绘制后面的七个八分之一,且每个八分之一均以第一个点坐标为基准,分别绘制左上、左下、右上、右下四个位置的点。
5. 计算每个点离中心点的距离,若距离小于等于半径,则该点上色。
6. 循环递增y,直到y>0为止,即一整个圆绘制完毕。
三、优缺点中点圆生成算法的优点在于计算量低、绘制速度快、绘制圆形较为精细,同时还具有较好的对称性,易于理解和使用。
然而也存在一些局限性和负面效果,例如因为仅仅以基点对称方式设定绘制点位置,可能导致一些误差和不对称的现象。
同时,该方法虽然绘制圆形速度快,但对于其他曲线的绘制来说,效果可能就不如其他算法。
总之,中点圆生成算法是一种简单易用的计算机图形学算法,其快速绘制圆形的优点得到了广泛的应用,同时也因为其一些局限性而不适合其他形态的曲线绘制,需要根据实际需求来选择使用。
c画圆算法
![c画圆算法](https://img.taocdn.com/s3/m/ae5c4e27fe00bed5b9f3f90f76c66137ee064f95.png)
c画圆算法以C语言为基础,画圆算法是计算机图形学中的重要内容之一。
在计算机图形学中,画圆算法是指通过计算机程序实现绘制圆形的过程。
本文将介绍一种常用的画圆算法——中点画圆算法,并详细解释其原理和实现方法。
一、中点画圆算法原理中点画圆算法是一种基于对称性的算法,其基本原理是通过计算圆的八分之一弧度,在每个弧度上找到最接近圆周的像素点,然后通过对称性将其余部分的像素点也绘制出来。
具体来说,中点画圆算法的原理如下:1. 定义一个圆的中心点坐标(x0, y0)和半径r;2. 初始化两个变量x和y,分别表示圆的第一个像素点的横坐标和纵坐标;3. 计算初始的决策参数d,即d=1.25-r;4. 在每个八分之一弧度上,根据决策参数d的值来决定下一个像素点的位置,并更新决策参数d的值;5. 通过对称性将其他七个八分之一弧度上的像素点也绘制出来。
二、中点画圆算法实现中点画圆算法的实现通常使用C语言编写。
下面是一个简单的C语言程序,实现了中点画圆算法:```c#include <stdio.h>#include <graphics.h>void midpoint_circle(int x0, int y0, int r) {int x = 0;int y = r;int d = 1 - r;while (x <= y){putpixel(x0 + x, y0 + y, WHITE); putpixel(x0 + y, y0 + x, WHITE); putpixel(x0 - x, y0 + y, WHITE);putpixel(x0 - y, y0 + x, WHITE);putpixel(x0 + x, y0 - y, WHITE);putpixel(x0 + y, y0 - x, WHITE);putpixel(x0 - x, y0 - y, WHITE);putpixel(x0 - y, y0 - x, WHITE);if (d < 0)d += 2 * x + 3;else{d += 2 * (x - y) + 5; y--;}x++;}}int main(){int gd = DETECT, gm;initgraph(&gd, &gm, "");int x0 = 320;int y0 = 240;int r = 100;midpoint_circle(x0, y0, r);getch();closegraph();return 0;}```以上是一个使用C语言编写的中点画圆算法的示例程序。
像素画圆算法
![像素画圆算法](https://img.taocdn.com/s3/m/1b3e06ea250c844769eae009581b6bd97f19bcc4.png)
像素画圆算法像素画圆算法是一种用于在计算机屏幕上绘制圆形的算法。
在计算机图形学中,像素是构成图像的最小单位,而像素画圆算法的目的就是通过在屏幕上绘制一系列像素点来近似地画出一个圆形。
像素画圆算法有多种实现方式,其中最常见且简单的算法是中点画圆算法。
该算法从圆的起点开始,逐渐向外扩展,每次迭代时根据当前像素点的位置与圆心的距离,来确定下一个像素点的位置。
在中点画圆算法中,可以通过比较当前像素点的位置与圆心的距离与半径的关系,来确定下一个像素点的位置。
具体来说,当距离小于半径时,该像素点在圆内;当距离等于半径时,该像素点在圆上;当距离大于半径时,该像素点在圆外。
为了实现像素画圆算法,我们需要首先确定圆的中心坐标和半径。
然后,从圆的起点开始,根据中点画圆算法的原理,迭代计算每个像素点的位置,并将其绘制到屏幕上。
中点画圆算法的核心思想是利用一个决策参数来选择下一个像素点的位置。
在每次迭代中,根据当前像素点的位置与圆心的距离与半径的关系,决定下一个像素点的位置。
具体来说,如果决策参数小于0,表示下一个像素点在圆内,此时选择当前像素点的右侧点作为下一个像素点;如果决策参数大于0,表示下一个像素点在圆外,此时选择当前像素点的右上方点作为下一个像素点;如果决策参数等于0,表示下一个像素点在圆上,此时选择当前像素点的右上方点或右侧点作为下一个像素点。
通过不断迭代计算每个像素点的位置,直到绘制完整个圆形。
在实际应用中,为了提高绘制速度,通常会结合使用其他优化技术,如基于对称性的绘制和使用画弧算法等。
总结起来,像素画圆算法是一种用于在计算机屏幕上绘制圆形的算法。
它基于中点画圆算法的原理,通过迭代计算每个像素点的位置,来近似地画出一个圆形。
通过合理选择下一个像素点的位置,可以有效地减少计算量,提高绘制速度。
在实际应用中,像素画圆算法常常与其他优化技术结合使用,以达到更好的效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学--圆的的生成算法的实现
实验三:圆的的生成算法的实现
班级08信计2班学号20080502063 姓名李宁分数
一、实验目的与要求:
1、了解WIN-TC1.72等编程环境中常用控件命令与绘图函数,初步掌
握在实验设
计集成环境下进行图形处理程序的设计方法。
2、熟练掌握圆的两种换算法:基于正负算法画圆和基于中点算法画圆。
、二、实验内容:
1、在WIN-TC1.72环境中设计程序,利用消息处理函数,搭建能运行
图形算法程
序的平台。
2、根据教材中给定的算法,实现圆的两种生成算法:基于中点算法画圆和基于
正负算法
三、实验结果分析:
1、实验程序
(1)基于中点算法画圆程序实现的完整源程序
#include <graphics.h>
#include <conio.h>
// 中点画圆法
void Circle_Midpoint(int x, int y, int r, int color)
{
int tx = 0, ty = r, d = 1 - r;
while(tx <= ty)
{
// 利用圆的八分对称性画点
putpixel(x + tx, y + ty, color);
putpixel(x + tx, y - ty, color);
putpixel(x - tx, y + ty, color);
putpixel(x - tx, y - ty, color);
putpixel(x + ty, y + tx, color);
putpixel(x + ty, y - tx, color);
putpixel(x - ty, y + tx, color);
putpixel(x - ty, y - tx, color);
if(d < 0)
d += 2 * tx + 3;
else
d += 2 * (tx - ty) + 5, ty--;
tx++;
}
}
// 主函数
void main()
{
initgraph(640, 480);
// 测试画圆
Circle_Midpoint(320, 240, 200, RED);
Circle_Midpoint(320, 240, 101, RED);
// 按任意键退出
getch();
closegraph();
}
(2)基于正负算法程序实现的完整源程序
#include <graphics.h>
#include <conio.h>
// 正负画圆法
void Circle_PN(int x, int y, int r, int color) {
int tx = 0, ty = r, f = 0;
while(tx <= ty)
{
// 利用圆的八分对称性画点
putpixel(x + tx, y + ty, color);
putpixel(x + tx, y - ty, color);
putpixel(x - tx, y + ty, color);
putpixel(x - tx, y - ty, color);
putpixel(x + ty, y + tx, color);
putpixel(x + ty, y - tx, color);
putpixel(x - ty, y + tx, color);
putpixel(x - ty, y - tx, color);
if(f <= 0)
f = f + 2 * tx + 1, tx++;
else
f = f - 2 * ty + 1, ty--;
}
}
// 主函数
void main()
{
initgraph(640, 480);
// 测试画圆
Circle_PN(320, 240, 200, RED); Circle_PN(320, 240, 101, RED);
// 按任意键退出
getch();
closegraph();
}
2、实验结果
中点算法运行结果:
基于正负算法结果
、
四、实验结果分析
该实验基于中点算法和正负算法画圆的基本函数,设计出直线的图像的程序。
按照画园的方法可以分为以下几种方法,分别是生成圆的Bresenham 算法和正负算法和中点算法。
在任何调用这些图形模式的功能函数的程序中,都应该在程序的说明部分。
通过对程序的编
辑,运行,就可以得到非常形象生动的动画。
通过对程序的分析与学习,使我学到了如何熟悉圆的生成算法,掌握圆的绘制。
通过应用基本函数,编写程序,然后才能使用一些基本的图形函数,进行调用,编写程序,经过许多个步骤,编完之后应用TC软件进行调试,修改,最终才能得到想要的结果。