• 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/ 并提建议。
  • 相关阅读:
    浏览器允许跨域运行字符串
    检查失败,<master>分支有过其他更新,请先在本地合并<master>分支的代码
    微信公众号开发点点滴滴
    手机上的软件开发应该
    见过写过最好的代码
    Prometheus之新版node_exporter监控主机设置
    Granfana设置邮件告警
    linux 中添加自己的库路径的方法 cannot open shared object file: No such file or directory
    C# this.Invoke()的作用与用法
    C#中this.Invoke()中委托的定义
  • 原文地址:https://www.cnblogs.com/jacklondon/p/2471492.html
Copyright © 2020-2023  润新知