C语言实现多边形填充

2024-12-31 10:21:58
推荐回答(3个)
回答1:

楼主问的是图形学算法。。1楼给出的是??
有以前写了一个多边形种子填充算法用的是贝塞尔方法你拿去看下把。。
1 用Bresenham直线与圆组成的扇形
void CFill4Dlg::Bresenham(int x0,int y0,int x1,int y1,int color)
{
int x,y,dx,dy,e;
dx=y1-x0;
dy=y1-y0;
e=-dx;
x=x0;
y=y0;
CClientDC dc(this);
for(x=x0;x {
dc.SetPixel(x,(int)(y+0.5),color);
e=e+2*dy;
if(e>=0)
{
y++;
e=e-2*dx;
}
}
}
void CFill4Dlg::CirclePoints(int x,int y,int m,int n,int color)
{
CClientDC dc(this);
dc.SetPixel(x+m_cx,y+m_cy,color);
dc.SetPixel(y+m_cx,x+m_cy,color);
dc.SetPixel(-x+m_cx,y+m_cy,color);
dc.SetPixel(y+m_cx,-x+m_cy,color);
dc.SetPixel(x+m_cx,-y+m_cy,color);
dc.SetPixel(-y+m_cx,x+m_cy,color);
dc.SetPixel(-x+m_cx,-y+m_cy,color);
dc.SetPixel(-y+m_cx,-x+m_cy,color);
}
void CFill4Dlg::MidPointCircle(int r,int m,int n,int color)
{
int x,y;
float d;
x=0;
y=r;
d=float(1.25-r);
CirclePoints(x,y,m,n,color);
while(x<=y)
{
if(d<0)
d+=2*x+3;
else
{
d+=2*(x-y)+5;
y--;
}
x++;
CirclePoints(x,y,m,n,color);
}
}

2 填充:
种子设定 filled_color=getpixel(m_zx,m_zy);
typedef struct
{//记录种子点
int x;
int y;
}seed;
seed * seed_p;
#define STACKTOTAL 3000
void stack_init();
void setstackempty();
void stackpush(seed pt);
seed stackpop();
bool isstackempty();
int stack_number;
填充:
void CFill4Dlg::FloodFill4(int x,int y,int oldcolor,int newcolor)
{
CClientDC dc(this);
if((int)dc.GetPixel(x,y)==oldcolor)
{
drawpixel(x,y,newcolor);
FloodFill4(x,y+1,oldcolor,newcolor);
FloodFill4(x,y-1,oldcolor,newcolor);
FloodFill4(x-1,y,oldcolor,newcolor);
FloodFill4(x+1,y,oldcolor,newcolor);
}
}
void CFill4Dlg::drawpixel(int x, int y, int color)
{
CClientDC dc(this);
dc.SetPixel(x,y,color);
}

回答2:

#include
#include
#include
#include
#include /*运行C图形需要的一些头文件*/

#define STACK_INIT_SIZE 100 /*存储空间初始分配量*/
#define STACKINCREMENT 10 /*存储空间分配增量*/

typedef enum {false,true}bool; /*bool*/

typedef struct{ /*记录种子点*/
int x;
int y;
}SEED;

typedef struct {
SEED *base;
SEED *top;
int stacksize;
}STACK;

STACK s;
SEED e;
int initstack() { /*建动态栈*/
s.base=(SEED *)malloc(STACK_INIT_SIZE*sizeof(SEED));
if(!s.base) exit(0);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 0; }

int push(SEED e) {
if(s.top-s.base>=s.stacksize) {
s.base=(SEED *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SEED));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT; }
*s.top++=e;
return 0; }

SEED pop() {
if(s.top==s.base)
exit(0);
else {
e=*--s.top;
return e; }
}

int clearstack() {
s.top=s.base;
return 0;
}

int stackempty() {
if(s.top==s.base)
return 1;
else return 0; }

回答3:

/*直角三角形,输入行数,输出*/
#include
void main()/*如果TC编译不通过,则去掉void*/
{
int n;
scanf("%d",&n);
for (int i = 1;i <= n;i++)
{
for (int j = 0;j < i;j++)
printf("*");
printf("\n");
}
}
/*等腰三角形,输入行数,输出*/
#include
void main()/*如果TC编译不通过,则去掉void*/
{
int n;
scanf("%d",&n);
for (int i = 1;i <= n;i++)
{
for (int k = 1;k <= n-i;k++)
printf(" ");
for (int j = 0;j < 2*i-1;j++)
printf("*");
printf("\n");
}
}
以上在VS2005上编译通过