多边形重心问题

来源:互联网 发布:零基础学算法可行 编辑:程序博客网 时间:2024/05/24 00:22

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=3

本题的思路就是:

1.判断是线段

2.判断是多边形(或多边形链接线段)

3.找出多边形的顶点

4.利用差积法求解多边形面积(可自行百度该方法)

 import java.util.ArrayList;import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO 自动生成的方法存根 java.text.DecimalFormat   df   =new   java.text.DecimalFormat("0.000");         Scanner sc=new Scanner(System.in);         ArrayList<Double> list=new ArrayList<Double>();         int n=sc.nextInt(),m,m1,count=0,flag=0;         double x,y,k1,k2,b,xx,yy,sumx,sumy,suma,s;     double array[][],x0,x1,x2,y0,y1,y2; String area,center;        while (n-- > 0) {            m = sc.nextInt();            m1 = m;            array = new double[m][2];            while (m-- > 0) {                x = sc.nextDouble();                y = sc.nextDouble();                array[count][0] = x;                array[count][1] = y;                count++;            }               //            for (int i = 1; i < (m1 - 1); i++) {                if ((array[m1 - 1][0] != array[0][0]) &&                        ((array[m1 - 1][0] - array[0][0]) != 0) &&                        ((array[i][0] - array[0][0]) != 0)) {                    k1 = (array[i][1] - array[0][1]) / (array[i][0] -                        array[0][0]);                    k2 = (array[m1 - 1][1] - array[0][1]) / (array[m1 - 1][0] -                        array[0][0]);                    if (k1 == k2) {                        flag = i + 1;                    } else {                        break;                    }                } else if (array[m1 - 1][0] == array[0][0]) {                    if (array[i][0] == array[0][0]) {                        flag = i + 1;                    } else {                        break;                    }                }            }                       if (flag == (m1 - 1)) {                System.out.print("0.000");                System.out.print(' ');                System.out.println("0.000");            }             //以上判断为直线            else {                /*此时图形为多边形或多边形与线段的链接,通过判断是否是拐点来判断是否是顶点并存入list中*/                                         for (int i = 2; i < m1; i++) {                    if (array[i - 1][0] == array[i - 2][0]) {                        if (array[i][0] != array[i - 1][0]) {                            list.add(array[i - 1][0]);                            list.add(array[i - 1][1]);                        }                    } else {                        x1 = array[i - 2][0];                        y1 = array[i - 2][1];                        x2 = array[i - 1][0];                        y2 = array[i - 1][1];                        k1 = (y1 - y2) / (x1 - x2);                        b = y1 - (k1 * x1);                        if (((array[i][0] * k1) + b) != array[i][1]) {                            list.add(array[i - 1][0]);                            list.add(array[i - 1][1]);                        }                    }                }                if (array[m1 - 1][0] == array[m1 - 2][0]) {                    if (array[0][0] != array[m1 - 1][0]) {                        list.add(array[m1 - 1][0]);                        list.add(array[m1 - 1][1]);                    }                } else {                    x1 = array[m1 - 2][0];                    y1 = array[m1 - 2][1];                    x2 = array[m1 - 1][0];                    y2 = array[m1 - 1][1];                    k1 = (y1 - y2) / (x1 - x2);                    b = y1 - (k1 * x1);                    if (((array[0][0] * k1) + b) != array[0][1]) {                        list.add(array[m1 - 1][0]);                        list.add(array[m1 - 1][1]);                    }                }                if (array[m1 - 1][0] == array[0][0]) {                    if (array[1][0] != array[m1 - 1][0]) {                        list.add(array[0][0]);                        list.add(array[0][1]);                    }                } else {                    x1 = array[m1 - 1][0];                    y1 = array[m1 - 1][1];                    x2 = array[0][0];                    y2 = array[0][1];                    k1 = (y1 - y2) / (x1 - x2);                    b = y1 - (k1 * x1);                    if (((array[1][0] * k1) + b) != array[1][1]) {                        list.add(array[0][0]);                        list.add(array[0][1]);                    }                }                //使用叉积法求多边形面积重心(不清楚的童鞋可以自行百度)                sumx = sumy = suma = 0.0;                x0 = list.get(0);                y0 = list.get(1);                x1 = list.get(2);                y1 = list.get(3);                for (int i = 4; i < list.size(); i = i + 2) {                    //?????                    x2 = list.get(i);                    y2 = list.get(i + 1);                    xx = x0 + x1 + x2;                    yy = y0 + y1 + y2;                    //?????                    s = (((x0 * y1) + (x1 * y2) + (x2 * y0)) - (x1 * y0) -                        (x2 * y1) - (x0 * y2)) / 2;                    //??                    suma += s;                    sumx += (s * xx);                    sumy += (s * yy);                    x1 = x2;                    y1 = y2;                }                area = df.format(Math.abs(suma));                center = df.format(((sumy / suma) + (sumx / suma)) / 3);                System.out.print(area);                System.out.print(' ');                System.out.println(center);            }            count = 0;            flag = 0;            list.clear();        }    }}        


0 0
原创粉丝点击