Java构造多边形的各点坐标合理性判断并抛出异常

2023-10-26

好久没有发过文章了,今天心情好,分享以下今天的java作业吧。

题目要求是,构造多边形,并在点无法构造多边形时抛出对应的异常原因。

直接上代码:

1.构造点坐标:

public class Point 
{
	public int x,y;
	public Point(int x,int y) throws IllegalArgumentException
	{
		this.x = x;
		this.y = y;
		if(x<0||y<0)
		{
			throw new IllegalArgumentException("点坐标不能小于0");
		}
	}
	public String toString()
	{
		return "("+this.x+","+this.y+")";
	}
}

2.开始我们多边形的构造吧:

public class Polygon {
	public Point[] points;
	
	
	public Polygon(Point[] points) throws IllegalArgumentException
	{
		this.points = points;
		double[] slopes =  new double[points.length];
		//判断是否大于三个点
		if(points.length<3)
		{
			throw new IllegalArgumentException("多边形不能小于3个点");
		}
//==============================先对各个点的x坐标进行排序,是x最小的点排在第一个=================================		
		for (int g = 0; g < points.length-1; g++) {
			//第一轮,两两比较
			for (int t = 0; t < points.length-g-1; t++) {
				if (points[t].x>points[t+1].x) {
					Point temp1=points[t];
					points[t]=points[t+1];
					points[t+1]=temp1;
				}
			}
		}
		/*
		for(int y=0;y<points.length;y++)
		{
			System.out.println(points[y]);
		}
		*/
		slopes[0] = 100000000000000.0;//将低一个直接赋值为一个巨大的值,也就是默认第一个点位置不变
		//对除了第一个点的所有点求与第一个点的斜率
		for(int f=1;f<points.length;f++)
		{
			if(points[0].x-points[f].x==0)
				slopes[f] = 10000000000000.0;
			else
				slopes[f]=Slope(points[0],points[f]);
		}
		/*
		for(int y=0;y<slopes.length;y++)
		{
			System.out.println(slopes[y]);
		}
		*/
		//利用冒泡排序法通过对斜率的排序来对坐标顺序进行更改
		for (int l = 0; l < points.length-1; l++) {
			//第一轮,两两比较
			for (int p = 0; p < points.length-1; p++) {
				if (slopes[p]<slopes[p+1]) {
					double temp=slopes[p];
					slopes[p]=slopes[p+1];
					slopes[p+1]=temp;
					Point temp1=points[p];
					points[p]=points[p+1];
					points[p+1]=temp1;
				}
				
			}
		}
		/*
		for(int y=0;y<points.length;y++)
		{
			System.out.println(points[y]);
		}
		*/
//=====================================判断相邻两边是否共线=======================================================
		double av0 =  (points[0].y - points[points.length-1].y)/(points[0].x -points[points.length-1].x);
		for(int j = 0;j<points.length-2;j++)
		{
			if(points[j].x -points[j+1].x==0&&points[j+1].x -points[j+2].x!=0)
				continue;
			else if(points[j].x -points[j+1].x!=0&&points[j+1].x -points[j+2].x==0)
				continue;
			else if(points[j].x -points[j+1].x==0&&points[j+1].x -points[j+2].x==0)
				throw new IllegalArgumentException("多边形任意相邻两条边不能共线");
			else
			{
				double av1 = (points[j].y - points[j+1].y)/(points[j].x -points[j+1].x);
				double av2 = (points[j+1].y - points[j+2].y)/(points[j+1].x -points[j+2].x);
				if(av1==av2)
					throw new IllegalArgumentException("多边形任意相邻两条边不能共线");
				if(av0==av2)
					throw new IllegalArgumentException("多边形任意相邻两条边不能共线");
			}
		}
		//==================================判断内角和是否合理=========================================	
		double h0 = LineLength(points[0],points[1]);
		double h1 = LineLength(points[0],points[points.length-1]);
		double h2 = LineLength(points[points.length-1],points[points.length-2]);
		double hh1 = LineLength(points[1],points[points.length-1]);
		double hh2 = LineLength(points[0],points[points.length-2]);
		double Ca = Math.toDegrees(Math.acos((hh1 * hh1 - h1 * h1 - h0 * h0) / (-2 * h1 * h0)));
		double Cb = Math.toDegrees(Math.acos((hh2 * hh2 - h1 * h1 - h2 * h2) / (-2 * h1 * h2)));
		double sumAngle = Ca+Cb;
		//System.out.println(sumAngle);
		for(int k = 0;k<points.length-2;k++)
		{
			double a = LineLength(points[k],points[k+1]);
			double b = LineLength(points[k+1],points[k+2]);
			double c = LineLength(points[k],points[k+2]);				
			double C = Math.toDegrees(Math.acos((c * c - a * a - b * b) / (-2 * a * b)));
			//System.out.println(C);
			sumAngle = sumAngle + C;	
		}
		System.out.println(sumAngle);//这里的角度之和是浮点数,因为去的位数有限,只能无限逼近正确值
		int theBEST = (int) Math.ceil(sumAngle);//将这个数值四舍五入转换为整型
		if(theBEST!=180*(points.length-2))
				
			throw new IllegalArgumentException("多边形内角和应为(n-2)*pi");
		}
	
