BLOG-2
BLOG-2|PTA作业|学习通
17207119胡立鑫
四边形
7-2 点线形系列4-凸四边形的计算
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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"。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
注意:输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
选项1、2、3中,若四边形四个点中有重合点,输出"points coincide"。
选项4中,若前两个输入线的点重合,输出"points coincide"。
代码如下
import java.util.Scanner; // 需要导入 util 包
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// String ch = input.nextLine();
PointTaking a = new PointTaking();
a.ch = input.nextLine();//读入
double ans =a.Solve();
if (ans == -1)
System.out.printf("Wrong Format\n");
else if (ans == -2)
System.out.printf("wrong number of points\n");
else if (ans == -3)
System.out.printf("data error\n");
else if (ans==-4)
System.out.printf("not a quadrilateral\n");
else if (ans==-5)
System.out.printf("not a quadrilateral or triangle");
else if (ans == 1)
System.out.printf("true\n");
else if (ans == 2)
System.out.printf("false\n");
else if(ans==4)
System.out.printf("points coincide\n");
}
}
class Line {
Point a ,b;
double slope(){//斜率
if(this.a.x==this.b.x)
return 563;
//System.out.printf("\n1511565sada\n");
return (this.a.y-this.b.y)/(this.a.x-this.b.x);
}
double intercept() {//截距
if(slope()==563)
return this.a.x;
if(slope()==0)
return 0;
return a.x-(this.slope())*a.y;
}
double pointVerticalDistanc(Point c){//点到线距离
if(this.a.x==this.b.x)
return Math.abs(c.x-this.a.x);
return (Math.abs((this.a.y-this.b.y)*c.x+(this.b.x-this.a.x)*c.y+this.a.x*this.b.y-this.a.y*this.b.x)/
(Math.sqrt((this.a.y-this.b.y)*(this.a.y-this.b.y)+(this.a.x-this.b.x)*(this.a.x-this.b.x))));
}
int judgeIntersection(Line line){//判断线段是否相交,0:两线平行且嵌入 1 有焦点 -1平行 -2:无交点
if(slope()==line.slope()&&intercept()==line.intercept())
return 0;
if(slope()==line.slope())
return -1;
Point point = this.intersection(line);
if(point.x<=Math.max(line.a.x,line.b.x)&&point.x>=Math.min(line.a.x,line.b.x)&&point.y<=Math.max(line.a.y,line.b.y)&&point.y>=Math.min(line.a.y,line.b.y))
return 1;
return -1;
}
boolean sameIntersection(Line line1,Line line2){//判断相交点是否相同
Point point1=this.intersection(line1),point2=this.intersection(line2);
// System.out.printf("%f %f %f %f %f %f %f %f \n",line1.a.x,line1.a.y,line1.b.x,line1.b.y,line2.a.x,line2.a.y,line2.b.x,line2.b.y);
return point2.x == point1.x && point1.y == point2.y;
}
double dis(){
return a.DistanceCalculation(b);
}//线长
boolean judgeParallelism(Line a) {
return a.slope() == this.slope();
}
Point intersection(Line line){//求相交点
Point point1 = new Point();
point1.x=((line.a.x-line.b.x)*(this.a.y*this.b.x-this.a.x*this.b.y)-(this.a.x-this.b.x)*(line.a.y*line.b.x-line.a.x*line.b.y))/
((this.b.y-this.a.y)*(line.b.x-line.a.x)-(this.b.x-this.a.x)*(line.b.y-line.a.y));
point1.y=((line.a.y-line.b.y)*(this.a.y*this.b.x-this.a.x*this.b.y)-(this.a.y-this.b.y)*(line.a.y*line.b.x-line.a.x*line.b.y))/
((this.b.y-this.a.y)*(line.b.x-line.a.x)-(this.b.x-this.a.x)*(line.b.y-line.a.y));
return point1;
}
boolean dotLineJudgment(Point point){//判断点是否在直线上
Line line2 = new Line();
line2.a = point;line2.b=this.b;
if((point.x==a.x&&point.y==a.y)||(point.x==b.x&&point.y== b.y))
return true;
// System.out.printf("%f %f %f %f %f %f %f %f "+(line2.slope()==slope())+"\n",a.x,a.y,b.x,b.y,point.x,point.y,slope(),line2.slope());
return line2.slope() == this.slope() && line2.intercept() == this.intercept();
}
boolean vertical(Line line){
return (a.x - b.x) * (line.a.x - line.b.x) + (a.y - b.y) * (line.a.y - line.b.y) == 0;
}
}
class Point {//点的类
double x = 0 , y = 0 ;
double DistanceCalculation(Point b) {
return Math.sqrt((this.x-b.x)*(this.x-b.x)+(this.y-b.y)*(this.y-b.y));
}//返回两点距离
}
class Triangle {
Line []line = new Line[8];
double area() {//三角形面积
double p= (Math.sqrt((line[1].a.x-line[1].b.x)*(line[1].a.x-line[1].b.x)+(line[1].a.y-line[1].b.y)*(line[1].a.y-line[1].b.y))+Math.sqrt((line[2].a.x-line[2].b.x)*(line[2].a.x-line[2].b.x)+(line[2].a.y-line[2].b.y)*(line[2].a.y-line[2].b.y))+ Math.sqrt((line[3].a.x-line[3].b.x)*(line[3].a.x-line[3].b.x)+(line[3].a.y-line[3].b.y)*(line[3].a.y-line[3].b.y)) )/2;
return Math.sqrt(p*(p- Math.sqrt((line[1].a.x-line[1].b.x)*(line[1].a.x-line[1].b.x)+(line[1].a.y-line[1].b.y)*(line[1].a.y-line[1].b.y)) )*(p - Math.sqrt((line[2].a.x-line[2].b.x)*(line[2].a.x-line[2].b.x)+(line[2].a.y-line[2].b.y)*(line[2].a.y-line[2].b.y)) )*(p- Math.sqrt((line[3].a.x-line[3].b.x)*(line[3].a.x-line[3].b.x)+(line[3].a.y-line[3].b.y)*(line[3].a.y-line[3].b.y)) ));
}
void init(Line line1,Line line2,Point point1,Point point2){
for(int i=1;i<=3;i++){
line[i] = new Line();
line[i].a= new Point();
line[i].b = new Point();
}
line[1].a.x=line1.a.x;line[1].a.y=line1.a.y;
line[1].b.x=line1.b.x;line[1].b.y=line1.b.y;
line[2].a.x=line2.a.x;line[2].a.y=line2.a.y;
line[2].b.x=line2.b.x;line[2].b.y=line2.b.y;
line[3].a.x=point1.x;line[3].a.y=point1.y;
line[3].b.x=point2.x;line[3].b.y=point2.y;
}
void init(Point point3,Point point1,Point point2) {
for(int i=1;i<=3;i++){
line[i] = new Line();
line[i].a= new Point();
line[i].b = new Point();
}
line[1].a.x=point1.x;line[1].a.y=point1.y;
line[1].b.x=point2.x;line[1].b.y=point2.y;
line[