Java 新手教程之二维平面实现对点直线矩形的包装

Java 新手教程之用面向对象思维实现对二维平面中点直线矩形圆的包装

引言

数学上对点,直线的定义根据使用的不同参考坐标而具有不同的表现形式,如在二维平面中直线较为常用的形式有:

  1. 一般式:Ax+By+C=0 (A、B不同时为0)
  2. 点斜式:y-y0=k(x-x0) (适用于不垂直于x轴的直线)
  3. 两点式:(y-y0)/(y0-y1)=(x-x0)/(x0-x1) (适用于不垂直于x轴、y轴的直线)

另外:
对点定义: 两个二维坐标 pointXpointY
对矩形的定义: 实现两个对角点的封装即可—— rectPointLrectPointR
对圆的定义: 一个中心点 centerPoint 与 半径 rad

那么如何使用面向对象的思维去解决在二维平面的各类直线与矩形的位置关系,并得到相应的描述呢?

对此,本文基本上实现了Java初学者阶段如何去对面向对象的简单思考,适用于刚接触Java的朋友们,并以期能给正在阅读的你带来些许实质性的收获。

(记录:Java第二周之面向对象)

注:本次讨论直线对象表达方式为两点式。

进一步思考

如何正确对点,直线,矩形的进一步准确而又充实的定义决定了接下来如何对其进行实例方法的书写以及相应的需求实现,如果采用继承的方式来通过点对象进一步得到直线,矩形对象,一个潜在的因素是耦合性强,究竟能否根据相应父类得到子类的相关实现,如:求给定两直线的交点,求一条直线与矩形的交点数等,对这些问题的进一步思考在此处不再讨论。对此,我们采用对象组合的方式来得到基于点对象的各种不同实现所需。

myPoint2D类

对点进行一个包装,赋予相应的私有坐标变量并提供public返回坐标方法和描述对于一个具体点对象的toStrig()重写方法,据此可构建一个myPoint2D类,提供不同条件下的生成方式(点对点生成,坐标生成,无参生成)来实现。

部分实现细节:
public class myPoint2D{
private double pointX;
private double pointY;
myPoint2D(){}
myPoint2D(double x,double y){
this.pointX = x;
this.pointY = y;
}
myPoint2D(myPoint2D p){
this.pointX = p.pointX;
this.pointY =p.pointY;
}
}

toString方法:

public String toString(){//返回一个点字符串表示
 return "("+this.pointX+","+this.pointY+")"; 
}

myLine2D类

对于简单点对象的实现已得到满足,对于一条具体的直线而言,使用两点式带来的好处有:可直接组合两个myPoint2D类对象lineEnd,lineStart来描述一条直线,但对于垂直的情况似乎需要进一步讨论,那么如何将这个不利处理得妥当且最好能够将其变为有利呢?
一个可行的思考是:提供描述直线垂直状态的两个double型变量 verticalXverticalY,并对给出的构建点进行判定,根据对应坐标是否相同来得到相应的直线垂直表述形式,进一步思考可知:提供一个对直线存在性的描述变量可以减少后续的位置判断工作。且如果直线为垂直状态,则给出的垂直状态描述不可仅仅根据verticalY 或 verticalX 的值来进行区分

对此我们提出直线的boolean型存在性描述成员变量:lineExist,lineVerticalX,lineVerticalY
并给出myLine2D类的属性封装:

/**
   *author:寒秋夜未央
   *data:2020/09/10
   *e_mail:<1350859659@qq.com>
 **/
 private static double myLine2D_ERROR = 1e-16;//给定误差阈值,用于检测一定范围内的条件是否成立,下同
 private myPoint2D lineEnd;
 private myPoint2D lineStart;
 private double verticalX;
 private double verticalY;//垂直条件的判断
 private boolean lineExist;//对给定直线的存在性保存
 private boolean lineVerticalX;
 private boolean lineVerticalY;//垂直情况下的垂直状态描述

具体实现如下:对直线myLine2D类构造方法提供两个构造方法(包含无参构造)

构造方法形参
myLine2D
myLine2DmyPoint2D s,myPoint2D e
/**
   *author:寒秋夜未央
   *data:2020/09/10
   *e_mail:<1350859659@qq.com>
**/
myLine2D(){
  /**
   *myLine2D无参数类基本构造方法
   *对直线存在性的判断为false
   *可提供静态方法修改该无参数构造方法对象以获得直线实体
   *且更改lineExist为:true
   */
  this.lineEnd = new myPoint2D();
  this.lineStart = new myPoint2D();
  this.verticalX = 0.0;
  this.verticalY = 0.0;
  this.lineExist = false;
  this.lineVerticalX = false;
  this.lineVerticalY = false;
 }
myLine2D(myPoint2D s,myPoint2D e) throws IOException{
  /**
   *myLine2D类基本构造方法
   *使用两个点构造
   *抛出对空点/重复点的异常IOException
   */
  if(s==null||e==null||(s.toString().compareTo(e.toString())==0)){
   throw new IOException("使用了空点/重复点创建直线!");
  }
  if(s.getPointX()==e.getPointX()){
   this.verticalX = s.getPointX();
   this.verticalY = 0.0;
   this.lineEnd = this.lineStart = null;
   this.lineExist = true;
   this.lineVerticalX = true;
   this.lineVerticalY = false;
  }
  else if(s.getPointY()==e.getPointY()){
   this.verticalY = s.getPointY();
   this.verticalX = 0.0;
   this.lineEnd = this.lineStart = null;
   this.lineExist = true;
   this.lineVerticalY = true;
   this.lineVerticalX = false;
  }
  else{
   this.lineStart = s;
   this.lineEnd = e;
   this.verticalX = this.verticalY = 0.0;
   this.lineExist = true;
   this.lineVerticalX = this.lineVerticalY = false;
  }
 }

约定: 使用空构造方法得到的直线存在性为false,并赋予直线初始状态为相应空值,使用错误的方法抛出相应定义的IOException异常做简单的异常处理

myRectangle2D类

至此我们已经了对于点,直线的分析,同上文中提到的各种不同的情况下的分析,在此我们可同样给出关于一个简单二维平面矩形的属性封装:

/**
   *author:寒秋夜未央
   *data:2020/09/10
   *e_mail:<1350859659@qq.com>
**/
 private static double myRectangle2D_ERROR = 1e-16;//给定误差阈值
 private double rectLong;//定义矩形长度
 private double rectWide;//定义矩形宽度
 private myPoint2D rectPointL;
 private myPoint2D rectPointR;//左右对角点
 private boolean rectExist;//对给定矩形的存在性保存

并给出构造方法:

构造方法形参
myRectangle2D()
myRectangle2D(myPoint2D L,myPoint2D R) throws IOExceptionmyPoint2D L,myPoint2D R

代码块:

/**
   *author:寒秋夜未央
   *data:2020/09/10
   *e_mail:<1350859659@qq.com>
**/
myRectangle2D(){
  /**
   *对矩形两点的初始化为: new myPoint2D()
   *该构造方法可通过对类myRectangle2D提供相应方法
   *来达到修改默认矩形属性的目的
   */
  this.rectPointL = new myPoint2D();
  this.rectPointR = new myPoint2D();
  this.rectLong = this.rectWide = 0.0;
  this.rectExist = false;
 }
 myRectangle2D(myPoint2D L,myPoint2D R) throws IOException{
  /**
   *提供两点构造一个矩形
   *不提供长宽定义矩形构造方法
   *抛出一个重复点构造异常
   */
  if(L==null||R==null||L.toString().compareTo(R.toString())==0||
  R.getPointX()==L.getPointX()||R.getPointY()==L.getPointY()){
   throw new IOException("重复点/空点/共线点构造矩形!");
  }
  this.rectPointL = L;
  this.rectPointR = R;
  this.rectLong = java.lang.Math.abs(L.getPointX()-R.getPointX());
  this.rectWide = java.lang.Math.abs(L.getPointY()-R.getPointY());
  this.rectExist = true;
 }

myCircle2D类

同上我们给出myCircle2D类的包装:

/**
   *author:寒秋夜未央
   *data:2020/09/10
   *e_mail:<1350859659@qq.com>
**/
 private static double myCircle2D_ERROR = 1e-16;//给定误差阈值
 private double rad;
 private myPoint2D centerPoint;
 private boolean circleExist;//对给定圆的存在性保存
构造方法形参
myCircle2D()
myCircle2D(myPoint2D p, double rad) throws IOExceptionmyPoint2D p, double rad

代码块:

myCircle2D(){
  rad = 0.0;
  centerPoint = null;
  circleExist = false;
 }
 myCircle2D(myPoint2D p, double rad) throws IOException{
  if(rad==0.0||p==null){ 
   throw new IOException("使用了空点/零长度半径创造圆!");
  }
  this.rad = rad;
  this.centerPoint = p;
  this.circleExist = true;
 }

总结

至此我们已初步实现了二维平面下的点、线、矩形、圆的封装,但对于如何正确去实现各种情况下的交点个数及其合理性的分析还需要进一步的讨论,同时我们采用的对象组合方式的特性也未被更好的利用,可能看到这里的朋友心中还存有不少的疑惑,如我们为何在相应属性中封装一系列的boolean型值,却觉得这并没有能起到多大的作用等。所有的这些问题都需要进一步的去思考,去使用我们封装好的各种类实例对象完成一些具体的问题才能在过程中有所展现,如实现相应的直线与直线交点,直线与矩形交点等等,这将在我们后续的讨论中进一步的得出相应的合理答案。

圣人不贵尺之壁而重寸之阴。

点线圆实例代码上提取:30ws

注:创作不易,如果喜欢请点赞支持作者一下,谢谢,文章转载请注明出处。

Java新手入门书籍整合:clzo
编程网课教学资源转存(媞取码dicc)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值