java基本练习基础

设计并实现一个Mine类,它表示直线。构造方法中使用两个给定的点确定直线对象。定义一些基本方法,例如求直线的斜率,判定给定点是否在直线上,计算给定点到给定直线的距离。

定义Mine类,如果2个点的x坐标,或者y坐标相同的就是直线。


/**
 * 直线类
 */
public class Mine {

    /**
     * 确定直线的第一个点
     */
    private final Point p1;

    /**
     * 确定直线的第二个点
     */
    private final Point p2;

    /**
     * y=kx+b
     */
    private final double a;

    private final double b;

    private final double c;

    /**
     * 直线的构造函数
     * @param p1 点1
     * @param p2 点2
     * TODO 需要判断p1和p2不能是同一点
     */
    public Mine(Point p1,Point p2){
        this.p1 = p1;
        this.p2 = p2;
        a = p2.getY() - p1.getY();
        b = p1.getX() - p2.getX();
        c = p1.getY()*p2.getX() - p1.getX()* p2.getY();
    }

    /**
     * 获取直线斜率
     * @return 斜率
     * @throws Exception 斜率不存在
     */
    public double getSlope() throws Exception {
        if(a == 0) return 0;
        else if(b==0) throw new Exception("斜率不存在");
        return (p1.getY()-p2.getY())/(p1.getX()- p2.getX());
    }

    /**
     * 判断点是否在直线上
     * @param other 点
     * @return true 在直线上 ,false不在直线上
     */
    public boolean onMine(Point other){
        return distance(other)==0.0;
    }

    /**
     * 判断点与直线的距离
     * @param other 点
     * @return 距离
     */
    public double distance(Point other){
        return Math.abs(a*other.getX()+b*other.getY()+c)/Math.sqrt(a*a+b*b);
    }
}

/**
 * 测试直线用
 */
class TestMin{
    public static void main(String[] args) throws Exception {
        Point p1 = new Point(3,3);
        Point p2 = new Point(6,6);
        Mine m = new Mine(p1,p2);

        System.out.println(m.getSlope());
        System.out.println(m.onMine(new Point(3,4)));
        System.out.println(m.distance(new Point(3,4)));
    }
}

/**
 * 点类
 */
class Point{

    /**
     * x坐标
     */
    private final double x;

    /**
     * y坐标
     */
    private final double y;

    /**
     * 点的构造函数
     * @param x x坐标
     * @param y y坐标
     */
    public Point(double x,double y){
        this.x = x;
        this.y = y;
    }

    /**
     * 获取x坐标
     * @return x坐标
     */
    public double getX(){
        return x;
    }

    /**
     * 获取y坐标
     * @return y坐标
     */
    public double getY(){
        return y;
    }
}