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

 

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);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值