java/c# 判断点是否在多边形区域内

年06月29日 ⁄ 综合 ⁄ 共 1547字 ⁄ 字号    ⁄ 评论关闭

最近帮别人解决了一个问题,如何判断一个坐标点,是否在多边形区域内(二维)。

在网上搜索了一圈,都是自己写代码,有多种算法,分凸多边形、凹多边形,总之是麻烦。

继续搜索,了解到 Java/dotnet 自带的类库中,都有现成的类函数,可以解决这个问题。

考虑到了解的人不多,特将相关知识共享出来,也许大家以后也用得着。

a) dotnet 中,用System.Drawing.Drawing2D.GraphicsPath 和 Region 类联合起来,然后用 Region.IsVisible(point) 函数,可以判断点是否在多边形区域内。

b) Java 中,使用 java.awt.Polygon.contains(point) ,或者 java.awt.geom.GeneralPath.contains(point) 函数,都可以判断点是否在多边形区域内。

以下是代码示例:

code c#:

System.Drawing.Drawing2D.GraphicsPathmyGraphicsPath=new System.Drawing.Drawing2D.GraphicsPath(); 
Region myRegion=new Region(); 
myGraphicsPath.Reset();

//添家多边形点 
Point p1=new Point(x1,y1);
Point p2=new Point(x2,y2);
Point p3=new Point(x3,y3);
Point p4=new Point(x4,y4);

myGraphicsPath.AddPolygon(LoadPoint(p1,p2,p2,p4)); 
myRegion.MakeEmpty(); 
myRegion.Union(myGraphicsPath); 
//返回判断点是否在多边形里
bool myPoint =myRegion.IsVisible(MousePoint);

code java 1:

public boolean checkWithJdkGeneralPath(Point2D.Doublepoint, List<Point2D.Double> polygon) {
  java.awt.geom.GeneralPathp = new java.awt.geom.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);

}

code java 2:

public booleancheckWithJdkPolygon(Point2D.Double point, List<Point2D.Double> polygon) {
    java.awt.Polygon p = new Polygon();

//java.awt.geom.GeneralPath
    final int TIMES = 1000;

for (Point2D.Double d :polygon) {
        int x = (int) d.x * TIMES;
        int y = (int) d.y * TIMES;
        p.addPoint(x, y);
    }

int x = (int) point.x *TIMES;
    int y = (int) point.y * TIMES;

return p.contains(x,y);

}

java.awt.Polygon 好像只能处理整数坐标值,不能处理浮点数。

原文转自:http://www.xuebuyuan.com/235246.html
原作者为 学步园。请尊重原作者版权

java/c# 判断点是否在多边形区域内的更多相关文章

  1. PHP判断点是否在多边形区域内外

    小谢博客原文地址https://xgs888.top/post/view?id=79 PHP判断点是否在多边形区域内外:根据数学知识的射线法, 射线与几何多边形相交的点的个数为奇数则是在几何内部: 偶 ...

  2. 百度地图java 判断当前位置是否在多边形区域内

    package com.haiyisoft.cAssistant.adapter.hessian; import java.awt.geom.Point2D;import java.util.Arra ...

  3. JS实现判断点是否在多边形范围内

    一.说明 在GIS领域,判断点是否在多边形范围内是一个基础方法,这里主要说下实现原理. 原理比较简单,就是有一个GIS理论,一个点向一个方向发送射线,射线与多边形各个边相交的交点如果是奇数说明点在多边 ...

  4. java 坐标系运算 判断一个地理坐标是否在电子围栏 圆、矩形、多边形区域内

    转载自:https://blog.csdn.net/Deepak192/article/details/79402694 测试没问题,我用的是原始坐标:要注意的是坐标转换问题,要看当前是属于什么坐标系 ...

  5. 判断一个点是否在多边形区域内--C算法

    /*函数的输入:(1)当前点的坐标p(2)区域顶点数组pt[]:(3)顶点数nCount 输出: 在区域内返回TRUE,否则返回FALSE.  Point类型是一个结构: struct Point { ...

  6. PHP计算经纬度在百度多边形区域内

    最近做一个项目需要使用到区域,并且要判断当前的经纬度是否在区域内,已便对应业务需求变化.废话不多说直接上代码: /** * 验证区域范围 * @param array $coordArray 区域 * ...

  7. php 判断一个点是否在一个多边形区域内

    <?php class pointMap{ private static $coordArray; private static $vertx = []; private static $ver ...

  8. Android JAVA如何判断两天在同一周内

    /** * <pre> * 判断date和当前日期是否在同一周内 * 注: * Calendar类提供了一个获取日期在所属年份中是第几周的方法,对于上一年末的某一天 * 和新年初的某一天在 ...

  9. 如何判断元素是否在可视区域内--getBoundingClientRect

    介绍 Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置. 根据MDN文档 getBoundingClientRect 方法返回的是一个DOMRect ...

随机推荐

  1. Vim命令大全

    1.进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于 ...

  2. Python定时任务框架APScheduler 3.0.3 Cron示例

    APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...

  3. 关于mapreduce.map.java.opts

    a)   Update the property in relevant mapred-site.xml(from where client load the config). b) Import t ...

  4. 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (1)

    国际版Microsoft Azure的Preview Portal已经于12月2日正式GA,现在登录国际版的Microsoft Azure,默认就会进入Microsoft Azure New Port ...

  5. [书目20160612]思考软件,创新设计——A段架构师的思考技术

    高焕堂:在校时期主修统计学和信息管理,将近40年软件开发生涯.工作于亚洲和欧美各地区,专精于商业策略思考和系统架构设计.近年来,热衷于<it+设计>教育顾问和产品开发. 第1章  商业思维 ...

  6. Java设计模式之代理模式

    代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式: 人如其名,代理相 ...

  7. Miller-Rabin素数快速检测

    满足费马小定理 a^(n-1) === 1(mod n) --->伪素数       对于所有a belong Zn*,总存在满足的合数n,称为Carmichael数 ------------- ...

  8. 网络之TCP/IP四层模型

    应用层(应用层.表示层.会话层):FTP.Telnet.DNS.SMTP 传输层(传输层):TCP<传输控制协议> . UDP<用户数据报文协议> 网际互连层(网络层):IP. ...

  9. AC日记——字符串位移包含问题 1.7 19

    19:字符串移位包含问题 总时间限制:  1000ms 内存限制:   65536kB 描述 对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串. 给定两个字符串 ...

  10. Unity实现刺客信条灯光的思路探究

    灯光需求 类似刺客信条的开场CG动画,场景中打着酷炫的灯光,玩家在场景中行走可以感受到灯光很真实. 参考视频:http://www.iqiyi.com/w_19rqytbmvt.html 运行环境 安 ...