标签:分割 坐标 解题思路 ota 结束 pre 2.0 面积 学生
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 45028 Accepted Submission(s): 23074
解题思路:叉乘的运用 https://www.cnblogs.com/mycapple/archive/2012/08/06/2624617.html
原理是在平面上取(0,0)来分割多边形为多个三角形,然后用叉乘来求三角形的面积(有向)再求和。这样的话可以把凸N多边形转化为N个三角形,然后求解N个三角形即可,输入顶点的顺序 无论是顺时针还是逆时针均可。
* 题目要求:计算多边形面积
* 方法:把n多边形分割成n-2个三角形,分别求和,然后相加
* 注意:分割的所有三角形有一个公共的顶点,这里选择0点位公共点
* 注:题中给出的点的顺序为逆时
* 叉乘的性质:设两向量P和Q
* 1.P ×Q > 0 则Q在P的逆时针方向
* 2.P ×Q < 0 则Q在P的顺时针方向
* 3.P ×Q = 0 则Q和P共线,方向可能相同也可能不相同
参考资料:计算几何基础
之所以不用海伦公式:有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:S=√[p(p-a)(p-b)(p-c)] 而公式里的p为半周长: p=(a+b+c)/2
是由于1:计算量大。2:精度损失
#include<iostream> #include<cstdio> #include<cmath> int main() { int T, x1, y1, x2, y2, x3, y3, N, area; while (scanf("%d", &T) && T)//多边形边数 { area = 0; N = T - 2;//可以构成T-2个三角形 scanf("%d%d%d%d", &x1, &y1, &x2, &y2);//以(x1,y1)为顶点,保证(x1,y1)不变,不断变化(x2,y2)和(x3,y3) while (N--) { scanf("%d%d", &x3, &y3); area += (x2 - x3) * (y1 - y3) - (y2 - y3) * (x1 - x3);//向量叉乘 x2 = x3; y2 = y3; } printf("%.1lf\n", fabs(area / 2.0)); //此处注意double与int } return 0; }
标签:分割 坐标 解题思路 ota 结束 pre 2.0 面积 学生
原文地址:https://www.cnblogs.com/-citywall123/p/10052422.html