江西理工18年校赛D四边形面积(OJ题目ACM)

版权声明:感谢查看,转载请注明原地址,知识与您同在。 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)//才是判断是不是凹四边形的依据

猜你喜欢

转载自blog.csdn.net/a1023182899/article/details/84678251