Graphics—边缘填充算法
来源:互联网 发布:免费数据库同步软件 编辑:程序博客网 时间:2024/06/06 01:45
/*多边形的区域填充:边缘填充算法边缘填充算法的基本思想是,逐边向右求补。可以按任意顺序处理多边形的每条边,在处理每条边时,首先求出该边与扫描线的交点,然后将每一条扫描线上交点右方的所有像素取补,多边形的所有边处理完毕之后,填充即完成*/#include"stdafx.h"#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<conio.h>#include<graphics.h>#define N 100000#define Min -99999999int n; //点的个数int right; //图像的右边界struct point //点的坐标{ int x; int y;}point[N];void init() //初始化,点的坐标{ int i; printf("请输入点的个数: "); scanf("%d",&n); right=Min; for(i=0;i<n;i++) { scanf("%d %d",&point[i].x,&point[i].y); if(point[i].x>right) //得到右边界right=point[i].x; } point[n].x=point[0].x; //首尾相连,构成封闭图形 point[n].y=point[0].y;}void display() //绘制该多边形的轮廓{ int i; setbkcolor(WHITE); cleardevice(); setcolor(RED); for(i=0;i<n;i++) //画边界线 line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);}void fill() //边缘填充算法{ int x0,y0,x1,y1,i; int dx,dy,eps1,k; int p,q; int flag; int temp; float x,y,xIncre,yIncre; for(i=0;i<n;i++) { //如果线段是水平线或者是右边边界,只画线,不做处理 if(point[i+1].y==point[i].y||(right==point[i+1].x&&right==point[i].x)) line(point[i].x,point[i].y,point[i+1].x,point[i+1].y); else{ //初始化各个参数 x=point[i+1].x; y=point[i+1].y; dx=point[i].x-point[i+1].x; dy=point[i].y-point[i+1].y; //扫描线的范围 eps1=abs(dy); xIncre=(float)dx/(float)eps1; yIncre=(float)dy/(float)eps1; //找线段上的点 for(k=0;k<=eps1;k++) {p=(int)(x+0.5);q=(int)(y+0.5); //扫描线上取补for(int j=p;j<=right;j++) { //如果当前点为白色,就填充红色if(getpixel(j,q)==WHITE)putpixel(j,q,RED); //否则就填充白色elseputpixel(j,q,WHITE);}x+=xIncre;y+=yIncre;} } }}int main(){ init(); initgraph(800,700); display(); fill(); getch(); closegraph(); return 0;}/*100 100700 100700 500600 400400 600300 200200 300*/
运行结果:
//边缘填充算法#include"stdafx.h"#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<conio.h>#include<graphics.h>#define N 100000#define Min -99999999int right; //图像的右边界struct point //点的坐标{ int x; int y;}point[N];void init() //初始化{ int i; right=Min;point[0].x=100;point[0].y=100;point[1].x=700;point[1].y=100;point[2].x=700;point[2].y=500;point[3].x=600;point[3].y=400;point[4].x=400;point[4].y=600;point[5].x=300;point[5].y=200;point[6].x=200;point[6].y=300; for(i=0;i<7;i++) { if(point[i].x>right) //得到右边界right=point[i].x; } point[7].x=point[0].x; //首尾相连,构成封闭图形 point[7].y=point[0].y;}void display() //绘制该多边形的轮廓{ int i; setbkcolor(WHITE); cleardevice(); setcolor(RED); for(i=0;i<7;i++) line(point[i].x,point[i].y,point[i+1].x,point[i+1].y);}void fill() //边缘填充算法{ int x0,y0,x1,y1,i; int dx,dy,eps1,k; int p,q; int flag; int temp; float x,y,xIncre,yIncre; for(i=0;i<7;i++) { if(point[i+1].y==point[i].y||(right==point[i+1].x&&right==point[i].x)) line(point[i].x,point[i].y,point[i+1].x,point[i+1].y); else{ x=point[i+1].x; y=point[i+1].y; dx=point[i].x-point[i+1].x; dy=point[i].y-point[i+1].y; eps1=abs(dy); xIncre=(float)dx/(float)eps1; yIncre=(float)dy/(float)eps1; for(k=0;k<=eps1;k++) {p=(int)(x+0.5);q=(int)(y+0.5); for(int j=p;j<=right;j++) {if(getpixel(j,q)==WHITE)putpixel(j,q,RED);elseputpixel(j,q,WHITE);}x+=xIncre;y+=yIncre;} } }}int main(){ init(); initgraph(750,650); display(); fill(); getch(); closegraph(); return 0;}
阅读全文
0 0
- Graphics—边缘填充算法
- Graphics—边界填充算法
- 边缘填充算法
- OpenGL应用——实现边缘填充算法
- 计算机图形学——边缘填充算法和边界填充算法
- OpenCV笔记:填充边缘
- Graphics—边标志算法
- 填充算法
- 填充算法
- 算法总结——canny边缘检测
- 边缘检测算法——图像处理
- flash Graphics与GraphicsPath的区别——填充方式的改变!
- vb.net GDI+入门——使用Graphics对象填充图形
- 边缘断裂处理算法-边缘连接算法
- 边缘断裂处理算法-边缘连接算法
- Graphics.DrawCurve的算法
- Sobel边缘检测算法
- Sobel边缘检测算法
- OpenCV图像处理中常用函数汇总
- spring
- DNS配置实例
- LeetCode-461 Hamming Distance
- jain-sip 一些类的初步理解
- Graphics—边缘填充算法
- Linux/Unix IO 多路复用之poll网络编程
- Android 必知必会
- 在ArrayList中加上Activity
- 算法导论 22.1-4 通用汇点 O(V)
- [python + pillow] 修改图片的尺寸
- 服务器提示Can’t assignrequested address的问题分析
- 【Jmeter】BeanShell断言--数据处理
- python008 -- 函数及高阶函数