欢迎来到天天文库
浏览记录
ID:40812477
大小:45.00 KB
页数:5页
时间:2019-08-08
《判断点是否在面内(java版)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、importjava.util.ArrayList;importjava.util.List;/*****2012-5-25下午4:37:31*/publicclassSystemTaskJob{doubleINFINITY=1e10;doubleESP=1e-5;intMAX_N=1000;ListPolygon;//计算叉乘
2、P0P1
3、×
4、P0P2
5、doubleMultiply(Pointp1,Pointp2,Pointp0){return((p1.x-p0.x)*(p2.y-p0.y)-(p2
6、.x-p0.x)*(p1.y-p0.y));}//判断线段是否包含点pointprivatebooleanIsOnline(Pointpoint,LineSegmentline){return((Math.abs(Multiply(line.pt1,line.pt2,point))7、ebooleanIntersect(LineSegmentL1,LineSegmentL2){return((Math.max(L1.pt1.x,L1.pt2.x)>=Math.min(L2.pt1.x,L2.pt2.x))&&(Math.max(L2.pt1.x,L2.pt2.x)>=Math.min(L1.pt1.x,L1.pt2.x))&&(Math.max(L1.pt1.y,L1.pt2.y)>=Math.min(L2.pt1.y,L2.pt2.y))&&(Math.max(L2.pt1.y,L2.pt28、.y)>=Math.min(L1.pt1.y,L1.pt2.y))&&(Multiply(L2.pt1,L1.pt2,L1.pt1)*Multiply(L1.pt2,L2.pt2,L1.pt1)>=0)&&(Multiply(L1.pt1,L2.pt2,L2.pt1)*Multiply(L2.pt2,L1.pt2,L2.pt1)>=0));}/*射线法判断点q与多边形polygon的位置关系,要求polygon为简单多边形,顶点逆时针排列如果点在多边形内:返回0如果点在多边形边上:返回1如果点在多边形外:返回2*9、/publicintInPolygon(Listpolygon,Pointpoint){intn=polygon.size();intcount=0;LineSegmentline=newLineSegment();line.pt1=point;line.pt2.y=point.y;line.pt2.x=-INFINITY;for(inti=0;i10、ide.pt2=polygon.get((i+1)%n);if(IsOnline(point,side)){return1;}//如果side平行x轴则不作考虑if(Math.abs(side.pt1.y-side.pt2.y)side.pt2.y)count++;}elseif(IsOnline(side.pt2,line)){if(side.pt2.y>side.pt1.y)count++;}e11、lseif(Intersect(line,side)){count++;}}if(count%2==1){return0;}else{return2;}}publicstaticvoidmain(String[]args){SystemTaskJobsystemTaskJob=newSystemTaskJob();Listpolygon=newArrayList();Pointpoint1=newPoint(4,9);Pointpoint2=newPoint(7,10);Pointpo12、int3=newPoint(8,2);Pointpoint4=newPoint(6,8);Pointpoint5=newPoint(6,9);Pointcheckpoint=newPoint(7,11);polygon.add(point1);polygon.add(point2);polygon.add(point3);polygon.add(point4);polyg
7、ebooleanIntersect(LineSegmentL1,LineSegmentL2){return((Math.max(L1.pt1.x,L1.pt2.x)>=Math.min(L2.pt1.x,L2.pt2.x))&&(Math.max(L2.pt1.x,L2.pt2.x)>=Math.min(L1.pt1.x,L1.pt2.x))&&(Math.max(L1.pt1.y,L1.pt2.y)>=Math.min(L2.pt1.y,L2.pt2.y))&&(Math.max(L2.pt1.y,L2.pt2
8、.y)>=Math.min(L1.pt1.y,L1.pt2.y))&&(Multiply(L2.pt1,L1.pt2,L1.pt1)*Multiply(L1.pt2,L2.pt2,L1.pt1)>=0)&&(Multiply(L1.pt1,L2.pt2,L2.pt1)*Multiply(L2.pt2,L1.pt2,L2.pt1)>=0));}/*射线法判断点q与多边形polygon的位置关系,要求polygon为简单多边形,顶点逆时针排列如果点在多边形内:返回0如果点在多边形边上:返回1如果点在多边形外:返回2*
9、/publicintInPolygon(Listpolygon,Pointpoint){intn=polygon.size();intcount=0;LineSegmentline=newLineSegment();line.pt1=point;line.pt2.y=point.y;line.pt2.x=-INFINITY;for(inti=0;i10、ide.pt2=polygon.get((i+1)%n);if(IsOnline(point,side)){return1;}//如果side平行x轴则不作考虑if(Math.abs(side.pt1.y-side.pt2.y)side.pt2.y)count++;}elseif(IsOnline(side.pt2,line)){if(side.pt2.y>side.pt1.y)count++;}e11、lseif(Intersect(line,side)){count++;}}if(count%2==1){return0;}else{return2;}}publicstaticvoidmain(String[]args){SystemTaskJobsystemTaskJob=newSystemTaskJob();Listpolygon=newArrayList();Pointpoint1=newPoint(4,9);Pointpoint2=newPoint(7,10);Pointpo12、int3=newPoint(8,2);Pointpoint4=newPoint(6,8);Pointpoint5=newPoint(6,9);Pointcheckpoint=newPoint(7,11);polygon.add(point1);polygon.add(point2);polygon.add(point3);polygon.add(point4);polyg
10、ide.pt2=polygon.get((i+1)%n);if(IsOnline(point,side)){return1;}//如果side平行x轴则不作考虑if(Math.abs(side.pt1.y-side.pt2.y)side.pt2.y)count++;}elseif(IsOnline(side.pt2,line)){if(side.pt2.y>side.pt1.y)count++;}e
11、lseif(Intersect(line,side)){count++;}}if(count%2==1){return0;}else{return2;}}publicstaticvoidmain(String[]args){SystemTaskJobsystemTaskJob=newSystemTaskJob();Listpolygon=newArrayList();Pointpoint1=newPoint(4,9);Pointpoint2=newPoint(7,10);Pointpo
12、int3=newPoint(8,2);Pointpoint4=newPoint(6,8);Pointpoint5=newPoint(6,9);Pointcheckpoint=newPoint(7,11);polygon.add(point1);polygon.add(point2);polygon.add(point3);polygon.add(point4);polyg
此文档下载收益归作者所有