	public double LineLength(Point point1,Point point2)
	{
		//返回两点间的距离
		return Math.sqrt(Math.pow((point1.x-point2.x),2)+Math.pow((point1.y-point2.y),2)); 
	}
	public double Slope(Point point1,Point point2)
	{
		//返回两点间的斜率
		double e1 = (point1.y-point2.y);
		double e2 = (point1.x-point2.x);
		return e1/e2;
	}
	public String toString()
	{
		String str = points.length+"个点"+this.points[0].toString();
		for(int i = 1;i<points.length;i++)
			str +=","+this.points[i].toString();
		return str;			
	}

就用了一点时间所以写的有些繁琐,大体说一下思路吧,首先多边形我们是不确定它到底有几条边,所以在初始化的时候要用列表来存储所有的点。

思路:取x坐标最大的点A(如果最大x坐标的点不止一个,则取Y坐标最小的点),依次计算A点与其余各点的连线与水平线之间夹角的正切值,然后按照正切值排序,依次连接排序后的各点即组成一个简单图形。

原理:其它所有点都在A点的左侧,所有夹角的范围为-Pi/2~Pi/2,单调递增函数。

利用以上算法即可实现多边形的构造,但未必就是合格的多边形

对于异常处理,主要是用来验证这些点是否能够连成多边形:

1.点的数量必须大于3,小学生都知道。

2.相邻的两边不能共线,共线的话就会合成一条边,但目前还不能确定点是否可以组成多边形

3.那么当内角和必须等于(n-2)*pi时,就弥补了前两个条件的漏洞。

测试代码:

public static void main(String[] args)
	{
		Point point4 = new Point(1,1);
		Point point5 = new Point(1,2);
		Point point6 = new Point(2,1);
		Point point7 = new Point(2,2);
		Point points[] = {point4,point5,point6,point7};
		Polygon a2 = new Polygon(points);
		String a21 = a2.toString();
		System.out.println(a21);
	}

随便找了个正方形验证一下:

结果没有抛出异常,大家可以改改数据,抛抛异常,挺好玩的哦。

如果这片文章对你有所帮助的话,那么请点个赞,关个注呦,后续会更新更多内容~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java构造多边形的各点坐标合理性判断并抛出异常 的相关文章

随机推荐

  • R语言第六次课堂小测 高级绘图

    题目1 用lattice画出所要求的的图 数据集 鸢尾花 library lattice attach iris g1 lt xyplot Petal Length Petal Width Species g2 lt xyplot Peta
  • 各种log的加载过程

    1 概述 现在的log框架越来越多 目前我们系统用有使用的包括commons logging log4j slf4j 还有 一个号称更快的logback暂时基本没有用到 而这些log系统又常常依赖于一些jar包顺序和静态配置 导致比较混乱
  • 分号与逗号的区别及举例_顿号和逗号的区别

    顿号和逗号的区别2019 09 24 14 26 33文 宋则贤 顿号和逗号指代不同 顿号是并列的词或词组之间的停顿 逗号把句子切分为意群 表示小于分号大于顿号的停顿 顿号和逗号在用法上也有所不同 一 总的要求 字数较多时 用逗号 字数较少
  • React——路由Route

    文章目录 路由 一 Web 分类 前端渲染与后端渲染 二 Route 介绍 三 安装环境 四 Route 组件介绍 五 Route 组件应用 六 路由的前端渲染 七 url 中传递参数 1 斜杠型参数化路由 2 问号型参数化路由 八 重定向
  • VS2015项目属性配置中的变量设置

    关于VS的项目属性配置 很长时间都没有去细究关于各种定义的意义 比如说 outDir这样的东西以前没有细细追究过原因 这次都一并做个记录 1 常规页签 是对各个变量的解释输出目录 OutDir 中间目录 IntDir 目标文件名 Targe
  • 【个人笔记】一篇搞定js异步输出问题-浅分析(好理解)

    小试牛刀 来几个简单的异步问题引出易错小知识点 一 Promise Question1 new Promise resolve gt console log promise then function console log promise
  • PyQt5-窗口

