您的位置:首页 > 其它

平时所用几何类(根据某点求直线的垂线)

2011-07-29 16:28 169 查看
public final class GeomUtil {

/** 获得两点的距离 */

public static double getDistance(Coordinate p1, Coordinate p2) {

return Math.sqrt((p1.y - p2.y) * (p1.y - p2.y) + (p1.x - p2.x)

* (p1.x - p2.x));

}

/** 获得两点的距离 */

public static double getDistance(int x1, int y1, int x2, int y2) {

return Math.sqrt((y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2));

}

/** 垂直相交的点 */

public static Coordinate verticalPoint(Coordinate pa, Coordinate pb,

Coordinate p3) {

Vector2D papbV = new Vector2D(pb.x - pa.x, pb.y - pa.y);// pa到pb的向量

Vector2D pap3V = new Vector2D(p3.x - pa.x, p3.y - pa.y);// pa到p3的向量

double angle = Vector2D.angleBetween(papbV, pap3V);// pap3V向量和papbV向量的夹角

double dis = pap3V.getLength() * Math.cos(angle);// 交点到pa的距离

papbV.setLength(dis);

Coordinate p = new Coordinate((int) (pa.x + papbV.x),

(int) (pa.y + papbV.y));

return p;

}

/** 获得p3距离papb最近的点 */

public static Coordinate getNearestPoint(Coordinate pa, Coordinate pb,

Coordinate p3) {

double a;

double b;

double c;

a = getDistance(pb, p3);

if (a <= 0.0001) {

return p3.clone();

}

b = getDistance(pa, p3);

if (b <= 0.0001) {

return p3.clone();

}

c = getDistance(pa, pb);

if (c <= 0.0001) {

return pa.clone();// 如果PA和PB坐标相同,则退出函数,并返回pa

}

if (a * a >= b * b + c * c) {// p3到pa是钝角,返回pa

return pa.clone();

}

if (b * b >= a * a + c * c) {// p3到pb是钝角,返回pb

return pb.clone();

}

Coordinate vp = verticalPoint(pa, pb, p3);

return vp;

}

/** 确定两个指定点之间的点。 参数 f 的值越接近 1.0,则内插点就越接近第一个点(参数 p1)。 */

public static Coordinate interpolate(Coordinate p1, Coordinate p2, double f) {

double dx = p1.x - p2.x;

double dy = p1.y - p2.y;

int tx = (int) Math.round(p2.x + dx * f);

int ty = (int) Math.round(p2.y + dy * f);

return new Coordinate(tx, ty);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: