用C语言求平面上一个凸四边形的面积
C语言程序设计基础,学校OJ里的题。题目描述
编程实现:求平面上一个凸四边形的面积。凸四边形4个顶点的坐标按顺时针顺序输入,这四个点的坐标可以按A、B、C、D的顺序输入,也可以按C、D、A、B的顺序输入,等等。
输入
有多组测试数据,每一组有八个测试数据,分别为A的横坐标,A的纵坐标,B的横坐标,B的纵坐标,C的横坐标,C的纵坐标,D的横坐标,D的纵坐标。
凸四边形的其中两条边平行,且顶点均为整点。
输出
每组输出占一行,为凸四边形面积,面积前需加“area = ”。
样例输入
140 179 185 179 198 135 132 135
139 180 189 180 183 140 149 140
80 140 194 140 384 139 219 139
样例输出
area = 2442.0000
area = 1680.0000
area = 139.5000
以下是我写的代码,提交后显示答案错误。
#include <stdio.h>
#include <math.h>
int main() {
double xa,ya,xb,yb,xc,yc,xd,yd,x1,x2,x3,x4,y1,y2,y3,y4,s1,s2;
while(scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd)!=EOF){
x1 = xb-xa;y1 = yb-ya;x2 = xd-xa;y2 = yd-ya;
x3 = xd-xc;y3 = yd-yc;x4 = xb-xc;y4 = yb-yc;
s1 = 0.5*abs(x1*y2-x2*y1);
s2 = 0.5*abs(x3*y4-x4*y3);
printf("area = %.4f\n",s1+s2);
}
return 0;
}
经过我的研究发现,我的代码没能解决四个点的坐标可以按A、B、C、D的顺序输入,也可以按C、D、A、B的顺序输入等等的问题。我是通过变成两个三角形用向量积,但是A,B,C,D不一定按顺序排,如果测试库中的顺序为A,C,B,D,我代码运行结果会出错,现在要么解决顺序问题,要么想出不用靠一定顺序已知任意坐标顺序也能求面积的方法。希望有大佬能帮我想想办法,如果能提供正确代码,本菜鸟将感激不尽!{:7_123:}{:7_123:} {:7_123:} #include <stdlib.h>
#include <stdio.h>
#include <math.h>
typedef struct tagPosition
{
double x;
double y;
}POS,*LPPOS;
//计算两点间距离
double getDistance(LPPOS p1,LPPOS p2)
{
return sqrt(pow(p2->x-p1->x,2)+pow(p2->y-p1->y,2));
}
int main()
{
POS pos = {0};
double dis = {0};
double area = 0;
printf("输入四边形的四个顶点坐标:\n");
scanf("%lf %lf %lf %lf %lf %lf %lf %lf",
&pos.x,&pos.y,
&pos.x,&pos.y,
&pos.x,&pos.y,
&pos.x,&pos.y);
//计算4条边的长度
for(int i = 0 ; i < 4 ; i ++)
{
if(i < 3)
{
dis = getDistance(&pos,&pos);
}
else
{
dis = getDistance(&pos,&pos);
}
}
//计算1,3点对角线的长度
dis = getDistance(&pos,&pos);
//用海伦公式计算一个三角形面积
//计算三角形半周长
double p = (dis+dis+dis)/2;
//海伦公式
//area = 平方根(1/2周长 * (1/2周长 - 边长1) * (1/2周长 - 边长2) * (1/2周长 - 边长3))
area = sqrt(p * (p - dis) * (p - dis) * (p - dis));
//计算另外一个三角形的半周长
p = (dis+dis+dis)/2;
//加上另外一般三角形的面积
area += sqrt(p * (p - dis) * (p - dis) * (p - dis));
printf("area = %.4lf",area);
return 0;
} xieglt 发表于 2020-10-15 17:12
稍微改了下输出格式和循环,去答题平台提交了一下成功了,谢谢大佬{:5_95:}{:5_95:}{:5_95:} 其实我原程序的abs改成fabs就对了{:10_266:}没必要用海伦公式
页:
[1]