1、定义点

public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepublic String toString() {DecimalFormat df = new DecimalFormat("#.000000000000000000000000000000");return "Point [x=" + df.format(x) + ", y=" + df.format(y) + "]";}public Point(BigDecimal x, BigDecimal y) {this.x = x;this.y = y;}public BigDecimal getX() {return x;}public void setX(BigDecimal x) {this.x = x;}public BigDecimal getY() {return y;}public void setY(BigDecimal y) {this.y = y;}
}

2、定义线(多边形的边)


public class Line {private Point apoint;private Point zpoint;private BigDecimal k;private BigDecimal b;public Line() {}public Line(Point a, Point z) {this.apoint = a;this.zpoint = z;}public Line(BigDecimal x1, BigDecimal y1, BigDecimal x2, BigDecimal y2) {this.apoint = new Point(x1, y1);this.zpoint = new Point(x2, y2);}/*** 计算中点* * @return*/public Point getMidPoint() {Point midPoint = null;if (apoint != null && zpoint != null) {BigDecimal x = (apoint.getX().add(zpoint.getX())).divide(new BigDecimal(2), PolygonUtil.ACCURACY,BigDecimal.ROUND_HALF_UP);BigDecimal y = (apoint.getY().add(zpoint.getY())).divide(new BigDecimal(2), PolygonUtil.ACCURACY,BigDecimal.ROUND_HALF_UP);midPoint = new Point(x, y);}return midPoint;}/*** 获取斜率* * @return*/public BigDecimal getK() {// k = (y1 - y2) / (x1 - x2)if (k == null) {k = BigDecimal.ZERO;if (apoint != null && zpoint != null) {if (apoint.getX().compareTo(zpoint.getX()) != 0) {k = (apoint.getY().subtract(zpoint.getY())).divide(apoint.getX().subtract(zpoint.getX()),PolygonUtil.ACCURACY, BigDecimal.ROUND_HALF_UP);}}}return k;}public BigDecimal getB() {// b = y - kxif (b == null) {b = BigDecimal.ZERO;if (apoint != null && zpoint != null) {BigDecimal k = getK();if (k.compareTo(BigDecimal.ZERO) == 0) {b = apoint.getY();} else {b = apoint.getY().subtract(apoint.getX().multiply(k));}}}return b;}@Overridepublic String toString() {DecimalFormat df = new DecimalFormat("#.000000000000000000000000000000");return "Line [apoint=" + apoint + ", zpoint=" + zpoint+ ", getMidPoint()=" + getMidPoint() + ", getK()="+ df.format(getK()) + ", getB()=" + df.format(getB())+ ", getApoint()=" + getApoint() + ", getZpoint()="+ getZpoint() + ", getClass()=" + getClass() + ", hashCode()="+ hashCode() + ", toString()=" + super.toString() + "]";}public Point getApoint() {return apoint;}public void setApoint(Point apoint) {this.apoint = apoint;}public Point getZpoint() {return zpoint;}public void setZpoint(Point zpoint) {this.zpoint = zpoint;}
}

3、判断线是否在多边形内

public class PolygonUtil {private final static Logger logger = LoggerFactory.getLogger(GeoService.class);public static final int ACCURACY = 30;/*** 将多边形拆除多条边(此处为超图多边形模型,可根据具体模型修改此方法)* @param polygon* @return*/public List<Line> getLineList(GeoRegion polygon) {List<Line> lines = new ArrayList<Line>();Point2D apt = null;Point2D zpt = null;Point2Ds pts = null;Line line = null;for (int i = 0; i < polygon.getPartCount(); i++) {pts = polygon.getPart(i);for (int j = 0; j < pts.getCount() - 1; j++) {apt = pts.getItem(j);zpt = pts.getItem(j + 1);line = new Line(new BigDecimal(apt.getX()), new BigDecimal(apt.getY()), new BigDecimal(zpt.getX()),new BigDecimal(zpt.getY()));lines.add(line);}}return lines;}/*** 判断点是否在多边形内* * @param point* @param lines* @return*/public boolean withIn(Point point, List<Line> lines) {// 根据面第一条边中点确认射线Line ray = new Line(point, lines.get(0).getMidPoint());Line line = null;Point meetPoint = null;// logger.info(ray.toString());// logger.info(lines.get(0).getMidPoint().toString());// 因为第一条边必定与射线相交,则从第二条边开始判断int count = 1;for (int i = 1; i < lines.size(); i++) {// logger.info("---------------------");line = lines.get(i);meetPoint = getMeetPoint(ray, line);if (line.getK().compareTo(ray.getK()) != 0) {if (isInline(meetPoint, line) && isInRay(meetPoint, ray)) {count++;}}// logger.info(line.toString());// logger.info(meetPoint.toString());}return count % 2 == 0 ? false : true;}/*** 获取交汇点* * @param ray* @param line* @return*/public Point getMeetPoint(Line ray, Line line) {// x = (b1 - b2) / (k2 - k1)// y = kx + bPoint point = null;BigDecimal x = BigDecimal.ZERO;BigDecimal y = BigDecimal.ZERO;// logger.info("KK:{}", line.getK().compareTo(ray.getK()));if (line.getK().compareTo(ray.getK()) != 0) {if (line.getK().compareTo(BigDecimal.ONE) == 0) {x = line.getApoint().getX();} else {x = (ray.getB().subtract(line.getB())).divide(line.getK().subtract(ray.getK()), PolygonUtil.ACCURACY,BigDecimal.ROUND_HALF_UP);}if (line.getK().compareTo(BigDecimal.ZERO) == 0) {y = line.getApoint().getY();} else {y = ray.getK().multiply(x).add(ray.getB());}point = new Point(x, y);}return point;}/*** 判断交汇点是否在线段上* * @param point* @param line* @return*/public boolean isInline(Point point, Line line) {boolean result = false;if (point == null || point.getX() == null || point.getY() == null) {result = false;} else if ((line.getApoint().getX().compareTo(point.getX()) == -1 && line.getZpoint().getX().compareTo(point.getX()) == -1)|| (line.getApoint().getX().compareTo(point.getX()) == 1 && line.getZpoint().getX().compareTo(point.getX()) == 1)|| (line.getApoint().getY().compareTo(point.getY()) == -1 && line.getZpoint().getY().compareTo(point.getY()) == -1)|| (line.getApoint().getY().compareTo(point.getY()) == 1 && line.getZpoint().getY().compareTo(point.getY()) == 1)) {result = false;} else {result = true;}// logger.info("AX:{}",// line.getApoint().getX().compareTo(point.getX()));// logger.info("ZX:{}",// line.getZpoint().getX().compareTo(point.getX()));// logger.info("AY:{}",// line.getApoint().getY().compareTo(point.getY()));// logger.info("ZY:{}",// line.getZpoint().getY().compareTo(point.getY()));// logger.info("RESULT:{}", result);return result;}/*** 判断点是否在射线上* * @param point* @param ray* @return*/public boolean isInRay(Point point, Line ray) {boolean result = false;if (point == null || point.getX() == null || point.getY() == null) {result = false;} else {BigDecimal x = (ray.getApoint().getX().subtract(ray.getZpoint().getX())).multiply(ray.getApoint().getX().subtract(point.getX()));BigDecimal y = (ray.getApoint().getY().subtract(ray.getZpoint().getY())).multiply(ray.getApoint().getY().subtract(point.getY()));if (x.compareTo(new BigDecimal(0)) < 0|| y.compareTo(new BigDecimal(0)) < 0) {result = false;} else {result = true;}}return result;}/*** 测试* @param args*/public static void main(String[] args) {// 组成多边形的边集合List<Line> lines = new ArrayList<Line>();Point a = new Point(new BigDecimal(1D), new BigDecimal(1D));Point b = new Point(new BigDecimal(2D), new BigDecimal(5D));Point c = new Point(new BigDecimal(5D), new BigDecimal(6D));Point d = new Point(new BigDecimal(4D), new BigDecimal(2D));lines.add(new Line(a, b));lines.add(new Line(b, c));lines.add(new Line(c, d));lines.add(new Line(d, a));List<Point> pointList = new ArrayList<Point>();pointList.add(new Point(new BigDecimal(3.1D), new BigDecimal(3.1D)));pointList.add(new Point(new BigDecimal(7D), new BigDecimal(7D)));PolygonUtil test = new PolygonUtil();for (Point point: pointList) {if (test.withIn(point, lines)) {System.out.printf("点在多边形内:%s\n", point.toString());} else {System.out.printf("点不在多边形内:%s\n", point.toString());}}}
}

射线法判断点是否在多边形内-JAVA相关推荐

