电子围栏的实现(二):几何路径法(推荐)

2019-04-14 22:10发布

在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内。