实验任务及内容 基于MFC实现以下功能: 1.分别用中点画线算法、DDA画线算法、Bresenham画线算法绘制直线; 2.使用中点画圆算法绘制圆; 3.使用中点画椭圆算法绘制椭圆; 4.分别使用4邻域内点表示和边界表示法实现区域填充。 编程测试环境 Visual Studio 2019 PDF文档中包括对三种画线方法、中点画圆、中点画椭圆、两种区域填充程序的预期功能、设计思路详细分析及运行结果展示
2024-03-12 15:31:32 581KB dda算法 Bresenham算法 区域填充算法
1
基于Python写的bresenham算法(未优化),有个小小的漏洞就是不能算斜率小于零的题。
2023-04-09 18:52:31 2KB Python 计算机视觉算法 Bresenham 作业
1
计算机图形学直线生成算法,MFC实现,实现直线中点Bresenham算法的源代码
2023-03-16 09:35:35 338KB 直线中点算法 Bresenham算法 MFC Windows
1
1、实验目的: 理解Bresenham光栅化算法,掌握绘制曲线的程序设计方法。 2、基本要求: 要求一:利用Bresenham中点画圆法画出圆形。 要求二:动态表现画圆过程。 要求三:根据Bresenham光栅化画圆算法,以(0,0)为圆心,以100为半径,绘制该圆。
1
使用MFC绘制的中点Bresenham算法源程序,直接运行即可看到效果。这是vs2010版程序。参考教材是孔令德编写的《计算机图形学实践教程(Visual C++版)第2版》。
2022-10-23 16:00:12 122KB 图形学 c++
1
利用Bresenham算法画圆,决策变量用的是最简单的计算方法,希望对初学者有启发
1
计算机图形学——直线中点Bresenham算法
2022-06-01 10:27:39 252KB 图形学 Bresenham 直线中点算法
1
DDA和Bresenham算法实验报告.doc
2022-05-29 14:06:43 135KB 算法 文档资料
#include #include #include #include #include //////////////////////////////////////////////////////////////functions///////////////////////////////////////////////// void swap(float &m,float &n) { float temp=n; n=m; m=temp; } int sign(float a,float b)//sign() { int t; if(a>b) { t=1;} else if(adx) { swap(dx,dy); Flag=1; } else Flag=0; float Nerror=2*dy-dx; for(int i=1;i=0) { if(Flag) { x=x+sx;} else y=y+sy; Nerror=Nerror-2*dx; } if(Flag) { y=y+sy;} else x=x+sx; Nerror=Nerror+2*dy; } } ///////////////////////////////////四连通种子填充/////////////////////////////////////////////////// void BoundaryFill4(HDC hdc,int x,int y,int FilledColor,int BoundaryColor) { int CurrentColor; CurrentColor=GetPixel(hdc,x,y); if(CurrentColor!=BoundaryColor&&CurrentColor!=FilledColor) { SetPixel(hdc,x,y,FilledColor); BoundaryFill4(hdc,x+1,y,FilledColor,BoundaryColor); BoundaryFill4(hdc,x-1,y,FilledColor,BoundaryColor); BoundaryFill4(hdc,x,y+1,FilledColor,BoundaryColor); BoundaryFill4(hdc,x,y-1,FilledColor,BoundaryColor); } } ////////////////////////////////////////扫描线填充/////////////////////////////////////////////////// //DrawLine()函数:在(x1,y)和(x2,y)两点之间画一条颜色为FilledColor的横线(用来扫描填充) void drawline(HDC hdc, int x1, int x2,int y0, int FilledColor) { for(int n=x1+1;n500)) {a[j][1]=i;} } } //利用循环调用DrawLine函数逐行填充两交点之间的点 for(int k=0;k<300;k++) { if((a[k][0]!=0)&&(a[k][1]!=0)) drawline(hdc,a[k][0],a[k][1],k,RGB(255,0,0));} } ///////////////////////////////////////////////边界填充////////////////////////////////////// //Contrary()取反函数:如果点的颜色为白,则将点置为填充色;如果点的颜色为填充色,则将点置为白色 //忽略了边界色,即不对边界点作颜色处理 void contrary(HDC hdc, int x, int y,int FilledColor) { for(int h=x;h<280;h++) { if(GetPixel(hdc,h,y)==RGB(255,255,255)) { SetPixel(hdc,h,y,FilledColor); } else if(GetPixel(hdc,h,y)==FilledColor) { SetPixel(hdc,h,y,RGB(255,255,255)); } } } //borderline()边线函数: 先找出图形的边界 左边和右边,从右到左的顺序调用contrary()函数进行填充 void borderline(HDC hdc, int boundarycolor) { for(int j=280;j<499;j++) { for(int i=80;i<280;i++) { int currentcolor=GetPixel(hdc,i,j); //排除了边界水平的情况,即(x-1,y)、(x,y)和(x+1,y)连续三点都是边界点的点不参与填充 if((currentcolor==boundarycolor)&&(GetPixel(hdc,i+1,j)!=boundarycolor)&&(GetPixel(hdc,i-1,j)!=boundarycolor)&&(i>100)) { contrary(hdc,i,j,RGB(0,0,255)); } } } for(int m=280;m<499;m++) { for(int n=80;n<280;n++) { int currentcolor=GetPixel(hdc,n,m); if((currentcolor==boundarycolor)&&(GetPixel(hdc,n+1,m)!=boundarycolor)&&(GetPixel(hdc,n-1,m)!=boundarycolor)&&(n<101)) { contrary(hdc,n,m,RGB(0,0,255)); } } } }
1
将绘制的折线连接成多边形,并选择种子填充法或扫描线填充法进行填充 鼠标交互生成矩形裁剪框,实现对绘制的折线的裁剪
2022-04-27 23:55:48 2KB Bresenham算法 橡皮筋
1