nyist 3 多边形重心问题
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=3
需要知道的知识点有:
1.叉积和点积的区别和它们引进的用途。
既然是向量,它得定义大小和方向,所以不同于常规的数字。
点积和叉积都是为了解决实际意义引进的。
为了解决已知两有向线段,求以它们为邻边的平行四边形的面积的问题,引入了点积。因为点积的结果是面积大小,所以它只是一个数字,没有方向。
叉积的产生是为了产生新的向量,至于它的方向的规定,是为了和笛卡尔坐标系一致,我们判断两个向量叉积的方向需要用到右手螺旋定则,如果A X B,则A、B向量叉积的方向就是四指从A到B,大拇指方向就是叉积方向。
2.多边形面积怎么求。
分割成多个三角形即可
3.三角形面积用叉积怎么求。
x2*y1-x1y2
4.重心是什么。
google一下就OK了
5.重心和面积以及坐标的关系。
把每个三角形看作一个质量为面积的点,然后求出这个三角形X坐标平均值,相乘后得到这个点
将所有点同样处理后相加,最终结果除以多边形面积就是多边形重心的X坐标。
Y同理求得。
1 #include <stdio.h> 2 #include <iostream> 3 #include <math.h> 4 #define N 10002 5 6 using namespace std; 7 8 typedef struct point 9 { 10 double x,y; 11 point() 12 { 13 x = 0.0; 14 y = 0.0; 15 } 16 }point; 17 18 point a[N]; 19 20 int main() 21 { 22 int T; 23 scanf("%d",&T); 24 while(T--) 25 { 26 int n; 27 int i; 28 int t = 0; 29 double sum = 0; 30 double case_x = 0; 31 double case_y = 0; 32 scanf("%d",&n); 33 for(i = 0;i < n; i++) 34 scanf("%lf%lf",&a[i].x,&a[i].y); 35 for(i = 1; i <= n; i++) 36 { 37 double temp = (a[i%n].x*a[i-1].y - a[i%n].y*a[i-1].x ) /2.0; 38 sum += temp; 39 case_x += temp * (a[i%n].x + a[i-1].x)/3.0; 40 case_y += temp * (a[i%n].y + a[i-1].y) /3.0; 41 } 42 if(fabs(sum - 0 < 0.0000001)) 43 printf("0.000 0.000\n"); 44 else 45 printf("%.3lf %.3lf\n",sum,(case_x+case_y)/sum ); 46 47 } 48 return 0; 49 }
yy_room