设计并实现一个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;
}
}