http://acm.wust.edu.cn/problem.php?id=1186&soj=0
此处略加说明:
方法A:已知三点坐标分别为:(x1,y1),(x2,y2),(x3,y3)。三角形面积为:
方法B:坐标存储在x[100],y[100]。下标从0开始,则多边形面积为:
方法A:如图,有5个点的凸多边形,将它以第一个点为基准切割成3个三角形分别计算面积,并累加得到五边形的面积。5个点坐标依次为:(2,1),(0,2),(-2,1),(-1,-1),(1,-2)。
方法B:顶点个数用n表示,为0退出。顶点个数最多100个,坐标可用两个int型一维数组x[100],y[100]存储。将点的坐标全部带入公式计算面积。
备注:以上两种方法适用于所有多边形,包括凹多边形。
方法A:
#include<stdio.h> int main() { int n, x1, y1, x2, y2, x3, y3; float areaOfTriangle, areaOfPolygon; // 三角形面积,多边形面积 while (scanf("%d", &n) && n != 0) { areaOfPolygon = 0; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); // 输入前2个点的坐标 for(n -= 2; n > 0; n--) { scanf("%d%d", &x3, &y3); // 计算三角形面积 areaOfTriangle = 0.5 * (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)); areaOfPolygon += areaOfTriangle; // 加到多边形的面积中 x2 = x3; // 以便计算下一个三角形面积 y2 = y3; } printf("%.1f\n", areaOfPolygon); } return 0; }
方法B:
#include <stdio.h> int main() { int n, i, area, x[100], y[100]; while (scanf("%d", &n) && n != 0) { for (i = 0; i < n; i++) { scanf("%d%d", &x[i], &y[i]); // 输入所有坐标 } for (area = 0, i = 0; i < n; i++) { // 初始化面积为0 area += (x[i] * y[(i + 1) % n] - y[i] * x[(i + 1) % n]); // 多边形面积公式 } printf("%.1f\n", 0.5*area); // 输出面积 } }
数据1:3个点组成的三角形
数据2:4个点组成的凹多边形
数据3:5个点的凸多边形(图1186)