java判断某个点是否在所画多边形/圆形内
本文实例为大家分享了java判断某个点是否在所画范围内的具体代码,供大家参考,具体内容如下
IsPtInPoly.java
packagecom.ardo.util.circle;
importjava.util.ArrayList;
importjava.util.List;
/**
*java判断某个点是否在所画范围内(多边形【isPtInPoly】/圆形【distencePC】)
*@parampoint检测点
*@parampts多边形的顶点
*@return点在多边形内返回true,否则返回false
*@authorardo
*/
publicclassIsPtInPoly{
/**
*判断点是否在多边形内
*@parampoint检测点
*@parampts多边形的顶点
*@return点在多边形内返回true,否则返回false
*/
publicstaticbooleanisPtInPoly(Point2Dpoint,Listpts){
intN=pts.size();
booleanboundOrVertex=true;//如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
intintersectCount=0;//crosspointscountofx
doubleprecision=2e-10;//浮点类型计算时候与0比较时候的容差
Point2Dp1,p2;//neighbourboundvertices
Point2Dp=point;//当前点
p1=pts.get(0);//leftvertex
for(inti=1;i<=N;++i){//checkallrays
if(p.equals(p1)){
returnboundOrVertex;//pisanvertex
}
p2=pts.get(i%N);//rightvertex
if(p.xMath.max(p1.x,p2.x)){//rayisoutsideofourinterests
p1=p2;
continue;//nextrayleftpoint
}
if(p.x>Math.min(p1.x,p2.x)&&p.x=Math.min(p1.y,p2.y)){//overliesonahorizontalray
returnboundOrVertex;
}
if(p1.y==p2.y){//rayisvertical
if(p1.y==p.y){//overliesonaverticalray
returnboundOrVertex;
}else{//beforeray
++intersectCount;
}
}else{//crosspointontheleftside
doublexinters=(p.x-p1.x)*(p2.y-p1.y)/(p2.x-p1.x)+p1.y;//crosspointofy
if(Math.abs(p.y-xinters)=Math.min(p1.x,p3.x)&&p.x<=Math.max(p1.x,p3.x)){//p.xliesbetweenp1.x&p3.x
++intersectCount;
}else{
intersectCount+=2;
}
}
}
p1=p2;//nextrayleftpoint
}
if(intersectCount%2==0){//偶数在多边形外
returnfalse;
}else{//奇数在多边形内
returntrue;
}
}
/**
*判断是否在圆形内
*@paramp
*@paramc
*@return
*/
publicstaticStringdistencePC(Point2Dp,Circlec){//判断点与圆心之间的距离和圆半径的关系
Strings;
doubled2=Math.hypot((p.getX()-c.getCC().getX()),(p.getY()-c.getCC().getY()));
System.out.println("d2=="+d2);
doubler=c.getR();
if(d2>r){
s="圆外";
}elseif(d2pts=newArrayList();
pts.add(newPoint2D(116.395,39.910));
pts.add(newPoint2D(116.394,39.914));
pts.add(newPoint2D(116.403,39.920));
pts.add(newPoint2D(116.402,39.914));
pts.add(newPoint2D(116.410,39.913));
if(isPtInPoly(point,pts)){
System.out.println("点在多边形内");
}else{
System.out.println("点在多边形外");
}
//测试一个点是否在圆形内
Point2DcenterPoint=newPoint2D(116.404172,39.916605);
Circlec=newCircle();
c.setCC(centerPoint);
c.setR(0.0056);
Strings=distencePC(point,c);
System.out.println("点是否在圆内:"+s);
}
}
Circle.java
/**
*圆形类
*@authorardo
*
*/
publicclassCircle{
privatedoubler;
privatePoint2Dcc;
publicvoidsetR(doublea){
r=a;
}
publicvoidsetCC(Point2DcenterOfCir){
cc=centerOfCir;
}
publicdoublegetR(){
returnr;
}
publicPoint2DgetCC(){
returncc;
}
}
Point2D.java
publicclassPoint2D{
publicdoublex;
publicdoubley;
publicPoint2D(doublex,doubley){
super();
this.x=x;
this.y=y;
}
publicdoublegetX(){
returnx;
}
publicvoidsetX(doublex){
this.x=x;
}
publicdoublegetY(){
returny;
}
publicvoidsetY(doubley){
this.y=y;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。