    分类 在Qt中 生成窗口有三种方式 QWidget QMainWindow QDialog QWidget 控件和窗口的父类 自由度高 什么都东西都没有 没有划分菜单 工具栏 状态栏 主窗口 等区域 import sys from PyQt
  • uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

    uint8 t uint16 t uint32 t uint64 t 都是别名 c语言中有哪些数据类型 怎么样取别名 在C语言中有6种基本数据类型 short int long float double char 1 数值类型 1 整型 s
  • 57黑马QT笔记之数据库的语句执行--插入(包括SQL语句的增删改查和复制表结构)

    57黑马QT笔记之数据库的语句执行 插入 概念 1 回滚 也就是我们常见的事务回滚 例如当我要删除某个数据库时 我开启了一个事务 然后再弹出一个对话框给你 是否提交事务 或者作出事务的回滚 也就是说取消了这个删除的操作 并不会执行到删除数据
  • 奇偶排序算法

    在数组中重复两趟扫描 第一趟扫描选择所有的数据项对 a j 和 a j 1 j 是奇数 j 1 3 5 如果它们的关键字的值次序颠倒 就交换它们 第二趟扫描对所有的偶数数据项进行同样的操作 j 0 2 4 6 重复进行这样两趟的排序直到数组
  • 手把手教!搭建自己的免费服务器

    最近总是想搭建自己的网站 奈何皮夹里空空如也 服务器也租不起 更别说域名了 于是我就寻思能否自己搭建个服务器 还不要钱呢 还真行 经过几天的冲浪 我发现有两个免费的建站工具 Apache 和 Nginx 由于两个工具建站方法差不多 所以我就
  • koordinator混部系统实验分享

    简介 官网 https koordinator sh koordinator 是一个基于 qos 的 kubernetes 混合工作负载调度系统 它旨在提高对延迟敏感的工作负载和批处理作业的运行时效率和可靠性 简化与资源相关的配置调整的复杂
  • 安卓apk从浏览器下载后安装提示程序包解析异常处理!

    1 网上的处理一般都是如何适配安卓7 0 解决7 0的适配 而导致包解析异常 这个不多讲 主要说自己遇到的这点 如图 在mainfist配置清单中加上目标版本号和最小版本号即可优美解决
  • Java 判空新写法!干掉 if else !

    在文章的开头 先说下NPE问题 NPE问题就是 我们在开发中经常碰到的NullPointerException 假设我们有两个类 他们的UML类图如下图所示 在这种情况下 有如下代码 user getAddress getProvince
  • html中使行级标签隐藏显示出来,HTML标签显示类型

    HTML标签显示类型 HTML5学堂 码匠 依据HTML标签默认显示效果的不同 可以将HTML5标签简单的分为三大类 需要注意 在实际的分类中 并不仅仅是三类 一类是块状元素 一类是行元素 其他的元素显示类型较多 可以统一归为一类 在各类标
  • “面试造飞机,上岗拧螺丝“?2023软件测试岗面试真题超全面整理(最新版)

    软件测试这个岗位 想要找到一份高薪的工作 离不开繁杂的面试程序 这相信是很多准备应聘软件测试岗的朋友难题 很多已经在职多年的软件测试工程师对于这个岗位面试都谈虎色变 那么 为什么软件测试岗位的面试这么难呢 第一 软件测试属于互联网IT行业
  • 禁止本地中断

    禁止本地CPU中断是确保一组内核语句被当作一个临界区处理的主要机制 这个机制的意义是 即使当硬件设备产生了一个IRQ信号时 中断禁止也让内核控制路径继续执行 因此 这就提供了一种有效的方式 确保内核控制路径中的一些中断处理程序能访问的数据结
  • mes系统和plc通讯案例_MES系统与PLC数据集成主要方式

    现在工业化在迅速的发展 当然在发展过程中是离不开系统和软件的辅助 其中MES系统 ERP软件 PLC数据集成对企业有重要作用 那么MES系统与PLC数据集成主要方式有哪些 方式1 定期抓取数据 因为现在生产设备参数都是模拟量 数值一直在不停
  • CGI详解(原理,配置及访问)

    一 基本原理 CGI 通用网关接口 Common Gateway Interface 是一个Web服务器主机提供信息服务的标准接口 通过CGI接口 Web服务器就能够获取客户端提交的信息 转交给服务器端的CGI程序进行处理 最后返回结果给客
  • Java构造多边形的各点坐标合理性判断并抛出异常

    好久没有发过文章了 今天心情好 分享以下今天的java作业吧 题目要求是 构造多边形 并在点无法构造多边形时抛出对应的异常原因 直接上代码 1 构造点坐标 public class Point public int x y public P