Blog2:nchu-software-oop-2022-4+5+期中
一、前言
两次大作业是关于四边形和五边形的相关操作,类似于之前的三角形,但由于图形边数的变化,难度大大增加。对数学知识的运用考察较多,其中还有对正则表达式的考量。在完成五边形第二题作业是,由于前面创建的类并不好,在面对复杂的五边形时,前面的类根本没有办法延用。这两次作业对我来说都很吃力。考查的知识点有:字符串的输出和输入,强制转化变量的类型,split函数的应用,逻辑思维能力,全面考虑问题的能力,方法编写能力,正则表达式练习。其中,主要题目是图形界面类设计编写。这些作业题量和难度都很大,全部尽量写到最好要花费比较多的时间。
期中考试主要考察了PTA图形界面类设计编写,共有三道题目,题量一般。与平时题目不同的是,每题均给出了相应的类图,要求考生按照类图来书写自己的代码。且三题呈递进关系,每题均是由上一题进阶而来。第一题是点与线,要求输出点和线的属性,考察了学生对Java类的设计的掌握。而第二题则是在第一题的基础上加上了关于面的类,并要求把点、线、面三类均作为新建类Element类的子类。考察了学生对继承与多态的掌握。第三题考察了Java容器类,主要是ArrayList的应用。且相比前两题有了多种输入格式,增加了难度。
二、设计与分析
题目1:
用户输入一组选项和数据,进行与四边形有关的计算。以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。选项包括: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 y5:输入五个点坐标,输出第一个是否在后四个点所构成的四边形(限定为凸四边形,不考虑凹四边形)或三角形(判定方法见选项4)的内部(若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。如果点在多边形的某条边上,输出"on the triangle或者on the quadrilateral"。若后四个点不符合四边形或三角形,输出"not a quadrilateral or triangle"。
*****************************************************************************************************************************************************************************
这题题目难度还好,主要根据前面三角形的类和方法,在其基础上添加修改。
import java.util.Scanner; class Point { double x; double y; int flag=0; int exist=1;//1:存在 0:不存在 2:交点无数个 public boolean pointchonghe(Point A,Point B)//判断两点重合 { if(A.x==B.x&&A.y==B.y) return true; else return false; } public boolean Pointscoincide(Point A,Point B,Point C,Point D)//判断四边形四点重合 { if(A.x==B.x&&A.y==B.y||A.x==C.x&&A.y==C.y||A.x==D.x&&A.y==D.y||B.x==C.x&&B.y==C.y||B.x==D.x&&B.y==D.y||C.x==D.x&&C.y==D.y) return true; else return false; } } class Line { Point p1=new Point(); Point p2=new Point(); double a; double b; double c; double D; int flag;//交点是否在线段上 public void L(Line l)//一般式系数 { l.a=l.p2.y-l.p1.y; l.b=l.p1.x-l.p2.x; l.c=l.p2.x*l.p1.y-l.p1.x*l.p2.y; } public void D(Point p1,Point p2,Line lp1p2)//两点间距离 { lp1p2.D=Math.sqrt(Math.pow(lp1p2.p1.x-lp1p2.p2.x,2)+Math.pow(lp1p2.p1.y-lp1p2.p2.y,2)); lp1p2.D=Math.round(lp1p2.D*1000000000)/(double)1000000000; } public void distanse(Line l)//求线段距离D { l.D=Math.sqrt(Math.pow(l.p1.x-l.p2.x,2)+Math.pow(l.p1.y-l.p2.y,2)); l.D=Math.round(l.D*1000000000)/(double)1000000000; } public boolean zhixian(Point X,Line l)//点是否在直线上 { L(l); if(l.a*X.x+l.b*X.y+l.c==0) return true; else return false; } public boolean linechonghe(Line l1,Line l2)//判断是否两线重合 { L(l1); L(l2); if(l1.b==0&&l2.b==0) { if(l1.c/l1.a==l2.c/l2.a) return true; else return false; } else if(l1.a==0&&l2.a==0) { if(l1.c/l1.b==l2.c/l2.b) return true; else return false; } else { if(l1.c/l1.a==l2.c/l2.a&&l1.c/l1.b==l2.c/l2.b) return true; else return false; } } public boolean pingxing(Line l1,Line l2)//判断是否平行(有无交点) { L(l1); L(l2); if(l1.b==0&&l2.b==0) return true; else if(l1.b!=0&&l2.b!=0&&(l1.a/l1.b==l2.a/l2.b)) return true; else return false; } public boolean Quadrilateral(Line lAB,Point C,Point D)//判断是否四边形 { L(lAB); if((!zhixian(C,lAB))&&(!zhixian(D,lAB))&&((lAB.a*C.x+lAB.b*C.y+lAB.c<0)&&(lAB.a*D.x+lAB.b*D.y+lAB.c<0)||(lAB.a*C.x+lAB.b*C.y+lAB.c>0)&&(lAB.a*D.x+lAB.b*D.y+lAB.c>0))) return true; else return false; } public boolean Quadrilateral1(Point A,Point B,Point C,Point D,Quadrilateral Q)//凹 { if((!zhixian(C,Q.l1))&&(!zhixian(D,Q.l1))&&(!zhixian(D,Q.l6))&&(!zhixian(D,Q.l2))) { Point O=new Point(); Line lAO=new Line(); lAO.p1=A; lAO.p2=O; Line lBO=new Line(); lBO.p1=B; lBO.p2=O; Line lCO=new Line(); lCO.p1=C; lCO.p2=O; Line lDO=new Line(); lDO.p1=D; lDO.p2=O; Triangle t=new Triangle(); t.jiaodian(Q.l5,Q.l6,O);//AC和BD交点 if(t.pointwhere(O,A,C,lAO,lCO,Q.l6)&&!t.pointwhere(O,B,D,lBO,lDO,Q.l5))//交点在线段AC和不在BD上 { Q.l5.flag=0; Q.l6.flag=1; return true; } else if(!t.pointwhere(O,A,C,lAO,lCO,Q.l6)&&t.pointwhere(O,B,D,lBO,lDO,Q.l5))//交点不在线段AC和在BD上 { Q.l5.flag=1; Q.l6.flag=0; return true; } else return false; } else return false; } public boolean Quadrilateral2(Point A,Point B,Point C,Point D,Quadrilateral Q)//凸 { if((!zhixian(C,Q.l1))&&(!zhixian(D,Q.l1))&&(!zhixian(A,Q.l3))&&(!zhixian(D,Q.l2))&&(!A.Pointscoincide(A,B,C,D))) { Point O=new Point(); Line lAO=new Line(); lAO.p1=A; lAO.p2=O; Line lBO=new Line(); lBO.p1=B; lBO.p2=O; Line lCO=new Line(); lCO.p1=C; lCO.p2=O; Line lDO=new Line(); lDO.p1=D; lDO.p2=O; Triangle t=new Triangle(); t.jiaodian(Q.l5,Q.l6,O);//AC和BD交点 if(O.exist==1&&t.pointwhere(O,A,C,lAO,lCO,Q.l6)&&t.pointwhere(O,B,D,lBO,lDO,Q.l5))//交点在线段AC和BD上 return true; else return false; } else return false; } public boolean pingxingQuadrilateral(Line l1,Line l2)//判断是否平行四边形 { distanse(l1); distanse(l2); if(pingxing(l1,l2)&&l1.D==l2.D) return true; else return false; } } class Triangle { Line l1=new Line(); Line l2=new Line(); Line l3=new Line(); double S; int num; int flag=0;//1:存在,0:不存在 public boolean sanjiaox(Line l1,Line l2,Line l3)//判断是否为三角形 { l1.distanse(l1); l2.distanse(l2); l3.distanse(l3); if((l1.D+l2.D>l3.D&&l1.D<=l3.D&&l2.D<=l3.D)||(l1.D+l3.D>l2.D&&l1.D<=l2.D&&l3.D<=l2.D)||(l2.D+l3.D>l1.D&&l2.D<=l1.D&&l2.D<=l1.D)) return true; else return false; } public void whichsanjiaox(Point C,Point D,Point E,Point F,Line lAB,Triangle tDEF,Triangle tCEF,Triangle tCDF,Triangle tCDE,Quadrilateral Q)//判断四个点构成哪种三角形 { if(sanjiaox(tDEF.l1,tDEF.l2,tDEF.l3)&&pointwhere(C,D,F,Q.l1,Q.l4,Q.l5)) { if(lAB.linechonghe(lAB,Q.l1)||lAB.linechonghe(lAB,Q.l2)||lAB.linechonghe(lAB,Q.l3)||lAB.linechonghe(lAB,Q.l4)) { System.out.print("The line is coincide with one of the lines"); return; } else tDEF.flag=1; } else if(sanjiaox(tCEF.l1,tCEF.l2,tCEF.l3)&&pointwhere(D,C,E,Q.l1,Q.l2,Q.l6)) { if(lAB.linechonghe(lAB,Q.l1)||lAB.linechonghe(lAB,Q.l2)||lAB.linechonghe(lAB,Q.l3)||lAB.linechonghe(lAB,Q.l4)) { System.out.print("The line is coincide with one of the lines"); return; } else tCEF.flag=1; } else if(sanjiaox(tCDF.l1,tCDF.l2,tCDF.l3)&&pointwhere(E,D,F,Q.l2,Q.l3,Q.l5)) { if(lAB.linechonghe(lAB,Q.l1)||lAB.linechonghe(lAB,Q.l2)||lAB.linechonghe(lAB,Q.l3)||lAB.linechonghe(lAB,Q.l4)) { System.out.print("The line is coincide with one of the lines"); return; } else tCDF.flag=1; } else if(sanjiaox(tCDE.l1,tCDE.l2,tCDE.l3)&&pointwhere(F,C,E,Q.l4,Q.l3,Q.l6)) { if(lAB.linechonghe(lAB,Q.l1)||lAB.linechonghe(lAB,Q.l2)||lAB.linechonghe(lAB,Q.l3)||lAB.linechonghe(lAB,Q.l4)) { System.out.print("The line is coincide with one of the lines"); return; } else tCDE.flag=1; } } public void whichsanjiaox1(Point C,Point D,Point E,Point F,Triangle tDEF,Triangle tCEF,Triangle tCDF,Triangle tCDE,Quadrilateral Q)//判断哪种三角形 { if(sanjiaox(tDEF.l1,tDEF.l2,tDEF.l3)&&pointwhere(C,D,F,Q.l1,Q.l4,Q.l5)) tDEF.flag=1; else if(sanjiaox(tCEF.l1,tCEF.l2,tCEF.l3)&&pointwhere(D,C,E,Q.l1,Q.l2,Q.l6)) tCEF.flag=1; else if(sanjiaox(tCDF.l1,tCDF.l2,tCDF.l3)&&pointwhere(E,D,F,Q.l2,Q.l3,Q.l5)) tCDF.flag=1; else if(sanjiaox(tCDE.l1,tCDE.l2,tCDE.l3)&&pointwhere(F,C,E,Q.l4,Q.l3,Q.l6)) tCDE.flag=1; } public void jiaodian(Line l1,Line l2,Point O)//两条直线交点 { if(l1.pingxing(l1,l2)) { O.exist=0; } else { l1.L(l1); l2.L(l2); O.x=(l1.b*l2.c-l2.b*l1.c)/(l1.a*l2.b-l2.a*l1.b); O.y=(l2.a*l1.c-l1.a*l2.c)/(l1.a*l2.b-l2.a*l1.b); O.x=Math.round(O.x*1000000000)/(double)1000000000; O.y=Math.round(O.y*1000000000)/(double)1000000000; } } public boolean pointwhere(Point A,Point B,Point C,Line lAB,Line lAC,Line lBC)//点A是否在线段BC上 { if(A.pointchonghe(A,B)||A.pointchonghe(A,C)) return true; else { lAB.D(A,B,lAB); lAC.D(A,C,lAC); lBC.D(B,C,lBC); if(lAB.D+lAC.D-lBC.D<0.000001) return true; else return false; } } public void jiaodiannum(Point P1,Point P2,Point P3,Line lAB,Triangle t)//交点数(线和三角形) { t.num=0; P1.flag=0; P2.flag=0; P3.flag=0; t.jiaodian(lAB,t.l1,P1); Line lp11=new Line(); lp11.p1=P1; lp11.p2=t.l1.p1; Line lp12=new Line(); lp12.p1=P1; lp12.p2=t.l1.p2; if(P1.exist==1&&t.pointwhere(P1, t.l1.p1, t.l1.p2,lp11,lp12,t.l1)) { t.num++; P1.flag=1;//交点在线段上 } t.jiaodian(lAB,t.l2,P2); Line lp21=new Line(); lp21.p1=P2; lp21.p2=t.l2.p1; Line lp22=new Line(); lp22.p1=P2; lp22.p2=t.l2.p2; if(P2.exist==1&&t.pointwhere(P2,t.l2.p1,t.l2.p2,lp21,lp22,t.l2)) { if(P1.flag==0||(!P1.pointchonghe(P1,P2)&&P1.flag==1)) { t.num++; P2.flag=1; } } t.jiaodian(lAB,t.l3,P3); Line lp31=new Line(); lp31.p1=P3; lp31.p2=t.l3.p1; Line lp32=new Line(); lp32.p1=P3; lp32.p2=t.l3.p2; if(P3.exist==1&&t.pointwhere(P3,t.l3.p1,t.l3.p2,lp31,lp32,t.l3)) { if(P1.flag==0&&P2.flag==0) { t.num++; P3.flag=1; } else if(P1.flag==1&&P2.flag==0&&!P1.pointchonghe(P1,P3)) { t.num++; P3.flag=1; } else if(P1.flag==0&&P2.flag==1&&!P2.pointchonghe(P2,P3)) { t.num++; P3.flag=1; } } } public void sanjiaoxmianji(Triangle t)//三角形面积 { t.l1.distanse(t.l1); t.l2.distanse(t.l2); t.l3.distanse(t.l3); double x=(t.l1.D+t.l2.D+t.l3.D)/2; t.S=Math.sqrt(x*(x-t.l1.D)*(x-t.l2.D)*(x-t.l3.D)); } public void xiaomianji(Point P1,Point P2,Point P3,Triangle t,Triangle T)//切割小三角形面积 { if(P1.flag==1&&P2.flag==1)//三角形CP1P2 { t.l1.p1=T.l1.p2; t.l1.p2=P1; t.l2.p1=T.l1.p2; t.l2.p2=P2; t.l3.p1=P1; t.l3.p2=P2; t.sanjiaoxmianji(t); } else if(P1.flag==1&&P3.flag==1) { t.l1.p1=T.l1.p1; t.l1.p2=P1; t.l2.p1=T.l1.p1; t.l2.p2=P3; t.l3.p1=P1; t.l3.p2=P3; t.sanjiaoxmianji(t); } else if(P2.flag==1&&P3.flag==1) { t.l1.p1=T.l2.p2; t.l1.p2=P2; t.l2.p1=T.l2.p2; t.l2.p2=P3; t.l3.p1=P2; t.l3.p2=P3; t.sanjiaoxmianji(t); } } public void xiaomianji1(Point P1,Point P2,Point P3,Point P4,Triangle t,Quadrilateral Q)//四边形切割小三角形面积 { if(P1.flag==1&&P2.flag==1)//三角形DP1P2 { t.l1.p1=Q.l1.p2; t.l1.p2=P1; t.l2.p1=Q.l1.p2; t.l2.p2=P2; t.l3.p1=P1; t.l3.p2=P2; t.sanjiaoxmianji(t); } else if(P1.flag==1&&P4.flag==1)//CP1P4 { t.l1.p1=Q.l1.p1; t.l1.p2=P1; t.l2.p1=Q.l1.p1; t.l2.p2=P4; t.l3.p1=P1; t.l3.p2=P4; t.sanjiaoxmianji(t); } else if(P2.flag==1&&P3.flag==1)//EP2P3 { t.l1.p1=Q.l2.p2; t.l1.p2=P2; t.l2.p1=Q.l2.p2; t.l2.p2=P3; t.l3.p1=P2; t.l3.p2=P3; t.sanjiaoxmianji(t); } else if(P3.flag==1&&P4.flag==1)//FP3P4 { t.l1.p1=Q.l3.p2; t.l1.p2=P3; t.l2.p1=Q.l3.p2; t.l2.p2=P4; t.l3.p1=P3; t.l3.p2=P4; t.sanjiaoxmianji(t); } } } class Quadrilateral { Line l1=new Line(); Line l2=new Line(); Line l3=new Line(); Line l4=new Line(); Line l5=new Line();//BD Line l6=new Line();//AC double C; double S; int num; int flag;//1:存在 0:不存在 int aotu;//1:凸 0:凹 public boolean lingxing(Quadrilateral Q)//菱形 { if(!Q.l1.pingxingQuadrilateral(Q.l1,Q.l3)) return false; else { Q.l1.distanse(Q.l1); Q.l2.distanse(Q.l2); if(Q.l1.D==Q.l2.D) return true; else return false; } } public boolean zhijiao(Quadrilateral Q)//判断直角 { Q.l1.distanse(Q.l1); Q.l4.distanse(Q.l4); Q.l5.distanse(Q.l5); if(Q.l1.D*Q.l1.D+Q.l4.D*Q.l4.D-Q.l5.D*Q.l5.D<0.000000000001) return true; else return false; } public boolean juxing(Quadrilateral Q)//矩形 { if(!Q.l1.pingxingQuadrilateral(Q.l1,Q.l3)) return false; else { if(zhijiao(Q)) return true; else return false; } } public boolean zhengfangxing(Quadrilateral Q)//正方形 { if(!Q.juxing(Q)) return false; else { Q.l1.distanse(Q.l1); Q.l2.distanse(Q.l2); if(Q.l1.D==Q.l2.D) return true; else return false; } } public void Quadrilateralzhouchang(Quadrilateral Q)//四边形周长 { Q.l1.distanse(Q.l1); Q.l2.distanse(Q.l2); Q.l3.distanse(Q.l3); Q.l4.distanse(Q.l4); Q.C=Q.l1.D+Q.l2.D+Q.l3.D+Q.l4.D; } public void Quadrilateralmianji(Quadrilateral Q)//凸四边形面积 { Q.l1.distanse(Q.l1); Q.l2.distanse(Q.l2); Q.l3.distanse(Q.l3); Q.l4.distanse(Q.l4); Q.l5.distanse(Q.l5); double x1=(l1.D+l4.D+l5.D)/2; double s1=Math.sqrt(x1*(x1-l1.D)*(x1-l4.D)*(x1-l5.D)); double x2=(l2.D+l3.D+l5.D)/2; double s2=Math.sqrt(x2*(x2-l2.D)*(x2-l3.D)*(x2-l5.D)); Q.S=s1+s2; } public void Quadrilateralmianji1(Quadrilateral Q)//凹四边形面积 { if(Q.l5.flag==0&&Q.l6.flag==1) { Quadrilateralmianji(Q); } else if(Q.l5.flag==1&&Q.l6.flag==0) { Q.l1.distanse(Q.l1); Q.l2.distanse(Q.l2); Q.l3.distanse(Q.l3); Q.l4.distanse(Q.l4); Q.l6.distanse(Q.l6); double x1=(l1.D+l2.D+l6.D)/2; double s1=Math.sqrt(x1*(x1-l1.D)*(x1-l2.D)*(x1-l6.D)); double x2=(l3.D+l4.D+l6.D)/2; double s2=Math.sqrt(x2*(x2-l3.D)*(x2-l4.D)*(x2-l6.D)); Q.S=s1+s2; } } public void Quadrilateralnum(Point P1,Point P2,Point P3,Point P4,Line lAB,Triangle T,Quadrilateral Q)//交点数(线和四边形) { Q.num=0; P1.flag=0; P2.flag=0; P3.flag=0; P4.flag=0; T.jiaodian(lAB,Q.l1,P1); Line lp11=new Line(); lp11.p1=P1; lp11.p2=Q.l1.p1; Line lp12=new Line(); lp12.p1=P1; lp12.p2=Q.l1.p2; if(P1.exist==1&&T.pointwhere(P1,Q.l1.p1,Q.l1.p2,lp11,lp12,Q.l1)) { Q.num++; P1.flag=1;//交点在线段上 } T.jiaodian(lAB,Q.l2,P2); Line lp21=new Line(); lp21.p1=P2; lp21.p2=Q.l2.p1; Line lp22=new Line(); lp22.p1=P2; lp22.p2=Q.l2.p2; if(P2.exist==1&&T.pointwhere(P2,Q.l2.p1,Q.l2.p2,lp21,lp22,Q.l2)) { if(P1.flag==0||(!P1.pointchonghe(P1,P2)&&P1.flag==1)) { Q.num++; P2.flag=1; } } T.jiaodian(lAB,Q.l3,P3); Line lp31=new Line(); lp31.p1=P3; lp31.p2=Q.l3.p1; Line lp32=new Line(); lp32.p1=P3; lp32.p2=Q.l3.p2; if(P3.exist==1&&T.pointwhere(P3,Q.l3.p1,Q.l3.p2,lp31,lp32,Q.l3)) { if(P1.flag==0&&P2.flag==0) { Q.num++; P3.flag=1; } else if(P1.flag==1&&P2.flag==0&&!P1.pointchonghe(P1,P3)) { Q.num++; P3.flag=1; } else if(P1.flag==0&&P2.flag==1&&!P2.pointchonghe(P2,P3)) { Q.num++; P3.flag=1; } } T.jiaodian(lAB,Q.l4,P4); Line lp41=new Line(); lp41.p1=P4; lp41.p2=Q.l4.p1; Line lp42=new Line(); lp42.p1=P4; lp42.p2=Q.l4.p2; if(P4.exist==1&&T.pointwhere(P4,Q.l4.p1,Q.l4.p2,lp41,lp42,Q.l4)) { if(P1.flag==0&&P2.flag==0&&P3.flag==0) { Q.num++; P4.flag=1; } else if(P1.flag==1&&P2.flag==0&&P3.flag==0&&!P1.pointchonghe(P1,P4)) { Q.num++; P4.flag=1; } else if(P1.flag==0&&P2.flag==1&&P3.flag==0&&!P2.pointchonghe(P2,P4)) { Q.num++; P4.flag=1; } else if(P1.flag==0&&P2.flag==0&&P3.flag==1&&!P3.pointchonghe(P3,P4)) { Q.num++; P4.flag=1; } } } } public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); String a=in.nextLine(); int num=(int)a.charAt(0)-(int)'0'; String[] tokens=a.split(" "); int length=tokens.length; for(int i=0;i<length;i++) { if(i==0) { if(!tokens[i].matches("^\\d:[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")) { System.out.print("Wrong Format"); return; } } else if(i!=0) { if(!tokens[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")) { System.out.print("Wrong Format"); return; } } } if(((num==1||num==2||num==3)&&length!=4)||(num==4&&length!=6)||(num==5&&length!=5)) { System.out.print("wrong number of points"); return; } String[] arr=a.split(" |:|,"); switch(num) { case 1: { Line lAB=new Line(); Point C=new Point(); Point D=new Point(); lAB.p1.x=Double.valueOf(arr[1]); lAB.p1.y=Double.valueOf(arr[2]); lAB.p2.x=Double.valueOf(arr[3]); lAB.p2.y=Double.valueOf(arr[4]); C.x=Double.valueOf(arr[5]); C.y=Double.valueOf(arr[6]); D.x=Double.valueOf(arr[7]); D.y=Double.valueOf(arr[8]); Line lCD=new Line(); lCD.p1=C; lCD.p2=D; Line lBC=new Line(); lBC.p1=lAB.p2; lBC.p2=C; if(lAB.p1.Pointscoincide(lAB.p1,lAB.p2,C,D)) { System.out.print("points coincide");return; } if(lAB.Quadrilateral(lAB,C,D)&&lBC.Quadrilateral(lBC,lAB.p1,D)) { System.out.print("true"); if(lAB.pingxingQuadrilateral(lAB,lCD)) System.out.print(" true"); else System.out.print(" false"); } else System.out.print("false false"); break; } case 2: { Quadrilateral Q=new Quadrilateral(); Q.l1.p1.x=Double.valueOf(arr[1]); Q.l1.p1.y=Double.valueOf(arr[2]); Q.l1.p2.x=Double.valueOf(arr[3]); Q.l1.p2.y=Double.valueOf(arr[4]); Q.l2.p1=Q.l1.p2; Q.l2.p2.x=Double.valueOf(arr[5]); Q.l2.p2.y=Double.valueOf(arr[6]); Q.l3.p1=Q.l2.p2; Q.l3.p2.x=Double.valueOf(arr[7]); Q.l3.p2.y=Double.valueOf(arr[8]); Q.l4.p1=Q.l1.p1; Q.l4.p2=Q.l3.p2; Q.l5.p1=Q.l1.p2; Q.l5.p2=Q.l4.p2; if(Q.l1.p1.Pointscoincide(Q.l1.p1,Q.l1.p2,Q.l3.p1,Q.l3.p2)) { System.out.print("not a quadrilateral");return; } if(!Q.l1.Quadrilateral(Q.l1,Q.l3.p1,Q.l3.p2)||!Q.l2.Quadrilateral(Q.l2,Q.l4.p1,Q.l4.p2)) { System.out.print("not a quadrilateral");return; } if(Q.lingxing(Q)) System.out.print("true"); else System.out.print("false"); if(Q.juxing(Q)) System.out.print(" true"); else System.out.print(" false"); if(Q.zhengfangxing(Q)) System.out.print(" true"); else System.out.print(" false"); break; } case 3: { Quadrilateral Q=new Quadrilateral(); Q.l1.p1.x=Double.valueOf(arr[1]); Q.l1.p1.y=Double.valueOf(arr[2]); Q.l1.p2.x=Double.valueOf(arr[3]); Q.l1.p2.y=Double.valueOf(arr[4]); Q.l2.p1=Q.l1.p2; Q.l2.p2.x=Double.valueOf(arr[5]); Q.l2.p2.y=Double.valueOf(arr[6]); Q.l3.p1=Q.l2.p2; Q.l3.p2.x=Double.valueOf(arr[7]); Q.l3.p2.y=Double.valueOf(arr[8]); Q.l4.p1=Q.l1.p1; Q.l4.p2=Q.l3.p2; Q.l5.p1=Q.l1.p2; Q.l5.p2=Q.l4.p2; Q.l6.p1=Q.l1.p1; Q.l6.p2=Q.l2.p2; Point A=new Point(); Point B=new Point(); Point C=new Point(); Point D=new Point(); A.x=Double.valueOf(arr[1]); A.y=Double.valueOf(arr[2]); B.x=Double.valueOf(arr[3]); B.y=Double.valueOf(arr[4]); C.x=Double.valueOf(arr[5]); C.y=Double.valueOf(arr[6]); D.x=Double.valueOf(arr[7]); D.y=Double.valueOf(arr[8]); if(Q.l1.p1.Pointscoincide(Q.l1.p1,Q.l1.p2,Q.l3.p1,Q.l3.p2)) { System.out.print("not a quadrilateral");return; } int X; if(Q.l1.Quadrilateral(Q.l1,Q.l3.p1,Q.l3.p2)&&Q.l2.Quadrilateral(Q.l2,Q.l4.p1,Q.l4.p2)&&!Q.l6.zhixian(D,Q.l6)&&!Q.l6.zhixian(B,Q.l6))//涵盖凸四边形和D点凹进去的四边形 { Point o=new Point(); Line lBo=new Line(); lBo.p1=B; lBo.p2=o; Line lDo=new Line(); lDo.p1=D; lDo.p2=o; Line lAo=new Line(); lAo.p1=A; lAo.p2=o; Line lCo=new Line(); lCo.p1=C; lCo.p2=o; Triangle t=new Triangle(); t.jiaodian(Q.l5,Q.l6,o); if(!t.pointwhere(o,Q.l5.p1,Q.l5.p2,lBo,lDo,Q.l5)&&t.pointwhere(o,Q.l6.p1,Q.l6.p2,lAo,lCo,Q.l6)) { X=0; Q.l5.flag=0; Q.l6.flag=1; System.out.print("false "); } else { X=1; System.out.print("true "); } } else { if(Q.l5.Quadrilateral1(A,B,C,D,Q))//凹四边形 { X=0; System.out.print("false "); } else { System.out.print("not a quadrilateral"); return; } } Q.Quadrilateralzhouchang(Q);//周长面积 System.out.print(Math.round(Q.C*1000)/(double)1000); if(X==1) { System.out.print(" "); Q.Quadrilateralmianji(Q); System.out.print(Math.round(Q.S*1000)/(double)1000); } else if(X==0) { System.out.print(" "); Q.Quadrilateralmianji1(Q); System.out.print(Math.round(Q.S*1000)/(double)1000); } break; } case 4: { Point A=new Point(); Point B=new Point(); A.x=Double.valueOf(arr[1]); A.y=Double.valueOf(arr[2]); B.x=Double.valueOf(arr[3]); B.y=Double.valueOf(arr[4]); Line lAB=new Line(); lAB.p1=A; lAB.p2=B; if(A.pointchonghe(A,B)) { System.out.print("points coincide");return; } Point C=new Point(); Point D=new Point(); Point E=new Point(); Point F=new Point(); C.x=Double.valueOf(arr[5]); C.y=Double.valueOf(arr[6]); D.x=Double.valueOf(arr[7]); D.y=Double.valueOf(arr[8]); E.x=Double.valueOf(arr[9]); E.y=Double.valueOf(arr[10]); F.x=Double.valueOf(arr[11]); F.y=Double.valueOf(arr[12]); Quadrilateral Q=new Quadrilateral(); Q.l1.p1=C; Q.l1.p2=D; Q.l2.p1=D; Q.l2.p2=E; Q.l3.p1=E; Q.l3.p2=F; Q.l4.p1=C; Q.l4.p2=F; Q.l5.p1=D; Q.l5.p2=F; Q.l6.p1=C; Q.l6.p2=E; Triangle tDEF=new Triangle(); tDEF.l1.p1=D; tDEF.l1.p2=E; tDEF.l2.p1=E; tDEF.l2.p2=F; tDEF.l3.p1=D; tDEF.l3.p2=F; Triangle tCEF=new Triangle(); tCEF.l1.p1=C; tCEF.l1.p2=E; tCEF.l2.p1=E; tCEF.l2.p2=F; tCEF.l3.p1=C; tCEF.l3.p2=F; Triangle tCDF=new Triangle(); tCDF.l1.p1=C; tCDF.l1.p2=D; tCDF.l2.p1=D; tCDF.l2.p2=F; tCDF.l3.p1=C; tCDF.l3.p2=F; Triangle tCDE=new Triangle(); tCDE.l1.p1=C; tCDE.l1.p2=D; tCDE.l2.p1=D; tCDE.l2.p2=E; tCDE.l3.p1=C; tCDE.l3.p2=E; Point P1=new Point(); Point P2=new Point(); Point P3=new Point(); Point P4=new Point(); tDEF.whichsanjiaox(C,D,E,F,lAB,tDEF,tCEF,tCDF,tCDE,Q);//判断是哪三个点构成三角形 if(tDEF.flag==1||C.pointchonghe(C,E))//求直线AB与三角形交点数 { if(C.pointchonghe(C,E)&&lAB.linechonghe(lAB,Q.l5)) { System.out.print("The line is coincide with one of the lines");return; } tDEF.jiaodiannum(P1,P2,P3,lAB,tDEF); System.out.print(tDEF.num); if(tDEF.num==2) { System.out.print(" "); tDEF.sanjiaoxmianji(tDEF); Triangle t=new Triangle(); tDEF.xiaomianji(P1,P2,P3,t,tDEF);//切割小三角形面积 double s=tDEF.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } } else if(tCEF.flag==1||D.pointchonghe(D,F)) { if(D.pointchonghe(D,F)&&lAB.linechonghe(lAB,Q.l6)) { System.out.print("The line is coincide with one of the lines");return; } tCEF.jiaodiannum(P1,P2,P3,lAB,tCEF); System.out.print(tCEF.num); if(tCEF.num==2) { System.out.print(" "); tCEF.sanjiaoxmianji(tCEF); Triangle t=new Triangle(); tCEF.xiaomianji(P1,P2,P3,t,tCEF);//切割小三角形面积 double s=tCEF.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } } else if(tCDF.flag==1||E.pointchonghe(E,C)) { if(C.pointchonghe(C,E)&&lAB.linechonghe(lAB,Q.l5)) { System.out.print("The line is coincide with one of the lines");return; } tCDF.jiaodiannum(P1,P2,P3,lAB,tCDF); System.out.print(tCDF.num); if(tCDF.num==2) { System.out.print(" "); tCDF.sanjiaoxmianji(tCDF); Triangle t=new Triangle(); tCDF.xiaomianji(P1,P2,P3,t,tCDF);//切割小三角形面积 double s=tCDF.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } } else if(tCDE.flag==1||F.pointchonghe(F,D)) { if(D.pointchonghe(D,F)&&lAB.linechonghe(lAB,Q.l6)) { System.out.print("The line is coincide with one of the lines");return; } tCDE.jiaodiannum(P1,P2,P3,lAB,tCDE); System.out.print(tCDE.num); if(tCDE.num==2) { System.out.print(" "); tCDE.sanjiaoxmianji(tCDE); Triangle t=new Triangle(); tCDE.xiaomianji(P1,P2,P3,t,tCDE);//切割小三角形面积 double s=tCDE.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } } else if(Q.l1.Quadrilateral2(C,D,E,F,Q)) { if(lAB.linechonghe(lAB,Q.l1)||lAB.linechonghe(lAB,Q.l2)||lAB.linechonghe(lAB,Q.l3)||lAB.linechonghe(lAB,Q.l4)) { System.out.print("The line is coincide with one of the lines");return; } Triangle t=new Triangle(); Q.Quadrilateralnum(P1,P2,P3,P4,lAB,t,Q); System.out.print(Q.num); if(Q.num==2) { System.out.print(" "); Q.Quadrilateralmianji(Q);//大四边形面积 if(P1.flag==1&&P2.flag==1) { t.xiaomianji1(P1,P2,P3,P4,t,Q); double s=Q.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } else if(P1.flag==1&&P3.flag==1) { Triangle tCFP3=new Triangle(); tCFP3.l1.p1=C; tCFP3.l1.p2=F; tCFP3.l2.p1=C; tCFP3.l2.p2=P3; tCFP3.l3.p1=F; tCFP3.l3.p2=P3; tCFP3.sanjiaoxmianji(tCFP3); Triangle tCP1P3=new Triangle(); tCP1P3.l1.p1=C; tCP1P3.l1.p2=P1; tCP1P3.l2.p1=C; tCP1P3.l2.p2=P3; tCP1P3.l3.p1=P1; tCP1P3.l3.p2=P3; tCP1P3.sanjiaoxmianji(tCP1P3); double s1=tCFP3.S+tCP1P3.S; Triangle tDP1P3=new Triangle(); tDP1P3.l1.p1=D; tDP1P3.l1.p2=P1; tDP1P3.l2.p1=D; tDP1P3.l2.p2=P3; tDP1P3.l3.p1=P1; tDP1P3.l3.p2=P3; tDP1P3.sanjiaoxmianji(tDP1P3); Triangle tDEP3=new Triangle(); tDEP3.l1.p1=D; tDEP3.l1.p2=E; tDEP3.l2.p1=D; tDEP3.l2.p2=P3; tDEP3.l3.p1=E; tDEP3.l3.p2=P3; tDEP3.sanjiaoxmianji(tDEP3); double s2=tDEP3.S+tDP1P3.S; if(s1<s2) System.out.print(Math.round(s1*1000)/(double)1000+" "+Math.round(s2*1000)/(double)1000); else System.out.print(Math.round(s2*1000)/(double)1000+" "+Math.round(s1*1000)/(double)1000); } else if(P1.flag==1&&P4.flag==1) { t.xiaomianji1(P1,P2,P3,P4,t,Q); double s=Q.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } else if(P2.flag==1&&P3.flag==1) { t.xiaomianji1(P1,P2,P3,P4,t,Q); double s=Q.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } else if(P2.flag==1&&P4.flag==1) { Triangle tCDP2=new Triangle(); tCDP2.l1.p1=C; tCDP2.l1.p2=D; tCDP2.l2.p1=C; tCDP2.l2.p2=P2; tCDP2.l3.p1=D; tCDP2.l3.p2=P2; tCDP2.sanjiaoxmianji(tCDP2); Triangle tCP2P4=new Triangle(); tCP2P4.l1.p1=C; tCP2P4.l1.p2=P2; tCP2P4.l2.p1=C; tCP2P4.l2.p2=P4; tCP2P4.l3.p1=P2; tCP2P4.l3.p2=P4; tCP2P4.sanjiaoxmianji(tCP2P4); double s1=tCDP2.S+tCP2P4.S; Triangle tFP2P4=new Triangle(); tFP2P4.l1.p1=F; tFP2P4.l1.p2=P2; tFP2P4.l2.p1=F; tFP2P4.l2.p2=P4; tFP2P4.l3.p1=P2; tFP2P4.l3.p2=P4; tFP2P4.sanjiaoxmianji(tFP2P4); Triangle tEFP2=new Triangle(); tEFP2.l1.p1=E; tEFP2.l1.p2=F; tEFP2.l2.p1=E; tEFP2.l2.p2=P2; tEFP2.l3.p1=F; tEFP2.l3.p2=P2; tEFP2.sanjiaoxmianji(tEFP2); double s2=tFP2P4.S+tEFP2.S; if(s1<s2) System.out.print(Math.round(s1*1000)/(double)1000+" "+Math.round(s2*1000)/(double)1000); else System.out.print(Math.round(s2*1000)/(double)1000+" "+Math.round(s1*1000)/(double)1000); } else if(P3.flag==1&&P4.flag==1) { t.xiaomianji1(P1,P2,P3,P4,t,Q); double s=Q.S-t.S; if(t.S<s) System.out.print(Math.round(t.S*1000)/(double)1000+" "+Math.round(s*1000)/(double)1000); else System.out.print(Math.round(s*1000)/(double)1000+" "+Math.round(t.S*1000)/(double)1000); } } } else//判断非三角形四边形情况 { System.out.print("not a quadrilateral or triangle"); } break; } case 5: { Point A=new Point(); Point C=new Point(); Point D=new Point(); Point E=new Point(); Point F=new Point(); A.x=Double.valueOf(arr[1]); A.y=Double.valueOf(arr[2]); C.x=Double.valueOf(arr[3]); C.y=Double.valueOf(arr[4]); D.x=Double.valueOf(arr[5]); D.y=Double.valueOf(arr[6]); E.x=Double.valueOf(arr[7]); E.y=Double.valueOf(arr[8]); F.x=Double.valueOf(arr[9]); F.y=Double.valueOf(arr[10]); Quadrilateral Q=new Quadrilateral(); Q.l1.p1=C; Q.l1.p2=D; Q.l2.p1=D; Q.l2.p2=E; Q.l3.p1=E; Q.l3.p2=F; Q.l4.p1=C; Q.l4.p2=F; Q.l5.p1=D; Q.l5.p2=F; Q.l6.p1=C; Q.l6.p2=E; Triangle tDEF=new Triangle(); tDEF.l1.p1=D; tDEF.l1.p2=E; tDEF.l2.p1=E; tDEF.l2.p2=F; tDEF.l3.p1=D; tDEF.l3.p2=F; Triangle tCEF=new Triangle(); tCEF.l1.p1=C; tCEF.l1.p2=E; tCEF.l2.p1=E; tCEF.l2.p2=F; tCEF.l3.p1=C; tCEF.l3.p2=F; Triangle tCDF=new Triangle(); tCDF.l1.p1=C; tCDF.l1.p2=D; tCDF.l2.p1=D; tCDF.l2.p2=F; tCDF.l3.p1=C; tCDF.l3.p2=F; Triangle tCDE=new Triangle(); tCDE.l1.p1=C; tCDE.l1.p2=D; tCDE.l2.p1=D; tCDE.l2.p2=E; tCDE.l3.p1=C; tCDE.l3.p2=E; Point P1=new Point(); Point P2=new Point(); Point P3=new Point(); Point P4=new Point(); Line lAC=new Line(); lAC.p1=A; lAC.p2=C; Line lAD=new Line(); lAD.p1=A; lAD.p2=D; Line lAE=new Line(); lAE.p1=A; lAE.p2=E; Line lAF=new Line(); lAF.p1=A; lAF.p2=F; int num1=0,num2=0,num3=0,num4=0; tDEF.whichsanjiaox1(C,D,E,F,tDEF,tCEF,tCDF,tCDE,Q);//判断是哪三个点构成三角形 if(tDEF.flag==1||C.pointchonghe(C,E))//求直线与三角形交点数 { if(tDEF.pointwhere(A,D,E,lAD,lAE,Q.l2)||tDEF.pointwhere(A,E,F,lAE,lAF,Q.l3)||tDEF.pointwhere(A,D,F,lAD,lAF,Q.l5)) { System.out.print("on the triangle");return; } tDEF.jiaodiannum(P1,P2,P3,lAD,tDEF); num1=tDEF.num; tDEF.jiaodiannum(P1,P2,P3,lAE,tDEF); num2=tDEF.num; tDEF.jiaodiannum(P1,P2,P3,lAF,tDEF); num3=tDEF.num; if(num1==2&&num2==2&&num3==2) System.out.print("in the triangle"); else System.out.print("outof the triangle"); } else if(tCEF.flag==1||D.pointchonghe(D,F)) { if(tCEF.pointwhere(A,C,E,lAC,lAE,Q.l6)||tCEF.pointwhere(A,E,F,lAE,lAF,Q.l3)||tCEF.pointwhere(A,C,F,lAC,lAF,Q.l4)) { System.out.print("on the triangle");return; } tCEF.jiaodiannum(P1,P2,P3,lAC,tCEF); num1=tCEF.num; tCEF.jiaodiannum(P1,P2,P3,lAE,tCEF); num2=tCEF.num; tCEF.jiaodiannum(P1,P2,P3,lAF,tCEF); num3=tCEF.num; if(num1==2&&num2==2&&num3==2) System.out.print("in the triangle"); else System.out.print("outof the triangle"); } else if(tCDF.flag==1||E.pointchonghe(E,C)) { if(tCDF.pointwhere(A,C,D,lAC,lAD,Q.l1)||tCDF.pointwhere(A,D,F,lAD,lAF,Q.l5)||tCDF.pointwhere(A,C,F,lAC,lAF,Q.l4)) { System.out.print("on the triangle");return; } tCDF.jiaodiannum(P1,P2,P3,lAC,tCDF); num1=tCDF.num; tCDF.jiaodiannum(P1,P2,P3,lAD,tCDF); num2=tCDF.num; tCDF.jiaodiannum(P1,P2,P3,lAF,tCDF); num3=tCDF.num; if(num1==2&&num2==2&&num3==2) System.out.print("in the triangle"); else System.out.print("outof the triangle"); } else if(tCDE.flag==1||F.pointchonghe(F,D)) { if(tCDE.pointwhere(A,C,D,lAC,lAD,Q.l1)|tCDE.pointwhere(A,D,E,lAD,lAE,Q.l2)||tCDE.pointwhere(A,C,E,lAC,lAE,Q.l6)) { System.out.print("on the triangle");return; } tCDE.jiaodiannum(P1,P2,P3,lAC,tCDE); num1=tCDE.num; tCDE.jiaodiannum(P1,P2,P3,lAD,tCDE); num2=tCDE.num; tCDE.jiaodiannum(P1,P2,P3,lAE,tCDE); num3=tCDE.num; if(num1==2&&num2==2&&num3==2) System.out.print("in the triangle"); else System.out.print("outof the triangle"); } else if(Q.l1.Quadrilateral2(C,D,E,F,Q)) { Triangle t=new Triangle(); if(t.pointwhere(A,C,D,lAC,lAD,Q.l1)||t.pointwhere(A,D,E,lAD,lAE,Q.l2)||t.pointwhere(A,E,F,lAE,lAF,Q.l3)||t.pointwhere(A,C,F,lAC,lAF,Q.l4)) { System.out.print("on the quadrilateral");return; } Triangle tACD=new Triangle(); tACD.l1.p1=A; tACD.l1.p2=C; tACD.l2.p1=A; tACD.l2.p2=D; tACD.l3.p1=C; tACD.l3.p2=D; Triangle tADE=new Triangle(); tADE.l1.p1=A; tADE.l1.p2=D; tADE.l2.p1=A; tADE.l2.p2=E; tADE.l3.p1=D; tADE.l3.p2=E; Triangle tAEF=new Triangle(); tAEF.l1.p1=A; tAEF.l1.p2=E; tAEF.l2.p1=A; tAEF.l2.p2=F; tAEF.l3.p1=E; tAEF.l3.p2=F; Triangle tACF=new Triangle(); tACF.l1.p1=A; tACF.l1.p2=C; tACF.l2.p1=A; tACF.l2.p2=F; tACF.l3.p1=C; tACF.l3.p2=F; Q.Quadrilateralmianji(Q);//四边形面积 tACD.sanjiaoxmianji(tACD); tADE.sanjiaoxmianji(tADE); tAEF.sanjiaoxmianji(tAEF); tACF.sanjiaoxmianji(tACF); double S; S=tACD.S+tADE.S+tAEF.S+tACF.S; if(S-Q.S<0.001) System.out.print("in the quadrilateral"); else System.out.print("outof the quadrilateral"); } else System.out.print("not a quadrilateral or triangle"); /* Q.Quadrilateralnum(P1,P2,P3,P4,lAC,t,Q); num1=Q.num; Q.Quadrilateralnum(P1,P2,P3,P4,lAD,t,Q); num2=Q.num; Q.Quadrilateralnum(P1,P2,P3,P4,lAE,t,Q); num3=Q.num; Q.Quadrilateralnum(P1,P2,P3,P4,lAF,t,Q); num4=Q.num; System.out.println(num1+" "+num2+" "+num3+" "+num4); if(num1==2&&num2==2&&num3==2&&num4==2) System.out.print("in the quadrilateral"); else System.out.print("outof the quadrilateral"); } else System.out.print("not a quadrilateral or triangle"); */ break; } } } }
虽然使用了面向对象的方法,但是创建类是并没有创建的很完善。
另外,很多内容还是挤在一起,没有去单独构造成函数。
*******************************************************************************************************************************************************
题目2:
用户输入一组选项和数据,进行与五边形有关的计算。以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。选项包括: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
import java.util.Scanner; class Point { double x; double y; int exist=1;//1:存在0:不存在2:交点无数个 int flag=0; public boolean pointchonghe(Point A,Point B)//判断两点重合 { if(A.x==B.x&&A.y==B.y) return true; else return false; } public boolean Pointscoincide(Point A,Point B,Point C,Point D)//判断四边形四点重合 { if(A.x==B.x&&A.y==B.y||A.x==C.x&&A.y==C.y||A.x==D.x&&A.y==D.y||B.x==C.x&&B.y==C.y||B.x==D.x&&B.y==D.y||C.x==D.x&&C.y==D.y) return true; else return false; } } //========================================================================================================== class Line { Point p1=new Point(); Point p2=new Point(); double a; double b; double c; double D;//线段距离 public void L(Line l)//一般式系数 { l.a=l.p2.y-l.p1.y; l.b=l.p1.x-l.p2.x; l.c=l.p2.x*l.p1.y-l.p1.x*l.p2.y; } public void distanse(Line l)//求线段距离D { l.D=Math.sqrt(Math.pow(l.p1.x-l.p2.x,2)+Math.pow(l.p1.y-l.p2.y,2)); l.D=Math.round(l.D*1000000000)/(double)1000000000; } public void D(Point p1,Point p2,Line lp1p2)//两点间距离 { lp1p2.D=Math.sqrt(Math.pow(lp1p2.p1.x-lp1p2.p2.x,2)+Math.pow(lp1p2.p1.y-lp1p2.p2.y,2)); lp1p2.D=Math.round(lp1p2.D*1000000000)/(double)1000000000; } public boolean zhixian(Point X,Line l)//点是否在直线上 { L(l); if(l.a*X.x+l.b*X.y+l.c==0) return true; else return false; } public boolean pingxing(Line l1,Line l2)//判断是否平行(有无交点) { L(l1); L(l2); if(l1.b==0&&l2.b==0) return true; else if(l1.b!=0&&l2.b!=0&&(l1.a/l1.b==l2.a/l2.b)) return true; else return false; } public boolean linechonghe(Line l1,Line l2)//判断是否两线重合 { L(l1); L(l2); if(l1.b==0&&l2.b==0) { if(l1.c/l1.a==l2.c/l2.a) return true; else return false; } else if(l1.a==0&&l2.a==0) { if(l1.c/l1.b==l2.c/l2.b) return true; else return false; } else { if(l1.c/l1.a==l2.c/l2.a&&l1.c/l1.b==l2.c/l2.b) return true; else return false; } } public void jiaodian(Line l1,Line l2,Point O)//两条直线交点 { if(l1.pingxing(l1,l2)) { O.exist=0; //System.out.println("@@@@@@@@"); } else { l1.L(l1); l2.L(l2); O.x=(l1.b*l2.c-l2.b*l1.c)/(l1.a*l2.b-l2.a*l1.b); O.y=(l2.a*l1.c-l1.a*l2.c)/(l1.a*l2.b-l2.a*l1.b); O.x=Math.round(O.x*1000000000)/(double)1000000000; O.y=Math.round(O.y*1000000000)/(double)1000000000; } } public boolean pointwhere(Point A,Point B,Point C,Line lBC)//点A是否在线段BC上(含端点) { if(A.pointchonghe(A,B)||A.pointchonghe(A,C)) return true; else { Line lAB=new Line(); lAB.p1=A; lAB.p2=B; Line lAC=new Line(); lAC.p1=A; lAC.p2=C; lAB.D(A,B,lAB); lAC.D(A,C,lAC); lBC.D(B,C,lBC); if(lAB.D+lAC.D-lBC.D<0.000001) return true; else return false; } } public boolean pointwhere1(Point A,Point B,Point C,Line lBC)//点A是否在线段BC上(不含端点) { if(A.pointchonghe(A,B)||A.pointchonghe(A,C)) return false; else { Line lAB=new Line(); lAB.p1=A; lAB.p2=B; Line lAC=new Line(); lAC.p1=A; lAC.p2=C; lAB.D(A,B,lAB); lAC.D(A,C,lAC); lBC.D(B,C,lBC); if(lAB.D+lAC.D-lBC.D<0.000001) return true; else return false; } } } //======================================================================================================= class Triangle { Point p1=new Point(); Point p2=new Point(); Point p3=new Point(); Line l1=new Line(); Line l2=new Line(); Line l3=new Line(); double S;//面积 int num;//交点数量 int flag=0;//0:不存在/1-10:10种三角形组合 public void Set(Point A,Point B,Point C,Triangle T) { T.p1=A; T.p2=B; T.p3=C; } public void Line(Point A,Point B,Point C,Triangle T)//newLine { T.l1.p1=A; T.l1.p2=B; T.l2.p1=B; T.l2.p2=C; T.l3.p1=A; T.l3.p2=C; } public boolean sanjiaox(Point A,Point B,Point C,Triangle T)//判断是否为三角形 { T.Line(A,B,C,T); l1.distanse(l1); l2.distanse(l2); l3.distanse(l3); if((l1.D+l2.D>l3.D&&l1.D<=l3.D&&l2.D<=l3.D)||(l1.D+l3.D>l2.D&&l1.D<=l2.D&&l3.D<=l2.D)||(l2.D+l3.D>l1.D&&l2.D<=l1.D&&l2.D<=l1.D)) return true; else return false; } public void sanjiaoxmianji(Triangle t)//三角形面积 { t.Line(t.p1,t.p2,t.p3,t); t.l1.distanse(t.l1); t.l2.distanse(t.l标签:
留言评论