Forráskód Böngészése

added point_in_poly

Former-commit-id: 2b89074b7e96d9e7c66e92c21e93974c519a10e4
Daniele Panozzo 11 éve
szülő
commit
ce04f279c6
2 módosított fájl, 73 hozzáadás és 0 törlés
  1. 44 0
      include/igl/point_in_poly.cpp
  2. 29 0
      include/igl/point_in_poly.h

+ 44 - 0
include/igl/point_in_poly.cpp

@@ -0,0 +1,44 @@
+#include "point_in_poly.h"
+
+bool IGL_INLINE igl::point_in_poly( const std::vector<std::vector<unsigned int > >&poly, 
+            const unsigned int xt, 
+            const unsigned int yt)
+{
+  int npoints= poly.size();
+  unsigned int xnew,ynew;
+  unsigned int xold,yold;
+  unsigned int x1,y1;
+  unsigned int x2,y2;
+  int i;
+  int inside=0;
+  
+  if (npoints < 3) {
+    return(0);
+  }
+  xold=poly[npoints-1][0];
+  yold=poly[npoints-1][1];
+  for (i=0 ; i < npoints ; i++) {
+    xnew=poly[i][0];
+    ynew=poly[i][1];
+    if (xnew > xold) {
+      x1=xold;
+      x2=xnew;
+      y1=yold;
+      y2=ynew;
+    }
+    else {
+      x1=xnew;
+      x2=xold;
+      y1=ynew;
+      y2=yold;
+    }
+    if ((xnew < xt) == (xt <= xold)          /* edge "open" at one end */
+        && ((long)yt-(long)y1)*(long)(x2-x1)
+        < ((long)y2-(long)y1)*(long)(xt-x1)) {
+      inside=!inside;
+    }
+    xold=xnew;
+    yold=ynew;
+  }
+  return (inside != 0);
+}

+ 29 - 0
include/igl/point_in_poly.h

@@ -0,0 +1,29 @@
+#ifndef IGL_POINT_IN_CIRCLE_H
+#define IGL_POINT_IN_CIRCLE_H
+#include "igl_inline.h"
+
+#include <vector>
+
+namespace igl
+{
+  // Determine if 2d point is inside a 2D polygon
+  // Inputs:
+  //   poly  vector of polygon points, [0]=x, [1]=y. 
+  //         Polyline need not be closed (i.e. first point != last point), 
+  //         the line segment between last and first selected points is constructed 
+  //         within this function.
+  //   x     x-coordinate of query point
+  //   y     y-coordinate of query point
+  // Returns true if query point is in polygon, false otherwise
+  // from http://www.visibone.com/inpoly/
+bool IGL_INLINE point_in_poly( const std::vector<std::vector<unsigned int > >&poly, 
+            const unsigned int xt, 
+            const unsigned int yt);
+
+}
+
+#ifdef IGL_HEADER_ONLY
+#  include "point_in_poly.cpp"
+#endif
+
+#endif