|
@ -57,10 +57,11 @@ public class CountDistance {
|
|
|
Point point2 = points.get(j);
|
|
|
double dis = getDistance(point.getX(),point.getY(), point1.getX(), point1.getY());
|
|
|
double dis2 = getDistance(point.getX(),point.getY(), point2.getX(), point2.getY());
|
|
|
//如果dis = dis2 该点与边垂直 判断到边的距离
|
|
|
if (dis==dis2){
|
|
|
Point pointCenter = new Point((point1.getX()+point2.getX())/2.0,(point1.getY()+point2.getY())/2.0);
|
|
|
dis2 = getDistance(point.getX(),point.getY(), pointCenter.getX(), pointCenter.getY());
|
|
|
|
|
|
//获取该点与边的垂足
|
|
|
Point foot = getFoot(point,point1,point2);
|
|
|
if (onLineSegment(foot,point1,point2)){//垂足点在线段上,求出最小距离
|
|
|
dis2 = getDistance(point.getX(),point.getY(), foot.getX(), foot.getY());
|
|
|
}
|
|
|
double min = dis<dis2?dis:dis2;
|
|
|
if (min<dist){
|
|
@ -117,5 +118,39 @@ public class CountDistance {
|
|
|
return peneralPath.contains(point);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 是否在线段AB上
|
|
|
*/
|
|
|
public static boolean onLineSegment(Point p,Point p1,Point p2){
|
|
|
double maxx,minx,maxy,miny;
|
|
|
maxx = p1.x >p2.x ?p1.x :p2.x ; //矩形的右边长
|
|
|
minx = p1.x >p2.x ?p2.x :p1.x ; //矩形的左边长
|
|
|
maxy = p1.y >p2.y ?p1.y :p2.y ; //矩形的上边长
|
|
|
miny = p1.y >p2.y ?p2.y :p1.y ; //矩形的下边长
|
|
|
|
|
|
if( ((p.x -p1.x )*(p2.y -p1.y) == (p2.x -p1.x) *(p.y -p1.y)) && ( p.x >= minx && p.x <= maxx ) && ( p.y >= miny && p.y <= maxy)){
|
|
|
return true;
|
|
|
}else {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*获取P点到直线AB的垂足坐标
|
|
|
*/
|
|
|
public static Point getFoot(Point p,Point p1,Point p2){
|
|
|
Point foot=new Point();
|
|
|
|
|
|
double dx=p1.x-p2.x;
|
|
|
double dy=p1.y-p2.y;
|
|
|
|
|
|
double u=(p.x-p1.x)*dx+(p.y-p1.y)*dy;
|
|
|
u/=dx*dx+dy*dy;
|
|
|
|
|
|
foot.x=p1.x+u*dx;
|
|
|
foot.y=p1.y+u*dy;
|
|
|
|
|
|
return foot;
|
|
|
}
|
|
|
|
|
|
}
|