计算机图形学——边缘填充算法和边界填充算法

 要求:利用边缘填充算法和边界填充算法的原理,对《计算机图形学基础》(第二版)(p150  图5-67)进行填充


边缘填充算法:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
#define N 100000
#define Min -99999999
int 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 DDA(int x0,int y0,int x1,int y1)
{
    int dx,dy,eps1,k;
    float x,y,xIncre,yIncre;
    int p,q;
    dx=x1-x0;
    dy=y1-y0;
    x=x0;
    y=y0;
    if(abs(dx)>abs(dy))
        eps1=abs(dx);
    else
        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);
        if(getpixel(p,q)==BLUE)
            putpixel(p,q,RED);
        else
            putpixel(p,q,BLUE);
        x+=xIncre;
        y+=yIncre;
    }
}
void sol1()
{
    int i;
    int x0,y0,x1,y1;
    setbkcolor(BLUE);
    cleardevice();
    setcolor(RED);
    for(i=0; i<n; i++)
    {
        x0=point[i].x;
        y0=point[i].y;
        x1=point[i+1].x;
        y1=point[i+1].y;
        line(x0,y0,x1,y1);
    }
}
void sol2()
{
    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++)
    {
        x0=point[i].x;
        y0=point[i].y;
        x1=point[i+1].x;
        y1=point[i+1].y;
        if(y0>y1)
        {
            temp=y0;
            y0=y1;
            y1=temp;
            temp=x0;
            x0=x1;
            x1=temp;
        }
        dx=x1-x0;
        dy=y1-y0;
        x=x0;
        y=y0;
        eps1=abs(dy);
        xIncre=(float)dx/(float)eps1;
        yIncre=(float)dy/(float)eps1;
        flag=1;
        for(k=0; k<=eps1; k++)
        {
            p=(int)(x+0.5);
            q=(int)(y+0.5);
            if(k!=0)
                DDA(p,q,right,q);
            x+=xIncre;
            y+=yIncre;
        }
    }
}
int main()
{
    init();
    initgraph(500,500);
    sol1();
    sol2();
    getch();
    closegraph();
    return 0;
}


边界填充算法:

#include <iostream>
#include "stdio.h"
#include <stdlib.h>
#include <cmath>
#include <gl/glut.h>
#include <windows.h>
#include <gl/gl.h>
using namespace std;
typedef float Color[3];
void init ()                               
{
    glClearColor (1.0, 1.0, 1.0,0);
    glMatrixMode (GL_PROJECTION);
    gluOrtho2D (0.0, 10.0, 0.0, 10.0);
}
 
void setPixel(GLint x,GLint y)              
{
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
    glFlush();
}
 
void getPixel(GLint x, GLint y, Color c)       
{
    glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,c);
}
 
 
bool ColorEqual(Color c1,Color c2)          
{
    return (fabs(c1[0]-c2[0])<0.001 &&  fabs(c1[1]-c2[1])<0.001 && fabs(c1[2]-c2[2])<0.001) ;
}
 
 
void boundaryFill4 (int x, int y, Color fillColor, Color borderColor)
{
    Color Color;
    getPixel (x, y, Color);
    if (!(ColorEqual(Color,borderColor)) && !(ColorEqual(Color,fillColor)))
    {
        setPixel(x, y);
        boundaryFill4 (x + 1, y , fillColor, borderColor);
        boundaryFill4 (x - 1, y , fillColor, borderColor);
        boundaryFill4 (x , y + 1, fillColor, borderColor);
        boundaryFill4 (x , y - 1, fillColor, borderColor);
    }
}
 
void drawBoundaryPolygon()                         
{
 
Color a= {0.0,0.0,1.0},b= {0.0,1.0,1.0};
    glColor3fv(b);
    glClear(GL_COLOR_BUFFER_BIT);
 
    glLineWidth(4.0);
 
    glBegin(GL_LINE_LOOP);
        glVertex2i(1,1);
        glVertex2i(7,1);
        glVertex2i(7,5);
        glVertex2i(6,4);
        glVertex2i(4,6);
        glVertex2i(3,2);
        glVertex2i(2,3);
    glEnd();
 
    glColor3fv(a);
    boundaryFill4(70,60,a,b);
    glFlush();
}
 
void myDisplay ()
{
    glClear(GL_COLOR_BUFFER_BIT);                   
    Color color1= {0.0,0.0,1.0};                    
    Color color2= {1.0,0.0,0.0};                    
    glColor3fv(color1);                             
    glLineWidth(2.0);                               
    drawBoundaryPolygon();                          
    glColor3fv(color2);                             
    boundaryFill4(100,100,color1,color2);
    glFlush();                                     //清空OpenGL命令缓冲区,执行OpenGL程序
 
}
 
 
int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);      
    glutInitWindowPosition(400,200);                
    glutInitWindowSize(400,400);                    
    glutCreateWindow("边界填充算法");        
    init();                                         //初始化函数
    glutDisplayFunc(myDisplay);                     
    glutMainLoop();
 
    return 0;
}


猜你喜欢

转载自blog.csdn.net/cd1202/article/details/72887726
今日推荐