zoukankan      html  css  js  c++  java
  • java/c# 判断点是否在多边形区域内

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

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

    继续搜索,了解到 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.GraphicsPath myGraphicsPath=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.Double point, List<Point2D.Double> polygon) {
      java.awt.geom.GeneralPath p = 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 boolean checkWithJdkPolygon(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.cnblogs.com/jacklondon ; 欢迎访问 http://www.zheguisoft.com/ 并提建议。
  • 相关阅读:
    67. Add Binary
    66. Plus One
    64. Minimum Path Sum
    63. Unique Paths II
    How to skip all the wizard pages and go directly to the installation process?
    Inno Setup打包之先卸载再安装
    How to change the header background color of a QTableView
    Openstack object list 一次最多有一万个 object
    Openstack 的 Log 在 /var/log/syslog 里 【Ubuntu】
    Git 分支
  • 原文地址:https://www.cnblogs.com/jacklondon/p/2471492.html
Copyright © 2011-2022 走看看