在Java语言的开发环境中,提供了一种便捷的方法。类java.awt..geom.GeneralPath提供了根据直线、二次曲线和三次曲线构造的几何路径的方法,同时GeneralPath类继承类Path2D,通过Path2D类提供的方法contains(double x,double y)来判断某个点是否在曲线或直线构成的边界内。
package com.test;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
public class ElectronicFence {
/**
* 测试一个点是否在多边形内
* @param args
*/
public static void main(String[] args) {
//点在多边形内
Point2D.Double point = new Point2D.Double(116.395, 39.910);
//点在多边形外
// Point2D.Double point = new Point2D.Double(116.404072, 39.916605);
List polygon = new ArrayList();
polygon.add(new Point2D.Double(116.395, 39.910));
polygon.add(new Point2D.Double(116.394, 39.914));
polygon.add(new Point2D.Double(116.403, 39.920));
polygon.add(new Point2D.Double(116.402, 39.914));
polygon.add(new Point2D.Double(116.410, 39.913));
if(polygon.contains(point)){
System.out.println("点在多边形内");
}else{
System.out.println("点在多边形外");
}
}
/**
* 判断点是否在多边形内
* 步骤:
* ①声明一个“画笔”
* ②将“画笔”移动到多边形的第一个顶点
* ③用“画笔”按顺序将多边形的顶点连接起来
* ④用“画笔”将多边形的第一个点连起来,最终形成一个封闭的多边形
* ⑤用contains()方法判断点是否在多边形区域内
* @param polygon 多边形
* @param point 检测点
* @return 点在多边形内返回true,否则返回false
*/
public static boolean contains(List polygon, Point2D.Double point){
GeneralPath p = new GeneralPath();
Point2D.Double first = polygon.get(0);
p.moveTo(first.x, first.y);
for(Point2D.Double d : polygon){
p.lineTo(d.x, d.y);
}
p.lineTo(first.x, first.y);
p.closePath();
return p.contains(point);
}
}
其中p为构造的GeneralPath对象,polygon包含了多边形顶点的List对象,每个顶点被定义为Point2D.Double类型。point则是要判断的点,其类型也为Point2D.Double。p.contains(point)返回true则表示点point包含在多边形polygon内。