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

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

你可能感兴趣的:(算法)