分享

如何简单判断一个点是否在某个区域之中

 好汉勃士 2019-09-24

具体原理:射线法(但是本人也并不是很理解为什么在某个区域内则会说交点为奇数个,不过通过画图的确没法画出那种情况)

有兴趣的朋友可以自行百度google各种资料

下面是本人根据理解写的代码,有问题欢迎批评指正

  1. public boolean isInRegion(Point p, List<Point> boundary) {
  2. int size = boundary.size();
  3. // 计数器
  4. for (Point model : boundary) {
  5. // 如果点落在边界上也认为在该区域内
  6. if (p.equals(model)) {
  7. return true;
  8. }
  9. }
  10. int count = 0;
  11. Point p1;
  12. Point p2;
  13. int x1, y1, x2, y2;
  14. for (int i = 0; i < size; i++) {
  15. p1 = boundary.get(i % size);
  16. p2 = boundary.get((i + 1) % size);
  17. x1 = p1.getX();
  18. x2 = p2.getX();
  19. y1 = p1.getY();
  20. y2 = p2.getY();
  21. if (y1 == y2) {
  22. continue;
  23. }
  24. if (p.getY() < Math.min(y1, y2)) {
  25. continue;
  26. }
  27. if (p.getY() > Math.max(y1, y2)) {
  28. continue;
  29. }
  30. int x = x2 - ((x2 - x1) * (y2 - p.getY()) / (y2 - y1));
  31. // 这里考虑往x正方向做射线
  32. if (x < p.getX()) {
  33. continue;
  34. }
  35. count++;
  36. }
  37. //如果是奇数则说明该点在区域之中
  38. return count % 2 == 1;
  39. }

具体应用的话:像判断一个建筑物属于哪一个城市,行政区或是街道的话应该都能使用

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多