图形学实验报告二 圆的生成算法
计算机图形学--圆的生成算法的实现
实验三:圆的生成算法的实现班级 08信计2 学号 64 姓名刘辉分数一、实验目的和要求1.理解圆生成的基本原理,掌握几种常见的圆生成算法。
2.利用Visual C++ 实现圆生成的中点画圆的算法。
3.利用Visual C++ 实现圆的Bresenham算法。
4.简单了解其他算法。
二、实验内容:1.利用中点画图算法,在屏幕上生成任意一段圆弧。
2.利用图的对称性,将(1)题生成的圆弧扩展为一个整圆。
3.利用bresebham算法设计出一段圆弧。
三、实验步骤:1.预习教材关于圆的生成原理。
2.仿照教材关于圆生成的中点画圆算法和bresenham算法,使用C++实现该算法。
3.调试、编译、运行程序。
利用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;}}}实验结果:四、实验结果分析:Bresenham画圆算法是最有效的算法之一,通过画出八分之一的圆周,对称得到整个圆周,第一想先的图形,让X轴量平均增加,通过选择理想的Y轴坐标,确定得到整个图形,算法的实现简单,且时间复杂度较低。
计算机图形学实验03
计算机图形学实验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。
计算机图形学-三种直线生成算法及圆的生成算法
计算机科学与技术学院2013-2014学年第一学期《计算机图形学》实验报告班级:110341C学号:110341328姓名:田野教师:惠康华成绩:实验(一):平面图形直线和圆的生成一、实验目的与要求1.在掌握直线和圆的理论基础上,分析和掌握DDA生成直线算法、中点生成直线算法、Bresenham生成直线算法、中点画圆算法、Bresenham圆生成算法。
2.熟悉VC6.0MFC环境,利用C语言编程实现直线和圆的生成。
3.比较直线生成三种算法的异同,明确其优点和不足。
同时了解圆的生成算法适用范围。
二、实验内容1.掌握VC6.0环境中类向导和消息映射函数的概念,并且为本次实验做好编程准备工作。
2. 用C语言进行编程实现上述算法,并且调试顺利通过。
3. 在MFC图形界面中显示不同算法下的图形,并且注意对临界值、特殊值的检验。
完成后保存相关图形。
三、算法分析➢DDA直线生成算法描述:1)给定一直线起始点(x0,y0)和终点(x1,y1)。
分别计算dx=x1-x0,dy=y1-y0。
2)计算直线的斜率k=dy/dx。
当|k|<1时转向3);当|k|<=1时,转向4);3)当x每次增加1时,y增加k。
即(xi,yi)→(xi+1,yi+k)。
直到xi增加到x1。
并且每次把得到的坐标值利用系统函数扫描显示出来。
但要注意对y坐标要进行int(y+0.5)取整运算。
结束。
4)对y每次增加1时,x增加1/k,即(xi,yi)→(xi+1/k,yi+1)。
直到yi增加到y1. 并且每次把得到的坐标值利用系统函数扫描显示出来。
但要注意对x坐标要进行int(x+0.5)取整运算。
结束。
➢中点生成算法描述:算法基本思想:取当前点(xp,yp),那么直线下一点的可能取值只能近的正右方点P1(xp+1,yp)或者P2(xp+1,yp+1)。
为了确定好下一点,引入了这两点中的中点M(xp+1,yp+0.5)。
这时可以把改点带入所在直线方程,可以观察该中点与直线的位置关系。
计算机图形学--圆的生成算法的实现
计算机图形学--圆的生成算法的实现实验三圆的生成算法的实现班级信计学号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#include#include#includevoid 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)< p="">{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#include#include#include#includemain(){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圆弧就可以求出表示整个圆弧的像素集。
圆绘制算法实验报告
一、实验背景圆是几何图形中最基本的图形之一,在计算机图形学中,绘制圆是图形处理的基础。
本实验旨在通过实现圆的绘制算法,加深对计算机图形学基本概念和方法的理解,提高编程能力。
二、实验目的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. 编写代码实现两种算法,并进行测试。
圆及圆弧生成算法
圆及圆弧生成算法圆及圆弧生成算法是计算机图形学中常用的算法之一,用于生成圆及圆弧的几何形状。
圆是一个闭合曲线,由一系列连续的点组成,其到中心点的距离都相等。
圆弧是圆的一部分,也是由一系列点组成的曲线。
下面将介绍几种常见的圆及圆弧生成算法。
1.中点圆生成算法:中点圆生成算法是一种常用的生成圆形的算法。
该算法从圆心开始,逐步生成圆上其它点的坐标,直到生成整个圆。
算法的基本思想是在每一步中选择一个点,使得该点的距离到圆的实际弧路径最接近满足圆方程的距离。
具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为1-r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+2x+3,x=x+1,y=y;-如果d>=0,则令d=d+2x-2y+5,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。
2. Bresenham圆生成算法:Bresenham圆生成算法是基于中点圆生成算法的改进。
该算法的主要思想是通过对称性减少计算量,较中点圆生成算法更快速。
具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为3-2r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。
3.中点圆弧生成算法:中点圆弧生成算法是用于生成圆弧的算法。
该算法通过给定圆心、弧的起始点和终止点,计算圆弧上的所有点的坐标。
具体步骤如下:(1)初始化圆心、起始点和终止点坐标;(2)计算圆上点的初始参数值d,初始值根据起始点和终止点的位置关系计算得到;(3)按递增顺序计算圆弧上的点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;-输出当前点的坐标;(4)重复步骤(3)直到到达终止点。
2020年计算机图形学实验报告(例文)
计算机图形学实验报告9213 38 8 郭佩佩实验一建立计图实验环境 1.实验目的为了体现面向对象的程序设计思想,本实验采用基于Visual C 十十集成环境的 MFC 编程方法,从开发 windows 应用程序的角度,来建立一个菜单交互式绘图基本环境,为后续的实验打基础。
2.实验内容 1)建立菜单交互式绘图基本环境的工程文件 Vcad,运行后如图2)在绘图菜单的下拉子菜单下有如下菜单项直线----用弹性线方法输入直线的起止点后,调用 bresenham 算法替换原来的 moveto/lineto 算法画直线圆/圆弧----在该菜单选择后,可分别画圆或圆弧。
直线段裁剪 ----输入矩形域左上角及右下角后,产生裁剪区域;然后可输入若干条直线段,矩形域作为主裁剪域对其裁剪之。
面区填充----输入多边形的若干顶点后,调用面区填充算法对多边形域的内部填充之。
贝塞尔曲线 ----输入四顶点后,调用三次贝塞尔曲线生成算法生成贝塞尔曲线。
实验二园和园弧的绘制算法实验目的通过园和椭圆弧生成算法的上机调试,掌握1)VC++图形函数的使用方法; 2)圆和椭圆弧的生成原理。
2.实验内容 1)以函数形式编写圆的生成算法,然后在 VCAD 绘图小系统中的绘图----圆子菜单下找到合适的程序修改点,将本实验要求你编写的画圆算法插入工程文件中,通过调试来验证你编写的画圆算法的正确性。
2)以函数形式编写角度 DDA 椭圆弧生成算法,然后在 VCAD 绘图小系统中的绘图----圆弧子菜单下找到合适的程序修改点,将本实验要求你编写的画圆弧算法插入工程文件中,通过调试来验证你编写的画圆弧算法的正确性。
Arc(int xc,int yc,doubli r,double ts,double te) {double rad,ts1,tel,deg,dte,ta,ct,st;int x,y,n,I;rad=.174533;tsl=ts*rad;tel=te*rad;if(r<8)deg=.15;elseif(r<62)deg=.6;elseif(r<24)deg=.75;elsedeg=.15;dte=deg*24/r;if(tel<tsl)tel+=28319;n=(int)((tel-tsl)/dte+.5); if(n==)n=(int)(28319/dte+.5);ta=tsl;x=xc+r*cos(tsl);y=yc+r*sin(tsl);moveto(x,y);for(i=1;i<=n;i+++){ 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(); }实验三直线的裁剪( 编码裁剪算法)1.实验目的通过编码裁剪算法的设计与调试,了解二维线段的裁剪过程,提高程序设计能力与上机调试能力,达到理论与实践有机结合之目的。
西北师范大学计算机图形学实验报告二
西北师范大学学生实验报告学院地环学院专业地理信息系统年级、班08地信学号200875000203 姓名陈晨同组者课程名称计算机图形学实验题目圆和椭圆的绘制成绩一、实验目的:熟练掌握Bresenham画圆算法和中点椭圆算法。
二、实验准备:学习Bresenham画圆算法和中点椭圆算法,注意如何利用圆和椭圆的对称性以及绘制椭圆时考虑不同斜率条件下算法的变化。
三、实验内容:在.net环境中利用Bresenham画圆算法和中点椭圆算法绘制圆和椭圆,比较其与GDI+中提供的DrawEllipse ( )函数绘制的直线有何区别。
四、实验过程及步骤:(包括程序界面设计、控件属性说明、程序代码和程序运行四部分)(一)程序设计界面(二)控件属性说明pictureBox1:绘图区域textBox1:x坐标textBox2:y坐标textBox3:圆半径textBox4:椭圆长半轴textBox5:椭圆短半轴y--;}x++;}if (x == y)gra.DrawEllipse(Red, x1 + x, y1 + y, 1, 1); }private void button2_Click(object sender, EventArgs e) {Graphics gra = pictureBox1.CreateGraphics();gra.Clear(Color.White);Pen Orange = new Pen(Color.Orange, 2);int x, y, x1, y1, r, p;x1 = int.Parse(textBox1.Text);y1 = int.Parse(textBox2.Text);r = int.Parse(textBox3.Text);x = 0; y = r;p = 1 - r;while (x < y){gra.DrawEllipse(Orange, x1 + x, y1 + y, 1, 1); gra.DrawEllipse(Orange, x1 + y, y1 + x, 1, 1); gra.DrawEllipse(Orange, x1 + y, y1 - x, 1, 1); gra.DrawEllipse(Orange, x1 + x, y1 - y, 1, 1); gra.DrawEllipse(Orange, x1 - x, y1 - y, 1, 1); gra.DrawEllipse(Orange, x1 - y, y1 - x, 1, 1);gra.DrawEllipse(Orange, x1 - y, y1 + x, 1, 1); gra.DrawEllipse(Orange, x1 - x, y1 + y, 1, 1);if (p < 0)p += 2 * x + 2;else{p += 2 * (x - y) + 5;y--;}x++;gra.DrawEllipse(Orange, x1 + x, y1 + y, 1, 1); }}private void button3_Click(object sender, EventArgs e) {Graphics gra = pictureBox1.CreateGraphics();gra.Clear(Color.White);Pen Yellow = new Pen(Color.Yellow, 2);int x0, y0,r;x0 = int.Parse(textBox1.Text);y0 = int.Parse(textBox2.Text);r = int.Parse(textBox3.Text);gra.DrawEllipse(Yellow, x0-r, y0-r, 2*r, 2*r);}private void button4_Click(object sender, EventArgs e){Graphics gra = pictureBox1.CreateGraphics();gra.Clear(Color.White);Pen Green = new Pen(Color.Green, 2);int x0, y0;double Ry, Rx, x, y, k, p;x0 = int.Parse(textBox1.Text); y0 = int.Parse(textBox2.Text); Ry = int.Parse(textBox4.Text); Rx = int.Parse(textBox5.Text); x = 0; y = Ry;k = 0;p = Rx * Rx + 2 * Ry * Ry - 2 * Rx * Rx * Ry;while (k <= 0 && k >= -1){if (p < 0)p += 2 * Ry *Ry* (2 * x + 3);else{p += 2 * Ry * Ry * (2 * x + 3) - 4 * Rx * Rx * (y - 1); y--;}x++;k = -(Ry *Ry * x) / (Rx*Rx * y);gra.DrawEllipse(Green, (int)x + x0, (int)y + y0, 1, 1);gra.DrawEllipse(Green, (int)-x + x0, (int)y + y0, 1, 1);gra.DrawEllipse(Green, (int)x + x0, (int)-y + y0, 1, 1);gra.DrawEllipse(Green, (int)-x + x0, (int)-y + y0, 1, 1); }while (x <= Rx && k < -1){if (p < 0){p += 2 * Ry * Ry * (2 * x + 3) - 4 * Rx * Rx * (y - 1); x++;}else{p += -4 * Rx * Rx * (y - 1);}y--;k = -(Ry * Ry * x) / (Rx * Rx * y);gra.DrawEllipse(Green, (int)x + x0, (int)y + y0, 1, 1);gra.DrawEllipse(Green, (int)-x + x0, (int)y + y0, 1, 1);gra.DrawEllipse(Green, (int)x + x0, (int)-y + y0, 1, 1);gra.DrawEllipse(Green, (int)-x + x0, (int)-y + y0, 1, 1); }}private void button5_Click(object sender, EventArgs e){Graphics gra = pictureBox1.CreateGraphics();gra.Clear(Color.White);//Blue.Color = Color.Blue;//gra.DrawLine(Blue, x0, (int)(y0 - Ry), x0, (int)(y0 + Ry));//gra.DrawLine(Blue, (int)(x0 - Rx), y0, (int)(x0 + Rx), y0); }private void button6_Click(object sender, EventArgs e){Graphics gra = pictureBox1.CreateGraphics();gra.Clear(Color.White);Pen Purple = new Pen(Color.Purple, 2);int x0, y0, Rx, Ry;x0 = int.Parse(textBox1.Text);y0 = int.Parse(textBox2.Text);Ry = int.Parse(textBox4.Text);Rx = int.Parse(textBox5.Text);gra.DrawEllipse(Purple, x0 - Rx, y0 - Ry, 2 * Rx, 2 * Ry);}private void button7_Click(object sender, EventArgs e){textBox1.Text = "";textBox2.Text = "";textBox3.Text = "";}private void button8_Click(object sender, EventArgs e){this.Close();}}}教师意见:年月日。
计算机图形学圆的生成算法的实现
申明:
所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。
OnMidpointellispe
表1 生成圆和椭圆的菜单项资源及消息处理函数
<3)添加程序代码
在CMyView.cpp文件中相应的位置添加各算法的程序代码,在Visual C++的MFC中绘制图形,一般可以调用一个“CDC”类,从CDC开始,添加代码。5PCzVD7HxA
中点算法画圆。利用中点画圆算法画出圆心在 、半径为R的圆,其VC程序设计代码如下:
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
pDC->SetPixel(x+x0,-y+y0,color>。
}
ReleaseDC(pDC>。
}
图形学实验二
贵州大学实验报告学院:计信学院专业:计科班级:计科101X(1)=0;Y(1)=R; while y>x if d<0d=d+2*x+3; %取E 点 elsed=d+2*(x-y)+5;%取SE 点 y=y-1; end x=x+1; X(x+1)=x; Y(x+1)=y; end%利用对称性求其它七个八分圆 X1=Y;Y1=X; X2=-Y;Y2=X; X3=-X;Y3=Y; X4=Y;Y4=-X; X5=X;Y5=-Y; X6=-X;Y6=-Y; X7=-Y;Y7=-X;plot(X,Y,X,Y,'o',X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5,X6,Y6,X7,Y7); title('R=5');算法分析:二阶差分法:利用二阶差分降低增量的阶数二阶差分(降低增量的阶数,用差分法消除中点算法中的乘法运算)。
中点算法中:1,如在现有点p(x p ,y p )上,对p+1点选择了E(x p +1,y p )点 (1)增量ΔE二阶差分增量为:2=∆-∆old newE E (2)增量ΔSE32+=∆i x E 5)(2+-=∆i i y x SE 32+=∆p old x E 3)1(2++=∆p new x E ⎩⎨⎧≥∆+<∆+=+001i ii i i i i d SE d d E d d二阶差分增量为:2=∆-∆oldnew SE SE2,如在现有点p(x p ,y p )上,对p+1点选择了SE(x p +1,y p -1)点 (1)增量ΔE二阶差分增量为:2=∆-∆old new E E(2)增量ΔSE二阶差分增量为:4=∆-∆old new SE SE算法步骤:1,依据上一次迭代中的d 的符号来选择现在点E 或SE (d0=1-R); 2,用在上一次迭代计算的和来计算新的d ;3,用移到新象素点的二次差分值,并用它来更新和移到下一点。
《计算机图形学》实验报告
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
计算机图形学 实验2圆弧生成算法
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
计算机图形学划线实验报告
计算机图形学划线实验报告《计算机图形学》实验报告实验⼀直线、圆(弧)⽣成算法⼀、实验⽬的及要求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值是⽤前⼀步的值加上⼀个增量来获得的。
计算机图形学实验二
计算机图形学实验指导书信息科学技术学院二○一三年十一月计算机图形学实验报告实验名称直线、圆弧及曲线的生成算法评分实验日期2013 年11 月 6 日指导教师姓名专业班级11地信学号2011083027一、实验目的1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。
2、掌握用像素点法直接生成其它曲线的方法。
二、实验要求1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。
三、关键算法及实现原理1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham 生成算法。
直线Bresenham生成算法思想如下(第一象限,且斜率k<1的情况图2-1 a 中的1a):1)画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-dx,i=1;2)求直线下一点位置x i+1=x i+1 如果P i>0,则y i+1=y i+1,否则y i+1=y i;3)画点(x i+1,y i+1);4)求下一个误差P i+1点,如果P i>0,则P i+1=P i+2dy-2dx,否则P i+1=P i+2dy;5)i=i+1,如果i<dx+1则转步骤2,否则结束操作。
Bresenham生成算法的优点如下;1)不必计算直线的斜率,因此不做除法。
2)不用浮点数,只用整数。
3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。
Bresenham算法的速度很快,并适于用硬件实现。
对于图2-1 a中的2a,只需将x i+1=x i+1改为x i+1=x i-1。
对于图2-1 a中的1b,斜率k>1的情况,可交换变量x和y,y每次长1个单位。
对P i进行判断,x i+1=x i或x i+1=x i+1。
2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。
实验2 圆的扫描生成算法
实验2圆\椭圆的扫描生成算法一、实验目的理解圆\椭圆的扫描生成原理,掌握圆\椭圆的扫描生成算法。
二、实验内容用Bresenham算法画圆的步骤为:(1)求误差初值,p1=3-2r;i=1;画点(0,r);(2)求下一个光栅位置:x i+1=x i+1;if p i<0则y i+1=yi;否则y i+1=y i-1;(3)画点(x i+1,y i+1);(4)计算下一个误差:if p i<0则p i+1=p i+4x i+6;否则p i+1=p i+4(x i-y i)+10;(5)i=i+1;if x=y则end;否则返2)。
用Bresenham算法画椭圆的步骤为:(1)输入椭圆长半轴的长度a和短半轴的长度b上半段(2)求误差初值d10,d10=b2+a2(-b+0.25),将该值赋给变量d;(3)绘制点(x,y),其中x=0,y=b及其在另外3个象限上的对称点;(4)根据d的符号取增量,d<0,则先执行d=d+b2(2x+3),再将(x,y)修改为(x+1,y),否则先执行d=d+b2(2x+3)+a2(-2y+2),再将(x,y)修改为(x+1,y-1)。
(5)当b2(x+1)<a2(y-0.5)时,重复步骤三和四,否则,转到步骤六。
下半段(6)计算下半部分的判别式初值d20,d20=b2(x+0.5)2+a2(y-1)2-a2b2,其中(x,y)是上半部计算的最后一点(x,y),计算后将d20赋给变量d;(7)绘制点(x,y),及其在另外3个象限上的对称点;(8)根据d的符号取增量,d<0,则先执行d=d+b2(2x+2)+a2(-2y+3),再将(x,y)修改为(x+1,y-1),否则先执行d=d+a2(-2y+3),再将(x,y)修改为(x,y-1)。
(9)当y>=0时,重复步骤七和八,否则,算法结束。
三、实验要求编程实现Bresenham算法生成圆\椭圆。
贵州大学--实验二:圆和椭圆的生成算法
贵州大学实验报告
学院:计算机科学与信息学院 姓名 实验时间 实验项目名称 实 验 目 的 1, 掌握圆的基本特性(八对称性) 实 2, 掌握椭圆的基本特性(四对称性) 验 3, 掌握中点算法和二次差分法的思想 要 4, 熟练的编写出测试代码 求 一、中点算法画圆和椭圆的实验原理 (一) 画圆 因为圆具有八对称性,可以先画出第二个八分圆, 利用八对称性画出其它八分圆。已知圆弧的隐函数 的形式为:F(x,y)=x2+y2-R2=0。所以可知: 实 验 原 理 F(x,y)>0,(x,y)在园外; F(x,y)<0,(x,y)在园内, F(x,y)=0,(x,y)在园上。 假设(xi,yi)为已确定的象素坐标, 则下一个象素只能是正右方的 T 点或右下方的 B 点。 设 M 是 T 和 B 的中点,则 M 的坐标为(xi+1,yi-0.5) F(x,y)<0 F(x,y)=0 F(x,y)>0 掌握圆和椭圆的中点算法及二次差分法, 了解并掌握在光栅显示系统中圆和椭圆的生成 和显示算法,并在自己熟悉的平台上实现相应的测试代码。 学号 指导教师 实验二:圆和椭圆的生成算法 专业:软件工程 班级:102 实验组 成绩
2 2 2 2 2 2
实 硬件平台:PC 机 验 软 环 编程语言:java 境 1. 掌握中点算法和二次差分法画圆和椭圆的基本原理; 实 2. 依据算法,在 eclipse 下编写源程序并进行调试; 验 3. 对运行过程中的错误进行修改; 步 4. 对运行结果进行分析与总结; 骤 5.书写实验报告。 中心算法画圆的核心代码如下: public void midPointDrawCircle(int r, Graphics g) { int x, y; float d; x = 0; y = r; d = 1 - r; g.drawLine(x + MOVE, y + MOVE, x + MOVE, y + MOVE); 实 验 内 容 g.drawLine(x + MOVE, -y + MOVE, x + MOVE, -y + MOVE); while (x <= y) { if (d < 0) {// M在圆的内部,取正右方的点 d += 2 * x + 3; x++; } else {// M在圆的外部,取右下方的点 d += 2 * (x - y) + 5; y--; x++; } // 画对称位置上的圆 g.drawLine(x + MOVE, y + MOVE, x + MOVE, y + MOVE); 件:Windows 平台,eclips从上半部进入了下半部, 如果 b2x>=a2y, 则椭圆进 入下半部份,此时令△y=1,且:d0=b2(x+0.5)2+a2(y-1)2-a2b2 (a) 若 d<0, 则 M 在 椭 圆 内 部 , 取 右 下 方 像 素 R , 则 d=F(xp+1.5,yp-2), 增 量 为 2(b2xi+1-a2yi+1)+a2 (b)若 d>=0,M 在椭圆的外部, 取正下方像素 L, d=F(xp+0.5,yp-2), 则 增量为: 2(-2yi+1+1) a 下半部分的终止条件为 y=0
计算机图形学实验报告
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
计算机图形学--圆的的生成算法的实现
实验三:圆的的生成算法的实现班级08信计2班学号20080502063 李宁分数一、实验目的与要求:1、了解等编程环境中常用控件命令与绘图函数,初步掌握在实验设计集成环境下进行图形处理程序的设计方法。
2、熟练掌握圆的两种换算法:基于正负算法画圆和基于中点算法画圆。
、二、实验内容:1、在环境中设计程序,利用消息处理函数,搭建能运行图形算法程序的平台。
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;elsed += 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++;elsef = 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、实验结果中点算法运行结果:基于正负算法结果、四、实验结果分析该实验基于中点算法和正负算法画圆的基本函数,设计出直线的图像的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bitmap.SetPixel(x0 - x, y0 - y, Color.Red);
bitmap.SetPixel(x0 + y, y0 + x, Color.Red);
bitmap.SetPixel(x0 - y, y0 + x, Color.Red);
int d = 1 - radius;//d为判别式
circlePlotPoints(x0, y0, x, y, bitmap);
while(x<=y)
{
x++;
if(d<0)//判别式小于零时取正右方的点
{
d+=2*x+1;
}
Else//取正右方的点
{
y--;
d+=2*(x-y)+1;
}
circlePlotPoints(x0, y0, x, y, bitmap);
radius = Convert.ToInt32(textr.Text);
}
else
{
MessageBox.Show("请输入圆心坐标值!", "提示", MessageBoxButtons.OK, rmation);
return;
}
int x = 0;
int y = radius;//设置初始像素点为(0,radius)
贵州大学实验报告
学院:计算机科学与信息学院专业:计算机科学与技术班级:101
姓名
学号
实验组
2
实验时间
2013.4.11
指导教师
吴云
成绩
实验项目名称
圆的生成算法
实验目的
1、通过实验,进一步理解和掌握中点算法、Bresenham算法;
2、掌握以上算法生成圆的基本过程;
3、通过编程,学习VS2010环境下完成用中点算法、Bresenham算法。
bitmap.SetPixel(x0 + y, y0 - x, Color.Red);
bitmap.SetPixel(x0 - y, y0 - x, Color.Red);
}
中点算法
private void MidCircle(int x0, int y0, int radius, Bitmap bitmap)
e=0时,可任取上、下光栅点显示。
因为e是相对量,所以当e>0时,表明e的计值将进入下一个参考点(上升一个光栅点),此时须:e = e–1
B画圆核心代码如下:
Bresenham
private void BresenhamCircle(int x0, int y0, int radius, Bitmap bitmap)
radius = Convert.ToInt32(textr.Text);
}
else
{
MessageBox.Show("请初始化圆坐标!", "提示", MessageBoxButtons.OK, rmationt y = radius;//x=0,y=radius,是设置第一个像素点为(0,radius)
d0=0 x坐标每增加1,d的值相应递增直线的斜率值k,即:d=d+k
一旦d≥1,就把它减去1,保证d的相对性,即在0-1之间。
令e=d-0.5,关于d的判别式和初值可简化成:
e的初值e0= -0.5,增量亦为k;
e<0时,取当前象素(xi,yi)的右方象素(xi+1,yi);
e>0时,取当前象素(xi,yi)的右上方象素(xi+1,yi+1);
设直线的当前点为(xi,y)当前光栅点为(xi,yi)下一个直线的点应为(xi+1,y+k)
相应的光栅点或为右光栅点(xi+1,yi)(y方向递增量0)或为右上光栅点(xi+1,yi+1)(y方向递增量1)记直线与它垂直方向最近的下光栅点的误差为d,有:
0≤d≤1当d<0.5:下一个象素应取右光栅点(xi+1,yi)当d≥0.5:下一个象素应取右上光栅点(xi+1,yi+1)如果直线的(起)端点在整数点上,误差项d的初值:
{
//判断初始值是不是为空,不为空,将其赋给相应的点
if (!("".Equals(textr.Text) || "".Equals(textx0.Text) || "".Equals(texty0.Text)))
{
x0 = Convert.ToInt32(textx0.Text);
y0 = Convert.ToInt32(texty0.Text);
bitmap.SetPixel(x0 + y, y0 - x, Color.Red);
bitmap.SetPixel(x0 - y, y0 - x, Color.Red);
}
实验环境
VS2010(C#)
实验步骤
1、添加一个C#下的Windows窗体应用程序,实现对于算法的选择。
2、根据不同算法添加不同窗体,接受圆初始化数据,编写核心函数。代码见实验原理中代码部分。
int d = 3 - 2 * radius;
circlePlotPoints(x0, y0, x, y, bitmap);
while (x <= y)
{
x++;
if (d < 0)
{
d = d + 4 * x + 6;
}
else
{
d = d + 4*(x - y);
y--;
}
circlePlotPoints(x0, y0, x, y, bitmap);
}
}
//画圆的八个对称点
private void circlePlotPoints(int x0, int y0, int x, int y, Bitmap bitmap)
{
bitmap.SetPixel(x0 + x, y0 + y, Color.Red);
bitmap.SetPixel(x0 - x, y0 + y, Color.Red);
2、中点画圆法
构造圆函数 。对于圆上的点, ;对于圆外的点 ;对于圆内的点 。
与中点画线法一样,构造判别式
若 则应取P1为下一象素,而且再下一象素的判别式为
若则应取P2为下一象素,而且下一象素的判别式为
3、Bresenham算法的基本原理
假定直线斜率|k|≤1。此时,只需考虑x方向每次递增1个单位,决定y方向每次递增0或1。
3、调试运行。
实验内容
在VS2010环境下利用C#编程实现分别利用中点算法、Bresenham算法,并给出实验报告。
实验结果
1、关于界面
4、中点算法结果
5、Bresenham算法结果
实验总结
1.刚开始没有对于输入值为空时做考虑,当输入为空时,运行老是出错;
2.还有就是字符类型转换问题,后来我用强制转换解决了;
3.我的算法不完美,就是只能在正确输入时能运行,其他很多情况肯定会出错。
指导教师意见
签名:年月日
}
}
//画出其他八个对称点
private void circlePlotPoints(int x0, int y0, int x, int y, Bitmap bitmap)
{
bitmap.SetPixel(x0 + x, y0 + y, Color.Yellow);
bitmap.SetPixel(x0 - x, y0 + y, Color.Red);
实验要求
1、在VS2010环境下利用C#编程实现分别利用中点算法、Bresenham算法。
2、给出代码。
3、附上结果截图。
实验原理
A:算法原理
1、圆的特征--八分对称性
圆被定义为到给定中心位置(xc,yc)距离为r的点集。圆心位于原点的圆有四条对称轴x=0,y=0, x=y和x=-y。若已知圆弧上一点(x,y),可以得到其关于四条对称轴的其它7个点,这种性质称为八分对称性。因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。
bitmap.SetPixel(x0 + x, y0 - y, Color.Red);
bitmap.SetPixel(x0 - x, y0 - y, Color.Red);
bitmap.SetPixel(x0 + y, y0 + x, Color.Red);
bitmap.SetPixel(x0 - y, y0 + x, Color.Red);
{
//如果文本框值不为空,将其赋给相应的点
if (!("".Equals(textx0.Text) || "".Equals(texty0.Text) || "".Equals(textr.Text)))
{
x0 = Convert.ToInt32(textx0.Text);
y0 = Convert.ToInt32(texty0.Text);