  1. python射线法判断点是否在多边形内

    python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法.射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这 ...

  2. python3射线法判断点是否在多边形内

    返回true或者false: # -*- coding: UTF-8 -*-def isInsidePolygon(pt, poly):c = Falsei = -1l = len(poly)j = ...

  3. c#竖直射线法判断点是否再多边形里面

    一.开发环境: VS2017   C#winform 二.竖直射线法大致介绍 通过被判断的点P(x0,y0)引出竖直的上下两条射线,如果两条射线与多变形的交点都为奇数个,那么这个点再多边形里面,反之, ...

  4. 【计算几何】向量叉积和凸包 | 引射线法 | 判断点是否在多边形内部 | 葛立恒扫描法 | Cross Product and Convex Hul

     猛戳!跟哥们一起玩蛇啊 

  5. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

  6. 如何判断一个点在多边形内

    一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...

  7. 判断一点是否在多边形内(附Java实现代码)

    引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...

  8. 判断点是否位于多边形内(包含凹多边形)

    如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...

  9. python内点法_python射线法判断一个点在图形区域内外

    # -*-encoding:utf-8 -*- # file:class.py # """ 信息楼 0 123.425658,41.774177 1 123.425843 ...

最新文章

  1. 如何在TypeScript中使用JS类库
  2. facebook 面试_如何为您的Facebook产品设计面试做准备
  3. VB中使用GDI+进行图像缩放的实例
  4. asp.net 开发知识小结【转】
  5. java环境卡顿_解决Emacs在windows使用的问题,比如环境设置、卡顿……
  6. iOS开发 发布之后的Crash错误反馈(二)
  7. 阿里 8.6 亿美元再押 ofo,与摩拜合并再无可能?
  8. vue 报错 Error: timeout of 5000ms exceeded
  9. Dubbo2.7源码分析-如何发布服务
  10. Microsoft Office Word无法执行语言识别怎么办
  11. java 股票指标算法库_股票K线指标算法整理(Java封装工具类,K线指标算法工具类)...
  12. win10解决电脑突然复制粘贴失效问题
  13. 36岁老码农现身说法
  14. 【原创】从文华财经下载数据并且分析每个期货品种的贝塔值-云金杞
  15. 【转】ACM各种WA的说明及可能的原因
  16. PD虚拟机的三种网络模式
  17. 【YOLOV5-5.x 源码解读】common.py
  18. 写一个能火的游戏视频脚本
  19. TCP/IP详解卷1:第十四章 DNS 域名系统
  20. 智能语音计算器(三)

热门文章

  1. 论文阅读(11) 操纵涡环来提高机动性 (2015)
  2. 【递推算法】热带雨林的昆虫繁殖
  3. 实战 Vue 之实现拖曳排序功能
  4. 防火墙产品最大吞吐量性能测试:丢包概念
  5. 关于QQ一些功能的实现(二)
  6. 2017 9 25翁凯html学习记录
  7. C++实现中文大写与阿拉伯数字的相互转换(类封装)
  8. SM30表维护自动更新值
  9. 重庆大学 计算机组成原理,计算机组成原理课程设计报告重庆大学
  10. 完全卸载Adobe CS4 (Premiere/After Effects) – Adobe CS4 Clean Script绿色版