HFUT机器人技术第二次作业

 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值