鱼C论坛

 找回密码
 立即注册
查看: 3091|回复: 3

[已解决]用C语言求平面上一个凸四边形的面积

[复制链接]
发表于 2020-10-15 16:03:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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

以下是我写的代码,提交后显示答案错误。
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main() {
  4.     double xa,ya,xb,yb,xc,yc,xd,yd,x1,x2,x3,x4,y1,y2,y3,y4,s1,s2;
  5.     while(scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd)!=EOF){
  6.         x1 = xb-xa;y1 = yb-ya;x2 = xd-xa;y2 = yd-ya;
  7.         x3 = xd-xc;y3 = yd-yc;x4 = xb-xc;y4 = yb-yc;
  8.         s1 = 0.5*abs(x1*y2-x2*y1);
  9.         s2 = 0.5*abs(x3*y4-x4*y3);
  10.         printf("area = %.4f\n",s1+s2);
  11.     }
  12.     return 0;
  13. }
复制代码

经过我的研究发现,我的代码没能解决四个点的坐标可以按A、B、C、D的顺序输入,也可以按C、D、A、B的顺序输入等等的问题。我是通过变成两个三角形用向量积,但是A,B,C,D不一定按顺序排,如果测试库中的顺序为A,C,B,D,我代码运行结果会出错,现在要么解决顺序问题,要么想出不用靠一定顺序已知任意坐标顺序也能求面积的方法。希望有大佬能帮我想想办法,如果能提供正确代码,本菜鸟将感激不尽!
最佳答案
2020-10-15 17:12:02
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>

  4. typedef struct tagPosition
  5. {
  6.         double x;
  7.         double y;
  8. }POS,*LPPOS;

  9. //计算两点间距离
  10. double getDistance(LPPOS p1,LPPOS p2)
  11. {       
  12.         return sqrt(pow(p2->x-p1->x,2)+pow(p2->y-p1->y,2));
  13. }

  14. int main()
  15. {
  16.         POS pos[4] = {0};
  17.         double dis[5] = {0};
  18.         double area = 0;

  19.         printf("输入四边形的四个顶点坐标:\n");
  20.         scanf("%lf %lf %lf %lf %lf %lf %lf %lf",
  21.                   &pos[0].x,&pos[0].y,
  22.                   &pos[1].x,&pos[1].y,
  23.                   &pos[2].x,&pos[2].y,
  24.                   &pos[3].x,&pos[3].y);

  25.         //计算4条边的长度
  26.         for(int i = 0 ; i < 4 ; i ++)
  27.         {
  28.                 if(i < 3)
  29.                 {
  30.                         dis[i] = getDistance(&pos[i],&pos[i+1]);
  31.                 }
  32.                 else
  33.                 {
  34.                         dis[i] = getDistance(&pos[i],&pos[0]);
  35.                 }
  36.         }
  37.        
  38.         //计算1,3点对角线的长度
  39.         dis[4] = getDistance(&pos[0],&pos[2]);
  40.        
  41.         //用海伦公式计算一个三角形面积
  42.         //计算三角形半周长
  43.         double p = (dis[4]+dis[0]+dis[1])/2;
  44.        
  45.         //海伦公式
  46.         //area = 平方根(1/2周长 * (1/2周长 - 边长1) * (1/2周长 - 边长2) * (1/2周长 - 边长3))
  47.         area = sqrt(p * (p - dis[0]) * (p - dis[1]) * (p - dis[4]));
  48.        
  49.         //计算另外一个三角形的半周长
  50.         p = (dis[4]+dis[2]+dis[3])/2;
  51.         //加上另外一般三角形的面积
  52.         area += sqrt(p * (p - dis[2]) * (p - dis[3]) * (p - dis[4]));

  53.         printf("area = %.4lf",area);

  54.        
  55.         return 0;
  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-15 17:12:02 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>

  4. typedef struct tagPosition
  5. {
  6.         double x;
  7.         double y;
  8. }POS,*LPPOS;

  9. //计算两点间距离
  10. double getDistance(LPPOS p1,LPPOS p2)
  11. {       
  12.         return sqrt(pow(p2->x-p1->x,2)+pow(p2->y-p1->y,2));
  13. }

  14. int main()
  15. {
  16.         POS pos[4] = {0};
  17.         double dis[5] = {0};
  18.         double area = 0;

  19.         printf("输入四边形的四个顶点坐标:\n");
  20.         scanf("%lf %lf %lf %lf %lf %lf %lf %lf",
  21.                   &pos[0].x,&pos[0].y,
  22.                   &pos[1].x,&pos[1].y,
  23.                   &pos[2].x,&pos[2].y,
  24.                   &pos[3].x,&pos[3].y);

  25.         //计算4条边的长度
  26.         for(int i = 0 ; i < 4 ; i ++)
  27.         {
  28.                 if(i < 3)
  29.                 {
  30.                         dis[i] = getDistance(&pos[i],&pos[i+1]);
  31.                 }
  32.                 else
  33.                 {
  34.                         dis[i] = getDistance(&pos[i],&pos[0]);
  35.                 }
  36.         }
  37.        
  38.         //计算1,3点对角线的长度
  39.         dis[4] = getDistance(&pos[0],&pos[2]);
  40.        
  41.         //用海伦公式计算一个三角形面积
  42.         //计算三角形半周长
  43.         double p = (dis[4]+dis[0]+dis[1])/2;
  44.        
  45.         //海伦公式
  46.         //area = 平方根(1/2周长 * (1/2周长 - 边长1) * (1/2周长 - 边长2) * (1/2周长 - 边长3))
  47.         area = sqrt(p * (p - dis[0]) * (p - dis[1]) * (p - dis[4]));
  48.        
  49.         //计算另外一个三角形的半周长
  50.         p = (dis[4]+dis[2]+dis[3])/2;
  51.         //加上另外一般三角形的面积
  52.         area += sqrt(p * (p - dis[2]) * (p - dis[3]) * (p - dis[4]));

  53.         printf("area = %.4lf",area);

  54.        
  55.         return 0;
  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-15 17:33:10 | 显示全部楼层

稍微改了下输出格式和循环,去答题平台提交了一下成功了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-11 16:06:40 | 显示全部楼层
其实我原程序的abs改成fabs就对了没必要用海伦公式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 18:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表