📄 pointlinedistance.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 + -