第二次博客
前言
相比于上次写博客,这次明显水平得到提升,在本三周的大作业中,作业对象最主要由三角形上升到四边形,五边形,而在四边形,五边形中也包含前面对象为三角形的东西,难度明显增加。而且类和类之前的复杂程度几何倍提高。比如本次对象为四边形的作业,我虽然打着面向对象的名头,依然思维还是按照面向过程来写,这种写法使得使用率大大降低,而且写的不是很美观,最主要是我创建的方法没有那种明显识别性,导致我总是想调用方法时,找不到方法。为后来的五边形题目埋下隐患。
关于四边形的作业
这次作业在三边形的基础上升级了一回,不但包含类似三角形的相关问题,还和三角形扯上联系。这次题目要注意以下条件:
1:输入四个点坐标,判断是否是四边形、平行四边形,判断结果输出true/false,结果之间以一个英文空格符分隔。
2:输入四个点坐标,判断是否是菱形、矩形、正方形,判断结果输出true/false,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
3:输入四个点坐标,判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
4:输入六个点坐标,前两个点构成一条直线,后四个点构成一个四边形或三角形,输出直线与四边形(也可能是三角形)相交的交点数量。如果交点有两个,再按面积从小到大输出四边形(或三角形)被直线分割成两部分的面积(不换行)。若直线与四边形或三角形的一条边线重合,输出"The line is coincide with one of the lines"。若后四个点不符合四边形或三角形的输入,输出"not a quadrilateral or triangle"。
后四个点构成三角形的情况:假设三角形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z 不与xy都相邻,如z x y s、x z s y、x s z y
5:输入五个点坐标,输出第一个是否在后四个点所构成的四边形(限定为凸四边形,不考虑凹四边形)或三角形(判定方法见选项4)的内部(若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。如果点在多边形的某条边上,输出"on the triangle或者on the quadrilateral"。若后四个点不符合四边形或三角形,输出"not a quadrilateral or triangle"。
在写 作业时首先面对的难题依然是坐标的输入,这次坐标输入和上次三角形有些不同,但是我依然用正则表达式输入。本次题目难点在于序号34,但是我却因为不会所以没写,只有序号1,2,3。以下为我的代码:
1.首先对输入的坐标进行判断
public static int total(int sum, String num) { int t = 0; for (int i = 0; i < sum; i++) { if (num.charAt(i) == ',') { t++; } } return t; } public static int judge(int sum, String num) { String pattern = "(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?"; int t = 0; if ((num.charAt(0) >= '1' && num.charAt(0) <= '4') && num.charAt(1) == ':') { t = 0; } else { t = 1; return t; } num = num.substring(2); if (num.matches(pattern) == true) { t = 0; } else t = 1; return t; } }
2.然后针对序号一对四边形和平行四边形进行判断
public int judge(String num, int sum) {// 判断四边形 int t = 0, i = 0, j = 0, m = 1; String[] str = num.split("(\\s+|,)"); double[] a = new double[str.length]; for (i = 0; i < str.length; i++) { a[i] = Double.parseDouble(str[i]); } if ((a[7] - a[5]) * (a[6] - a[2]) == (a[7] - a[3]) * (a[6] - a[4])) { m = 0; } else if ((a[7] - a[5]) * (a[6] - a[0]) == (a[7] - a[1]) * (a[6] - a[4])) m = 0; else if ((a[7] - a[3]) * (a[6] - a[0]) == (a[7] - a[1]) * (a[6] - a[2])) m = 0; else if ((a[5] - a[2]) * (a[4] - a[0]) == (a[5] - a[1]) * a[4] - a[2]) m = 0; else { } return m; } public int judge1(String num, int sum) {// 判断平行四边形 int t = 0, m = 0, n = 0; String[] str = num.split("(\\s+|,)"); double[] a = new double[str.length]; for (int i = 0; i < str.length; i++) { a[i] = Double.parseDouble(str[i]); } double i = Math.pow(a[3] - a[1], 2) + Math.pow(a[2] - a[0], 2); double j = Math.pow(a[7] - a[5], 2) + Math.pow(a[6] - a[4], 2); if ((a[3] - a[1]) * (a[6] - a[4]) == (a[7] - a[5]) * (a[2] - a[0])) m = 1; if (m == 1 && (i == j)) t = 1; double x = Math.pow(a[5] - a[3], 2) + Math.pow(a[4] - a[2], 2); double y = Math.pow(a[7] - a[1], 2) + Math.pow(a[6] - a[0], 2); if ((a[7] - a[1]) * (a[4] - a[2]) == (a[5] - a[3]) * (a[6] - a[0])) n = 1; if (n == 1 && (x == y)) t = 1; return t; } public static int total1(int sum, String num) { int t = 0; for (int i = 0; i < sum-2; i++) { if (num.charAt(i) == ',') { t++; } } return t; } }
3.再针对序号2的各种特殊四边形进行判定
public int judge2(String num,int sum) {//判断菱形 int t=0,i=0,j=0,m=1; String[] str = num.split("(\\s+|,)"); double[] a=new double[str.length]; for(i=0;i<str.length;i++) { a[i] = Double.parseDouble(str[i]); } double a1=Math.pow(a[2]-a[0],2)+Math.pow(a[3]-a[1], 2); double a2=Math.pow(a[4]-a[2],2 )+Math.pow(a[5]-a[3], 2); if(a1==a2) t=1; return t; } public int judge3(String num,int sum) {//判断矩形 int t=0,i=0,j=0,m=1; String[] str = num.split("(\\s+|,)"); double[] a=new double[str.length]; for(i=0;i<str.length;i++) { a[i] = Double.parseDouble(str[i]); } double a1=a[2]-a[0]; double b1=a[3]-a[1]; double a2=a[4]-a[2]; double b2=a[5]-a[3]; if(a1*a2-b1*b2==0) t=1; return t; }
4.最后针对序号3的凹凸四边形进行判断
public void judge5(String num,int sum) {//判断是凸四边形还是凹四边形 int t=0,i=0,j=0,m=1; String[] str = num.split("(\\s+|,)"); double[] a=new double[str.length]; for(i=0;i<str.length;i++) { a[i] = Double.parseDouble(str[i]); } double x1=Math.abs(a[0]*(a[3]-a[5])+a[2]*(a[5]-a[1])+a[4]*(a[1])-a[3]); double y1=Math.abs(a[4]*(a[7]-a[1])+a[6]*(a[5]-a[1])+a[0]*(a[7]-a[5])); double x2=Math.abs(a[2]*(a[7]-a[5])+a[4]*(a[7]-a[3])+a[6]*(a[3]-a[5])); double y2=Math.abs(a[0]*(a[7]-a[3])+a[2]*(a[7]-a[1])+a[6]*(a[3]-a[1])); if(x1+y1==x2+y2) System.out.println("true"); else System.out.println("false"); }
BUG的情况:
当出现坐标点不符合情况时,需要在输出异常情况下,添加System.exit(0),退出程序,否则会继续进行,在特殊情况下报错两种情况。
关于五边形的作业
这次作业可谓是Boss级别的,融合了前几次作业关于三角形,四边形的相关问题,难度不在一个等级。这次作业我用的代码格式不同以往,因为用以往的形式是一个类一个整体,无法拼接,所以我参照别人的四边形代码,采用拼接的形式。以下为题目条件:
1:输入五个点坐标,判断是否是五边形,判断结果输出true/false。
2:输入五个点坐标,判断是凹五边形(false)还是凸五边形(true),如果是凸五边形,则再输出五边形周长、面积,结果之间以一个英文空格符分隔。 若五个点坐标无法构成五边形,输出"not a pentagon"
3:输入七个点坐标,前两个点构成一条直线,后五个点构成一个凸五边形、凸四边形或凸三角形,输出直线与五边形、四边形或三角形相交的交点数量。如果交点有两个,再按面积从小到大输出被直线分割成两部分的面积(不换行)。若直线与多边形形的一条边线重合,输出"The line is coincide with one of the lines"。若后五个点不符合五边形输入,若前两点重合,输出"points coincide"。
以上3选项中,若输入的点无法构成多边形,则输出"not a polygon"。输入的五个点坐标可能存在冗余,假设多边形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如:x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z不与xy都相邻,如:z x y s、x z s y、x s z y。
以下为我的代码:
1.首先,对输入的坐标进行判断
class PointInputError { //判断从字符串中解析出的点的数量是否合格。 public static void wrongNumberOfPoints(ArrayList ps, int num) { if (ps.size() != num) { System.out.print("wrong number of points"); System.exit(0); } } //判断输入的字符串中点的坐标部分格式是否合格。若不符合,报错并退出程序 public static void wrongPointFormat(String s) { if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) { System.out.print("Wrong Format"); System.exit(0); } } // 输入字符串是否是"选项:字符串"格式,选项部分是否是1~3其中之一 public static void wrongChoice(String s) { if (!s.matches("[1-3]:.+")) { System.out.print("Wrong Format"); System.exit(0); } } }
2,然后针对序号1,对五边形进行判断
public boolean isquadr(){//判断五边形 if(!isquadr1()&&!isquadr2()&&!isquadr3()) { return true; } else return false; } public boolean isquadr1() {//判断点重合(重合即为true) //LineInputError d = new LineInputError(); if(p1.equals(p2)||p1.equals(p3)||p1.equals(p4)||p1.equals(p5)||p2.equals(p3)||p2.equals(p4)||p2.equals(p5)||p3.equals(p4)||p3.equals(p5)||p4.equals(p5)) { return true; } else return false; } public boolean isquadr2() {//判断领边是否平行(true就是平行) if(l12.isParallel(l23)||l23.isParallel(l34)||l34.isParallel(l45)||l45.isParallel(l51)) { return true; } else return false; } public boolean isquadr3() {//判断是否交叉(true为交叉) if(l12.cross(l45)||l12.cross(l34)||l23.cross(l45)||l23.cross(l51)||l34.cross(l51)) { return true; } else return false; }
3.再,针对序号2,判断凹凸五边形,并输出周长,面积
//计算五边形周长 public double Perimeter(){ return l12.Distance() + l23.Distance() + l34.Distance() + l45.Distance()+l51.Distance(); } /*判断是凸五边形 还是凹五边形 凸五边形返回 1 凹五边形返回 -1 * 判断四个点是否都在其对应的余三角形里判断点是否在三角形里应用射线法*/ public int ConvexOrConcave() { if(ConvexOrConcave1(p1,p2,p3)&&ConvexOrConcave1(p2,p3,p4)&&ConvexOrConcave1(p3,p4,p5)&&ConvexOrConcave1(p4,p5,p1)&&ConvexOrConcave1(p5,p1,p2)) { return 1; } else return -1; } public boolean ConvexOrConcave1(Point p1,Point p2,Point p3) {//true即为大于0 double a1=p2.x-p1.x; double a2=p2.y-p1.y; double b1=p3.x-p2.x; double b2=p3.y-p2.y; if(a1*b2-a2*b1>0) return true; else return false; } //计算五边形面积 public double area(){ return Math.abs((p1.x*p2.y-p2.x*p1.y+p2.x*p3.y-p3.x*p2.y+p3.x*p4.y-p4.x*p3.y+p4.x*p5.y-p5.x*p4.y)/2); }
4.再针对序号3计算线段分割的面积(只是线段分割五边形为三角形和五边形情况)
//计算一个三边形面积和一个五边形面积 public void Pengoton1(Line x) { if(l12.cross(x)&&l23.cross(x)) { if(l12.isOnline( x.getP1())) { Point a=count(l12,x); Point b=count(l23,x); Triangle d=new Triangle(p2,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p3,p4,p5); Triangle d2=new Triangle(p5,p1,x.getP1()); Triangle d3=new Triangle(p1,x.getP1(),x.getP2()); Triangle d4=new Triangle(p3,p5,x.getP2()); double n=d1.getArea()+d2.getArea()+d3.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } else { Point a=count(l12,x); Point b=count(l23,x); Triangle d=new Triangle(p2,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p3,p4,p5); Triangle d2=new Triangle(p5,p1,x.getP2()); Triangle d3=new Triangle(p1,x.getP1(),x.getP2()); Triangle d4=new Triangle(p3,p5,x.getP1()); double n=d1.getArea()+d2.getArea()+d3.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } } else if(l23.cross(x)&&l34.cross(x)) { if(l23.isOnline( x.getP1())) { Point a=count(l23,x); Point b=count(l34,x); Triangle d=new Triangle(p3,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p4,p5,p1); Triangle d2=new Triangle(p4,p1,x.getP2()); Triangle d3=new Triangle(p1,x.getP1(),x.getP2()); Triangle d4=new Triangle(p1,p2,x.getP1()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } else { Point a=count(l23,x); Point b=count(l34,x); Triangle d=new Triangle(p3,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p4,p5,p1); Triangle d2=new Triangle(p4,p1,x.getP1()); Triangle d3=new Triangle(p1,x.getP1(),x.getP2()); Triangle d4=new Triangle(p1,p2,x.getP2()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } } else if(l34.cross(x)&&l45.cross(x)) { if(l34.isOnline( x.getP1())) { Point a=count(l34,x); Point b=count(l45,x); Triangle d=new Triangle(p4,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p5,p1,p2); Triangle d2=new Triangle(p5,p2,x.getP2()); Triangle d3=new Triangle(p2,x.getP1(),x.getP2()); Triangle d4=new Triangle(p2,p3,x.getP1()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } else { Point a=count(l34,x); Point b=count(l45,x); Triangle d=new Triangle(p4,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p5,p1,p2); Triangle d2=new Triangle(p5,p2,x.getP2()); Triangle d3=new Triangle(p2,x.getP1(),x.getP2()); Triangle d4=new Triangle(p2,p3,x.getP1()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } } else if(l45.cross(x)&&l51.cross(x)) { if(l45.isOnline( x.getP1())) { Point a=count(l45,x); Point b=count(l51,x); Triangle d=new Triangle(p5,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p1,p2,p3); Triangle d2=new Triangle(p1,p3,x.getP2()); Triangle d3=new Triangle(p3,x.getP1(),x.getP2()); Triangle d4=new Triangle(p3,p4,x.getP1()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } else { Point a=count(l45,x); Point b=count(l51,x); Triangle d=new Triangle(p5,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p1,p2,p3); Triangle d2=new Triangle(p1,p3,x.getP1()); Triangle d3=new Triangle(p3,x.getP1(),x.getP2()); Triangle d4=new Triangle(p3,p4,x.getP2()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } } else if(l51.cross(x)&&l12.cross(x)) { if(l51.isOnline( x.getP1())) { Point a=count(l51,x); Point b=count(l12,x); Triangle d=new Triangle(p1,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p2,p3,p4); Triangle d2=new Triangle(p2,p4,x.getP2()); Triangle d3=new Triangle(p4,x.getP1(),x.getP2()); Triangle d4=new Triangle(p4,p5,x.getP1()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } else { Point a=count(l51,x); Point b=count(l12,x); Triangle d=new Triangle(p1,x.getP1(),x.getP2()); double m=d.getArea(); Triangle d1=new Triangle(p2,p3,p4); Triangle d2=new Triangle(p2,p4,x.getP1()); Triangle d3=new Triangle(p4,x.getP1(),x.getP2()); Triangle d4=new Triangle(p4,p5,x.getP2()); double n=d1.getArea()+d2.getArea()+d3.getArea()+d4.getArea(); if(m>n) System.out.println(OutFormat.doubleFormat(n)+" "+OutFormat.doubleFormat(m)); else System.out.println(OutFormat.doubleFormat(m)+" "+OutFormat.doubleFormat(n)); } } }
BUG的情况:
本次题目输出时格式不符合,所以改进用以下方法:
public class OutFormat { //按要求格式化实数的输出,保留三位小数。 public static Double doubleFormat(double b) { DecimalFormat df = new DecimalFormat("#.000"); Double output = Double.valueOf(df.format(b)); return output; } }
心得体会:
本次作业受益颇多,尤其在关于四边形,五边形题目上,我懂得可以一类套一类,比如说创建Point类保存点的x,y坐标,然后创建Line类用来保存线段。还可以将不同方法放在不同类中,比如有关于Point类的计算放在Point类,Line类计算放在Line类。这样防止代码重复书写,可以直接调用。最后再创建每个方法对每个不同序号一一配对。十分简洁明了。

浙公网安备 33010602011771号