版权声明:感谢查看,转载请注明原地址,知识与您同在。 https://blog.csdn.net/a1023182899/article/details/84678251
D: 四边形面积
题目描述
有一个四边形,现在需要求它的面积
输入
输入四行,每行两个数整数xx, yy (1≤x,y≤1000)(1≤x,y≤1000),四个点是按逆时针输入的。
输出
输出四边形的面积,保留3位小数点
样例输入
0 0
10 0
1 1
0 11
样例输出
10.500
样例输入
0 0
1000 0
1000 1000
0 1000
样例输出
1000000.000
提示
C语言中保留3位小数用%.3lf 用法:printf("%.3lf",result)
四边形分凸凹四边形。
思考
正常四边形面积ABC+ACD或者ABD+BCD是一样的,是固定的
凹四边形面积两种可能ABC+ACD或ABD+BCD,且面积是更小的那个
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct
{
int x;
int y;
} Point;
/*两点之间的直线距离*/
double length(Point *A,Point *B)
{
return sqrt(pow(A->x-B->x,2)+pow(A->y-B->y,2));
}
double area_of_triangle(Point A,Point B,Point C)
{
double area,a,b,c,p;
a=length(&B,&C);
b=length(&C,&A);
c=length(&A,&B);
p=(a+b+c)/2;
area=sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}
#define a P[0]
#define b P[1]
#define c P[2]
#define d P[3]
int main()
{
char pname[]="ABCD",*p=pname;
Point m,n,r,P[4],*PP=P;
double abcd,rmn,abcd1;
while(*p)
{
//printf("input (x,y) of point %c:",*p);
scanf("%d%d",&PP->x,&PP->y);
p++;
PP++;
} /*至此得到四边形的4个顶点的坐标*/
/*这里计算四边形ABCD的面积*/
double abc=area_of_triangle(a,b,c);
double adc=area_of_triangle(a,d,c);
double abd=area_of_triangle(a,b,d);
double bdc=area_of_triangle(b,d,c);
abcd =abc+adc;
//补充检测四边形,看它的凹凸性
abcd1=abd+bdc;
if(abcd1<abcd)//肯定是凹四边形
printf("%.3lf",abcd1);
else
printf("%.3lf",abcd);
}
实际上if(abcd1!=abcd)//才是判断是不是凹四边形的依据