c++实现基于EASYX库扫描线算法

  

本文实例为大家分享了c++实现基于EASYX库扫描线算法的具体代码,供大家参考,具体内容如下

  

扫描线算法的基本原理

  

 C + +实现基于EASYX库扫描线算法

  

*作者在扫描线算法的基础上自己设计的更易于理解的地物填充绘制算法

  

流程图   

 C + +实现基于EASYX库扫描线算法

  

代码         # include//# include   # include   使用名称空间性病;//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -草图形- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//空白草(双x,双y,高两倍,双宽度)   {   setlinecolor(绿色);   线(x, y, x -高/2,y -宽度);   线(x, y, x, y -宽度);   线(x, y, x +高/2,y -宽度);   }//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -林图形- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//空树(双x,双y,高两倍,双宽度)   {   setlinecolor(绿色);   线(x, y, x -高/2,y -宽度);   线(x, y, x +高/2,y -宽度);   线(x, y -宽度,x, y +宽度);   }//- - - - - - - - - - - - - - - - - -求解方程的k, b值- - - - - - - - - - - - - - - - - - - - -//空白function_line(双x1,双y1,双x2,双y2,双,k,二重;b)   {   如果(x2 - x1==0) {   k=-9999;   b=x1;   返回;   }   k=(y2 - y1)/(x2 - x1);   b=y1 - k * x1;   }//- - - - - - - - - - - - - - - - - -返回直线的y - - - - - - - - - - - - - - - - - - - - - - -//双solve_y(双k,双b,双x)   {   返回k * x + b;   }//- - - - - - - - - - - - - - - - - -返回直线的x - - - - - - - - - - - - - - - - - - - - - - -//双solve_x(双k,双b,双y)   {   如果(k==-9999)   返回b;   返回(y - b)/k;   }//- - - - - - - - - - - - - - - - - - -找出扫描线与边界相交的点,并储存在suitable_x[]中,把相交的点数储存在n中- - - - - - - - - - - - - - -////x[] - - - - - - - - - - - -顶点x坐标//y[] - - - - - - - - - - - -顶点y坐标//N - - - - - - - - - - - - -顶点的个数//now_y - - - - - - - - - - - -当前的扫描线y//suitable_x[]——扫描线与边界相交的点的x坐标//n - - - - - - - - - - - - -相交的点数   空白Suitable_x(双x[],双y [], int N,双now_y,双Suitable_x [], int, N)   {   n=0;   int t=0;   双k b;   for (int i=0;我& lt;N;我+ +)   {   如果(我==N - 1)   {   如果(y[我]& lt;now_y&和;now_y & lt;=y [0] | | y [0] & lt;now_y&和;now_y & lt;=y[我])//判断直线是否过最后一条直的线   {   function_line (x [0] y [0], x[我],[我],k, b);   suitable_x [t + +]=solve_x (k b now_y);   }   }   其他的   {   如果(y[我]& lt;now_y&和;now_y & lt;=y (i + 1) | | y (i + 1) & lt;now_y&和;now_y & lt;=y[我])//判断扫描线过哪条直线的范围   {   function_line (x[我],[我],x (i + 1), y (i + 1), k, b);   suitable_x [t + +]=solve_x (k b now_y);//把交点的x储存在suitable_x[]中   }   }   }   n=t;   }   空白sort_min_to_max(双suitable_x [], int n)//排序——从小到大排的序   {   双温度;   for (int i=0;我& lt;n - 1;我+ +)   {   for (int j=i + 1;j & lt;n;j + +) {   如果(suitable_x[我]比;suitable_x [j]) {   双temp=suitable_x[我];   suitable_x[我]=suitable_x [j];   suitable_x [j]=temp;   }   }   }   }   双find_max(双elem [], int N)//输出最大的元素值   {   双max=elem [0];   for (int i=0;我& lt;N;我+ +)   {   如果(elem[我]比;马克斯)   {   max=elem[我];   }   }   返回最大;   }   双find_min(双elem [], int N)//输出最小的元素值   {   两分钟=elem [0];   for (int i=0;我& lt;N;我+ +)   {   如果(elem[我]& lt;分钟)   {   min=elem[我];   }   }   返回最小;   }   int main ()   {   cout & lt; & lt;“- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -地物填充绘制算法- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n \ n”;   cout & lt; & lt;“创建人:李景勃\ n”;   cout & lt; & lt;“时间:2018年10月24日\ n”;   cout & lt; & lt;“10月24日是全部程序员值得开心的节日,也是自己重要的日子,23号完成,祝福全部程序员们! ! ! \ n \ n \ n”;      整数N, ch;   字符颜色;   双x [50] y [50];   cout & lt; & lt;“输入填充的多边形的顶点数:”;   ,cin祝辞的在N;   cout & lt; & lt;“依次输入地物的顶点坐标:”;   for (int i=0;我& lt;N;我+ +)   {   cout & lt; & lt;“输入第“& lt; & lt;我+ 1 & lt; & lt;“个顶点的坐标:“& lt; & lt;endl;   cout & lt; & lt;“x, y:”;   scanf_s(“%低频,%低频,x[我],和y[我]);/* cout & lt; & lt;“x=?,cin祝辞的在x[我];   cout & lt; & lt;“y=?,cin祝辞的在y[我];*/}   cout & lt; & lt;“选择您填充的地物:整个区域单颜色充填- - -请按0;草地- - - - - -请按1;林地- - - - - -请按2;”;,cin祝辞的在ch;   如果(ch==0)   {   cout & lt; & lt;“请选择颜色:黑色黑,DARKGRAY深灰绿色蓝色蓝LIGHTBLUE亮蓝,绿绿青色青红红紫红色紫棕色棕黄色黄浅灰色浅灰- - -注意是大写的英文\ n”;   cout & lt; & lt;“如果想让颜色变亮请在颜色的前面加上轻\ n”;   cout & lt; & lt;“请输入颜色:”;   ,cin祝辞的在颜色;   }         initgraph (find_max (x, N) + 100, find_max (y, N) + 100);//整数N=9;//双x [50]={200100150170400350300250270};//双y [50]={200300400250350300250100270};   双new_y [50]={0};   int n=0;   双suitable_x [10];//草的参数   int高=12,   宽度=6;   int空间=4;//草之间的间隔         setbkcolor(白色);//设置背景色   清除设备();//用背景色填充屏幕   setlinecolor(黑色);//多边形的线条颜色   for (int i=0;我& lt;N;我+ +)//逆时针顶点相连构成闭合多边形   {   如果(我==N - 1)   {   线(x[我],[我],[0]x, y [0]);   }   其他的   {   线(x[我],[我],x (i + 1), y (i + 1));   }   }      双min_y=find_min (y, N),   max_y=find_max (y, N);   开关(ch)   {   例0://- - - - - - - - - - - - - - - - - - - - - - - - -像素填充面积- - - - - - - - - - - - - - - - - - - - - - - - -//for (int now_y=min_y;now_y & lt;=max_y;now_y + +)   {   Suitable_x (x, y, N, now_y Suitable_x, N);   sort_min_to_max (suitable_x n);//从小到大排的序   for (int i=0;我& lt;n;我+=2)   {   for (int now_x=suitable_x[我];now_x & lt;suitable_x (i + 1);now_x + +)//确定在扫描线上,要填充的范围   {   putpixel (now_x, now_y,颜色);   }   }   }   打破;   案例1://- - - - - - - - - - - - - - - - - - - - - - - - -草填充- - - - - - - - - - - - - - - - - - - - - - - - -//for (int now_y=min_y +宽度+空间;now_y & lt;=max_y;now_y宽度+=+空间)   {   Suitable_x (x, y, N, now_y Suitable_x, N);   sort_min_to_max (suitable_x n);//从小到大排的序   for (int i=0;我& lt;n;我+=2)   {   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

c++实现基于EASYX库扫描线算法