3-多边形重心问题
内存限制:64MB 时间限制:3000ms Special Judge: No
题目描述:
在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入描述:
第一行有一个整数0<n<11,表示有n组数据; 每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;
输出描述:
输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;
样例输入:
复制
3 3 0 1 0 2 0 3 3 1 1 0 0 0 1 4 1 1 0 0 0 0.5 0 1
样例输出:
0.000 0.000 0.500 1.000 0.500 1.000
这道题我们只要知道三角形面积用叉积怎么求:x2*y1-x1y2,然后把多边形分为多个三角形。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int T=sc.nextInt(); while(T-->0) { int n=sc.nextInt(); double[][] data=new double[n][2]; double s=0; double sx=0; double sy=0; for(int i=0;i<n;i++) { data[i][0]=sc.nextDouble(); data[i][1]=sc.nextDouble(); } for(int j=1;j<=n;j++) { double temp=(data[j%n][0]*data[j-1][1]-data[j%n][1]*data[j-1][0])/2.0; s=s+temp; sx=sx+temp*(data[j%n][0]+data[j-1][0])/3; sy=sy+temp*(data[j%n][1]+data[j-1][1])/3; } if(Math.abs(s)<0.0000001) { System.out.println("0.000 0.000"); continue; } System.out.printf("%.3f %.3f\n",s,(sx+sy)/s); } } }