版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/83993899
/*
@Time:20181112
@Title:判断多边形是否在圆内
@Desc:圆是一个凸集,判断多边形的每一个顶点是否在圆内即可
*/
#include<stdio.h>
#include<stdlib.h>
#define EXP 1e-8 //精度
typedef struct point{
double x;
double y;
struct point *next;
}Point, *Polygon;
typedef struct circle{
Point centre;
double r;
}Circle;
int InitPolygon(Polygon *p); //初始化多边形
int InitCircle(Circle *c); //初始化圆
int PolygonInCircle(Polygon p, Circle C); //多边形是否在圆内
int PointInCircle(Point A, Circle C); //点是否在圆内
/*测试数据
// 第一组
11
0 0
1 2
2 1
3 2
4 2
5 3
6 0
3 1
2 0
1 1.5
0 0
1 1
6
// 第二组
11
0 0
1 2
2 1
3 2
4 2
5 3
6 0
3 1
2 0
1 1.5
0 0
1 1
2
*/
int main() {
Polygon P;
Circle C;
InitPolygon(&P);
printf("Polygon init success\n");
InitCircle(&C);
printf("circle init success\n");
printf("多边形是否在圆内:%d", PolygonInCircle(P, C) );
return 0;
}
// 返回1:创建成功
// 返回0:创建不成功,点没有闭合
int InitPolygon(Polygon *pHead) {
int n;
int i;
Point *p,*q;
double a,b;
double suba, subb;
scanf("%d", &n);
p = NULL;
for (i=0; i<n; i++) {
scanf("%lf%lf", &a, &b);
q = (Point *)malloc(sizeof(Point)); if (!q) exit(0);
q->x = a; q->y = b;
// 连接
if (p==NULL) { //第一个点
q->next = q; //循环队列
p = q;
*pHead = q;
} else {
suba = (*pHead)->x - a;
subb = (*pHead)->y - b;
if ( suba>=-EXP && suba<=EXP && subb>=-EXP && subb<=EXP) {//闭合 构造完成
free(q);
return 1;
}
p->next = q;
q->next = *pHead;
// 下一个
p = q;
}
}
return 0;
}
// 返回1:创建成功
// 返回0:创建失败
int InitCircle(Circle *c) {
scanf("%lf%lf", &c->centre.x, &c->centre.y);
scanf("%lf", &c->r);
return 1;
}
// 多边形是否在圆内
int PolygonInCircle(Polygon head, Circle c) {
Point *p;
p = head;
do {
if ( PointInCircle(*p, c)==0 ) return 0;
p = p->next;
} while (p!=head);
return 1;
}
// 点是否在圆内
int PointInCircle(Point A, Circle C) {
double d2;
d2 = (A.x - C.centre.x) * (A.x - C.centre.x) + (A.y - C.centre.y) * (A.y - C.centre.y);
if (d2 > C.r*C.r) {
return 0;
} else {
return 1;
}
}