平时所用几何类(根据某点求直线的垂线)
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);
}
}
/** 获得两点的距离 */
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);
}
}
相关文章推荐
- poj1269(计算几何+直线位置)
- 数学公式——点到直线的垂线的垂足
- 两空间异面直线公垂线及交点坐标的求解过程
- 计算几何点,直线,线段模板
- bzoj 1007: [HNOI2008]水平可见直线(计算几何)
- POJ 1269 Intersecting Lines(计算几何 直线交点 点在直线上 直线平行)
- hdu 4617 Weapon【异面直线距离——基础三维几何】
- hdu4617三维几何,异面直线距离
- 根据Blob的几何特征分割ROI区域
- POJ 3304 Segments(计算几何:直线与线段相交)
- C语言平面几何7-直线与圆的位置关系
- zzulioj--1600--直线与圆(简单数学几何)
- C# 根据一条直线的两个端点坐标画箭头的方法
- PHP根据已知点来画直线
- POJ 1039 Pipe【计算几何+直线相交】
- hdu 4617 Weapon【异面直线距离——基础三维几何】
- POJ3304 计算几何--判断直线与线段相交
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- (计算几何step8.1.2.1)POJ 2653 Pick-up sticks(判断一根木棒的上面时候还有其他木棒——判断两条直线是否相交)