⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pointlinedistance.java

📁 基于Java的地图数据管理软件。使用MySQL数据库管理系统。
💻 JAVA
字号:
package net.aetherial.gis.publicuse;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2004</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class PointLineDistance {
  /**
   * 1.点(x0,y0)和垂足构成的直线:
   *   直线的斜率是:k1 = (x2 - x1) / (y2 - y1);  [(y2 - y1) != 0;]
   *   直线经过点(x0,y0)
   *   所以直线的公式为:
   *   y -k1 * x +k1 * x0 * y0 = 0;
   *   ===>A1 = -k1, B1 = 1, C1 = k1 * x0 - y0;
   *
   *   如果x2 == x1,即(x2-x1) == 0;
   *   y = y0;
   *   ===>A1 = 0, B1 = 1, C1 = -y0;
   *
   * 2.两点(x1,y1),(x2,y2)构成直线
   *   直线的斜率是:k2 = (y2-y1)/(x2-x1);   [(x2-x1) != 0;]
   *   直线经过点(x1,y1)
   *   所以直线的公式为:
   *   y -k2 * x +k2 * x1 * y1 = 0;
   *   ===>A2 = -k2, B2 = 1, C2 = k2 * x1 - y1;
   *
   *   如果x2 == x1,即(x2-x1) == 0;
   *   y = x1 = x2;
   *   ===>A2 = 0, B2 = 1, C2 = -x1 = -x2;
   *
   * 3.垂足坐标(xz,yz)
   *   y -k1 * x +k1 * x0 * y0 = 0;
   *   y -k2 * x +k2 * x1 * y1 = 0;
   *   ===>
   *   yz = (A1 * C2 - C1 * A2) / (A2 * B1 - A1 * B2);
   *   xz = (C2 * B1 - C1 * B2) / (A1 * B2 - A2 * B1);
   * 4.
   *
   */
  /**
   * 定义点(x0,y0)
   * 定义直线穿过两点(x1,y1),(x2,y2)
   */
  private double x0, y0, x1, y1, x2, y2;
  /**
   * 定义直线的斜率
   *
   */
//  private double k1, k2;
  /**
   * 定义直线1的参数
   */
  private double A1, B1, C1;
  /**
   * 定义直线2的参数
   */
  private double A2, B2, C2;
  /**
   * 定义垂足
   */
  private double xz, yz;

  public PointLineDistance() {
    this.initParamTo0();
  }

  /**
   * 计算线条1
   */
  private void getLine1() {
    if (this.y2 == this.y1) {
      A1 = 1;
      B1 = 0;
      C1 = -x0;
    }
    else {
      double k1 = - (x2 - x1) / (y2 - y1);
//      System.out.println("k1 == " + k1);
      A1 = -k1;
      B1 = 1;
      C1 = k1 * x0 - y0;
    }
  }

  /**
   * 计算线条2
   */
  private void getLine2() {
    if (this.x1 == this.x2) {
      A2 = 1;
      B2 = 0;
      C2 = -x1;
    }
    else {
      double k2 = (y2 - y1) / (x2 - x1);
//      System.out.println("k2 == " + k2);
      A2 = -k2;
      B2 = 1;
      C2 = k2 * x1 - y1;
    }
  }

  /**
   * 计算垂足
   */
  private void getPointZ() {
    if (x1 == x2) {
      xz = x1;
      yz = y0;
    }
    else {
      xz = (C2 * B1 - C1 * B2) / (A1 * B2 - A2 * B1);
      yz = (A1 * C2 - C1 * A2) / (A2 * B1 - A1 * B2);
    }
  }

  /**
   * 将参数
   */
  private void initParamTo0() {
    x0 = 0;
    y0 = 0;
    x1 = 0;
    y1 = 0;
    x2 = 0;
    y2 = 0;
    A1 = 0;
    B1 = 0;
    C1 = 0;
    A2 = 0;
    B2 = 0;
    C2 = 0;
    xz = 0;
    yz = 0;
  }

  /**
   * 设置点(x0,y0)
   */
  public void setPoint0(double x0, double y0) {
    this.x0 = x0;
    this.y0 = y0;
  }

  /**
   * 设置点(x1,y1)
   */

  public void setPoint1(double x1, double y1) {
    this.x1 = x1;
    this.y1 = y1;
  }

  /**
   * 设置点(x2,y2)
   */
  public void setPoint2(double x2, double y2) {
    this.x2 = x2;
    this.y2 = y2;
  }

  /**
   * 判断垂足是否在p1,p2矩形范围内
   */
  private boolean isPzInP1P2Area() {
    if ( ( (this.xz >= this.x1) && (this.xz <= this.x2)) ||
        ( (this.xz <= this.x1) && (this.xz >= this.x2))) {
      if ( ( (this.yz >= this.y1) && (this.yz <= this.y2)) ||
          ( (this.yz <= this.y1) && (this.yz >= this.y2))) {
        return true;
      }
    }
    return false;
  }

  /**
   * 求两点之间的距离
   */
  private double getDis(double xa, double ya, double xb, double yb) {
    return Math.sqrt( (xb - xa) * (xb - xa) + (yb - ya) * (yb - ya));
  }

  /**
   * 求点(x0,y0)和点(x1,y1)之间的距离
   */
  private double getDisOfP0P1() {
    return this.getDis(this.x0, this.y0, this.x1, this.y1);
  }

  /**
   * 求点(x0,y0)和点(x2,y2)之间的距离
   */
  private double getDisOfP0P2() {
    return this.getDis(this.x0, this.y0, this.x2, this.y2);
  }

  /**
   * 求点(x0,y0)和点(xz,yz)之间的距离
   */
  private double getDisOfP0Pz() {
    return this.getDis(this.x0, this.y0, this.xz, this.yz);
  }

  /**
   * 得到点到线段的距离
   */
  public double getDis() {
    getLine1();
    getLine2();
    getPointZ();

    if (this.isPzInP1P2Area()) {
      return this.getDisOfP0Pz();
    }
    else {
      return Math.min(this.getDisOfP0P1(), this.getDisOfP0P2());
    }
  }

  /**
   * 得到P1(x1,y1)、p2(x2,y2)线段的距离
   */
  public double getDisOfP1P2() {
    return this.getDis(this.x1, this.y1, this.x2, this.y2);
  }

  private void printPoint() {
    System.out.println("P0(" + this.x0 + "," + this.y0 + ")  -->  " + "P1(" +
                       this.x1 + "," + this.y1 + ")," + "P2(" + this.x2 + "," +
                       this.y2 + ")");
    System.out.println("Pz(" + this.xz + "," + this.yz + ")");
    System.out.println("");
    System.out.println("A1 == " + A1 + ",B1 == " + B1 + ",C1 == " + C1);
    System.out.println("A2 == " + A2 + ",B2 == " + B2 + ",C2 == " + C2);
  }

  public double getDisOfChuizuAndAnyPoint(double x, double y) {
    return Math.sqrt( (x - this.xz) * (x - this.xz) +
                     (y - this.yz) * (y - this.yz));
  }

  public static void main(String args[]) {
    PointLineDistance pd = new PointLineDistance();
    pd.setPoint0(4, 11);
    pd.setPoint1(1, 10);
    pd.setPoint2(2, 12);
    System.out.println("dis == " + pd.getDis());
    pd.printPoint();
    System.out.println("isPzInP1P2Area() == " + pd.isPzInP1P2Area());

  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -