Line类成员及函数:
package shiyaner;
public class Line {
private float a=0;
private float b=0;
private float c=0;
public float getA() {
return a;
}
public void setA(float a) {
this.a = a;
}
public float getB() {
return b;
}
public void setB(float b) {
this.b = b;
}
public float getC() {
return c;
}
public void setC(float c) {
this.c = c;
}
public void setxyz(float a, float b, float c) {
this.a = a;
this.b = b;
this.c = c;
}
}
Circle类成员及函数:
package shiyaner;
import java.util.Scanner;
public class Circle {
private float r;
private float x;
private float y;
public float getR() {
return r;
}
public void setR(float r) {
this.r = r;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public void setrxy(float r,float x,float y) {
this.r = r;
this.x = x;
this.y = y;
}
}
Rectangle类成员及函数:
package shiyaner;
public class Rectangle {
private float TopRighty;
private float TopRightx;
private float BottomLefty;
private float BottomLeftx;
public float getTopRighty() {
return TopRighty;
}
public void setTopRighty(float topRighty) {
TopRighty = topRighty;
}
public float getTopRightx() {
return TopRightx;
}
public void setTopRightx(float topRightx) {
TopRightx = topRightx;
}
public float getBottomLefty() {
return BottomLefty;
}
public void setBottomLefty(float bottomLefty) {
BottomLefty = bottomLefty;
}
public float getBottomLeftx() {
return BottomLeftx;
}
public void setBottomLeftx(float bottomLeftx) {
BottomLeftx = bottomLeftx;
}
public void Recsetxxyy(float topRighty, float topRightx, float bottomLefty, float bottomLeftx) {
TopRighty = topRighty;
TopRightx = topRightx;
BottomLefty = bottomLefty;
BottomLeftx = bottomLeftx;
}
}
测试类:
package shiyaner;
import java.lang.*;
import java.util.Scanner;
import static java.lang.Math.abs;
import static java.lang.Math.sqrt;
//作者:代波
//时间:2022/9/29 23:55
public class Demo {
public static void main(String[] args) {
float x1,x2,y1,y2,z1,z2,r1,r2;
float a1,a2,b1,b2;
Line L1=new Line();
Line L2=new Line();
Rectangle R1=new Rectangle();
Circle C1=new Circle();
int select=0;
Meno();
while(true)
{
//Meno();
Scanner sc=new Scanner(System.in);
select=sc.nextInt();
switch(select)
{
case 1:
System.out.println("请输入两个直线方程的系数");
Scanner pw=new Scanner(System.in);
x1=pw.nextFloat();
y1=pw.nextFloat();
z1=pw.nextFloat();
x2=pw.nextFloat();
y2=pw.nextFloat();
z2=pw.nextFloat();
L1.setxyz(x1,y1,z1);
L2.setxyz(x2,y2,z2);
intersect(L1,L2);
break;
case 2:
System.out.println("请输入直线的系数与圆的系数");
Scanner pv=new Scanner(System.in);
x1=pv.nextFloat();
y1=pv.nextFloat();
z1=pv.nextFloat();
x2=pv.nextFloat();
y2=pv.nextFloat();
r2=pv.nextFloat();
L1.setxyz(x1,y1,z1);
C1.setrxy(r2,x2,y2);
intersect(L1,C1);
break;
case 3:
System.out.println("请输入直线的系数与矩形右上角与左下角的坐标");
Scanner ps=new Scanner(System.in);
x1=ps.nextFloat();
y1=ps.nextFloat();
z1=ps.nextFloat();
a1=ps.nextFloat();
b1=ps.nextFloat();
a2=ps.nextFloat();
b2=ps.nextFloat();
R1.Recsetxxyy(b1,a1,b2,a2);
intersect(L1,R1);
break;
}
}
}
public static void Meno()
{
System.out.println("1、直线与直线的交点");
System.out.println("2、直线与圆的交点 ");
System.out.println("3、直线与矩形的交点");
}
public static int intersect(Line a, Line b)
{
if(a.getB()*b.getA()-a.getA()*b.getB()==0)
{
if(a.getA()/b.getA()==a.getC()/b.getC())
{
System.out.println("两直线重合");
return 0;
}
else
{
System.out.println("两直线平行");
return 0;
}
}
else
{
float x=(a.getC()*b.getB()-a.getB()*b.getC())/(a.getB()*b.getA()-a.getA()*b.getB());
float y=(a.getA()*b.getC()-a.getC()*b.getA())/(a.getB()*b.getA()-a.getA()*b.getB());
System.out.println("坐标为:"+"("+x+","+y+")");
return 0;
}
}
public static int intersect(Line a, Circle c)
{
double distanceR;//直线到圆心的距离
distanceR=abs(a.getA()*c.getX()+a.getB()*c.getY()+a.getC())/sqrt(a.getA()*a.getA()+a.getB()*a.getB());
//System.out.println("直线到圆心的距离为"+distanceR);
if(distanceR>c.getR())
{
System.out.println("直线与圆无交点");
}
else if(a.getA()==0)
{
double x1,x2,y1,y2;
x1=c.getX()+sqrt(c.getR()*c.getR()-distanceR*distanceR);
x2=c.getX()-sqrt(c.getR()*c.getR()-distanceR*distanceR);
y1=y2=-a.getC()/a.getB();
if(x1==x2)
{
System.out.println("有且仅有一个交点"+x1+","+y1);
}
else
{
System.out.println("有且仅有两个交点"+"("+x1+","+y1+")"+"("+x2+","+y2+")");
}
}
else if(a.getB()==0)
{
double x1,x2,y1,y2;
y1=c.getX()+sqrt(c.getR()*c.getR()-distanceR*distanceR);
y2=c.getX()-sqrt(c.getR()*c.getR()-distanceR*distanceR);
x1=x2=-a.getC()/a.getB();
if(y1==y2)
{
System.out.println("有且仅有一个交点"+x1+","+y1);
}
else
{
System.out.println("有且仅有两个交点"+"("+x1+","+y1+")"+"("+x2+","+y2+")");
}
}
else
{
double x1,x2,y1,y2;
double p=-a.getA()/a.getB();
double q=-a.getC()/a.getB();
double m=c.getX();
double n=c.getY();
x1=-(sqrt((p*p+1)*c.getR()*c.getR()-m*m*p*p+(2*m*n+2*q*m)*p-m*m-2*q*n-q*q)+(q+n)*p+m)/(p*p+1);
x2=(sqrt((p*p+1)*c.getR()*c.getR()-m*m*p*p+(2*m*n+2*q*m)*p-m*m-2*q*n-q*q)-(q+n)*p-m)/(p*p+1);
y1=p*x1+q;
y2=p*x2+q;
if(x1==x2)
{
System.out.println("有且仅有一个交点"+x1+","+y1);
}
else
{
System.out.println("有且仅有两个交点"+"("+x1+","+y1+")"+"("+x2+","+y2+")");
}
}
return 0;
}
public static int intersect(Line a, Rectangle r)
{
if(a.getA()==0)//平行x轴
{
double Y=-a.getC()/a.getB();
if(Y==r.getBottomLefty()||Y>r.getTopRighty())
{
System.out.println("矩形一边与直线重合");
}
else if(Y<r.getBottomLefty()||Y>r.getTopRighty())
{
System.out.println("矩形与直线无交点");
}
else
{
System.out.println("矩形与直线有两个交点:"+r.getBottomLeftx() + "," + Y + "),(" + r.getTopRightx()+ "," + Y +")" );
}
}
else if (a.getB()==0)//平行y轴
{
double X=-a.getC()/a.getA();
if(X==r.getBottomLeftx()||X==r.getTopRightx())
{
System.out.println("直线一边与矩形重合");
}
else if(X<r.getBottomLeftx()||X>r.getTopRightx())
{
System.out.println("直线与矩形无交点");
}
else
{
System.out.println("直线与矩形有两个交点:("+X+","+r.getBottomLefty()+"),("+X+","+r.getTopRighty());
}
}
else
{
double X1,X2,X3,X4,Y1,Y2,Y3,Y4;
boolean flag=false;
X1=r.getBottomLeftx();
Y1=-(a.getA()*X1+a.getC())/a.getB();
X2=r.getTopRightx();
Y2=-(a.getA()*X2+a.getC())/a.getB();
Y3=r.getBottomLefty();
X3=-(a.getB()*Y3+a.getC())/a.getA();
Y4=r.getTopRighty();
X4=-(a.getB()*Y4+a.getC())/a.getA();
if(Y1<=Y4&&Y1>=Y3)
{
if(Y1==-0)
Y1=0;
System.out.println("存在交点"+X1+","+Y1);
flag=true;
}
if(Y2<=Y4&&Y2>=Y3)
{
if(Y2==-0)
Y2=0;
System.out.println("存在交点"+X2+","+Y2);
flag=true;
}
if(X3<X2&&X3>X1)
{
if(X3==-0)
X3=0;
System.out.println("存在交点"+X3+","+Y3);
flag=true;
}
if(X4<X2&&X4>X1)
{
if(X4==-0)
X4=0;
System.out.println("存在交点"+X4+","+Y4);
flag=true;
}
if(!flag)
System.out.println("无交点");
System.out.println();
}
return 0;
}
}