C语言实现多边形填充

找的快疯了,还是没有结果,请教高手来了:1,C语言编写,TC调试;2,最好是能任意多边形,实在不行,弄一个三角形也可以,不要是矩形就形。3,不能用递归那种,最好不要用堆栈... 找的快疯了,还是没有结果,请教高手来了:
1,C语言编写,TC调试;
2,最好是能任意多边形,实在不行,弄一个三角形也可以,不要是矩形就形。
3,不能用递归那种,最好不要用堆栈那种,能用便标志算法,以及扫描线算法最好。
4,真没有什么好的,不要算法也行,反正能把那个图形里面给弄上颜色就好!
5,很急啊!高手,请赐教!!!
展开
 我来答
匿名用户
2013-08-26
展开全部
楼主问的是图形学算法。。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<x1;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);
}
匿名用户
推荐于2018-04-21
展开全部
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h> /*运行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; }
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-26
展开全部
/*直角三角形,输入行数,输出*/
#include <stdio.h>
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 <stdio.h>
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上编译通过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式