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

2012-04-26 15:29

 

最近帮别人解决了一个问题,如何判断一个坐标点,是否在多边形区域内(二维)。 在网上搜索了一圈,都是自己写代码,有多种算法,分凸多边形、凹多边形,总之是麻烦。 继续搜索,了解到 Java/dotnet 自带的类库中,都有现成的类函数,可以解决这个问题。 考虑到了解的人不多,特将相关知识共享出来,也许大家以后也用得着。

 

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

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

 

继续搜索,了解到 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 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 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 好像只能处理整数坐标值,不能处理浮点数。

 

 

欢迎转载,转载请注明出处: https://www.zheguisoft.com/staff_blogs/jacklondon_chen/2012, 及 https://www.cnblogs.com/jacklondon/archive/2012/04/26/2471492.html