c语言 给出任意多边形顶点,这些定点连起来是一个凸多边形,如何对它进行填充?希望有源程序。 25

我的目的是对二值图片进行处理,使多边形内部像素值全为255。如果你们有求出二值图像的凸包并对其填充的代码就更好了。没有的话,就给我一个已知多边形定点坐标,对多边形进行填充... 我的目的是对二值图片进行处理,使多边形内部像素值全为255。如果你们有求出二值图像的凸包并对其填充的代码就更好了。没有的话,就给我一个已知多边形定点坐标,对多边形进行填充的程序吧,大谢! 展开
 我来答
qdx102
2014-07-03 · TA获得超过107个赞
知道答主
回答量:75
采纳率:100%
帮助的人:73.2万
展开全部
// 点
struct point
{

float x,y; //x y 坐标
};

// 多边形结构体
struct polygon
{

int num; // 点的数目

float offset_x,offset_y; // 偏移

float left,right,top,bottom; // 多边形 上/下/左/右区域

struct point *points; //组成多边形的点
};

// 生成多变形
// 点必须是有序的,按多边形的顶点顺时针给出
// p 组成多边形的点
// size 点的数量
int gen_polygon_clockwise(const struct point* p,int size,struct polygon *poly)
{

int i ;

struct point *p_adr = (point *)malloc(sizeof(struct point) * size);

poly->num = size;

for (i = 0;i < size;i++) {

p_adr[i].x = p[i].x;

p_adr[i].y = p[i].y;

if (i == 0) {

poly->left = p[i].x;

poly->right = p[i].x;

poly->bottom = p[i].y;

poly->top = p[i].y;

} else {
// 确定区域的上/下/左/右 坐标

if (p[i].x < poly->left) {

poly->left = p[i].x;

}

if (p[i].x > poly->right) {

poly->right = p[i].x;

}

if (p[i].y < poly->top) {

poly->top = p[i].y;

}

if (p[i].y > poly->bottom) {

poly->bottom = p[i].y;

}

}

}

poly->points = p_adr;

return 0 ;
}

void free_polygon(struct polygon *poly)
{

free(poly->points);
}

// 点是顺时针给出的
// 判断点是否在直线的左/右区域
// 判断一个点是否在一个区域里,主要是根据该点和组成多边形的直线的关系来判断
int is_point_local_line_region_clockwise(float x1,float x2,float y1,float y2,float x,float y)
{

float w,h,tmp;

// 下面的代码,就不解释了,你【顺时针】画一个多边行,然后在任意画一个点,然后
// 判断组成多边形的每条直线和点的关系就清楚了,主要还是根据该点是在直线的左侧还是
// 右侧(上侧/下侧)来判断一个点是否在多边行的里面
//
// 直线倾率为无穷大

if (x1 == x2) {

if (y1 > y2) {

if (x < x1) {

return 0;

}

} else {

if (x > x1) {

return 0 ;

}

}

}

// 直线倾率为0

if (y1 == y2) {

if (x1 > x2) {

if (y > y1) {

return 0;

}

} else {

if (y < y1) {

return 0;

}

}

}

w = x2 - x1;

h = y2 - y1;

// 直线上的点
// 直线的倾率 直线的点倾式(y = k(x - x1) + y1)

tmp = h/w * (x -x1) + y1;

if (x1 > x2) {

if (y > tmp) {

return 0;

}

} else {

if (y < tmp) {

return 0;

}

}

return 1;
}

// 判断一个点是否在多边行里面
// 在多边形区域里则返回非0值,否则,返回0值
int is_point_in_polygon(float x,float y,const struct polygon *poly)
{

int i ;

if (x < poly->left || x > poly->right ||

y < poly->top || y > poly->right) {

return 0;

}

for (i = 0; i < poly->num - 1;i++) {

if (!is_point_local_line_region_clockwise(poly->points[i].x,

poly->points[i + 1].x,

poly->points[i].y,

poly->points[i + 1].y,x,y)) {

return 0 ;

}

}

if (!is_point_local_line_region_clockwise(poly->points[i].x,

poly->points[0].x,

poly->points[i].y,

poly->points[0].y,

x,y)) {

return 0 ;

}

return 1;
}

#define RESOLUTION_X 100

// 填充多边形
// buffer 填充的二维数组
void fill_poly(const struct polygon *poly,char buffer[][RESOLUTION_X])
{

int x,y,w,h,i,j;

x = (int)poly->left + poly->offset_x;

y = (int)poly->top + poly->offset_y;

w = (int)(poly->right - poly->left);

h = (int)(poly->bottom - poly->top);

for (i = y;i < y + h;i++) {

for (j = x;j < x + w;j++) {

if (is_point_in_polygon(j,i,poly)) {

buffer[i][j] = 255;

}

}

}
}

int main()
{

char buffer[100][100];

struct polygon poly;

struct point points[8];

poly.offset_x = 0;

poly.offset_y = 0 ;

points[0].x = 50;

points[0].y = 50 - 30;

points[1].x = 50 + 21;

points[1].y = 50 - 21;

points[2].x = 50 + 30;

points[2].y = 50;

points[3].x = 50 + 21;

points[3].y = 50 + 21;

points[4].x = 50;

points[4].y = 50 + 30;

points[5].x = 50 - 21;

points[5].y = 50 + 21;

points[6].x = 50 - 30;

points[6].y = 50 ;

points[7].x = 50 - 21;

points[7].y = 50 - 21;

memset(buffer,0,sizeof(buffer));

gen_polygon_clockwise(points,8,&poly);

fill_poly(&poly,buffer);

for (int i = 0;i < 100;i++) {

for (int j = 0;j < 100;j++) {

if (buffer[i][j]) {

std::cout << "*";

} else {

std::cout << " " ;

}

}

std::cout << std::endl;

}

return 0;
}

####
你看对你有没有帮助
浮点坐标到整数坐标只是简单的类型转换
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式