多边形重心问题
来源:互联网 发布:零基础学算法可行 编辑:程序博客网 时间: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
- 多边形重心问题
- acm-多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 3 多边形重心问题
- NYOJ多边形重心问题
- NYOJ - 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形重心问题 java
- nyoj3 多边形重心问题 【多边形面积+多边形重心】
- nyoj 3 多边形重心问题
- 南阳理工:多边形重心问题
- 至管理员的大贴之gsfgsdg
- canvas.toDataURL() dataURL转化blob 失败
- Linux指令
- 总结:操作系统相关知识
- 快乐、聪明和有用,你会如何选择?
- 多边形重心问题
- Swift学习笔记 ---Properties
- 关于A星寻路的一些代码
- 《福布斯》2011 年评腾讯创新能力全球第四,超越苹果和谷歌,如何理解?
- 屏幕横竖发生变化时,当前Activity发生的生命周期变化
- 【概念笔记】JAVA基础 - part1
- 粗糙集(Rough set) 理论
- 第五周-raptor 矩形面积计算
- 软件工程导论作业