Exemplo n.º 1
0
    /**
     * Locate the triangle with point inside it or on its boundary.
     *
     * @param point the point to locate
     * @return the triangle that holds point; null if no such triangle
     */
    public Triangle locate(Pnt point) {
      Triangle triangle = mostRecent;
      if (!this.contains(triangle)) triangle = null;

      // Try a directed walk (this works fine in 2D, but can
      // fail in 3D)
      Set<Triangle> visited = new HashSet<Triangle>();
      while (triangle != null) {
        if (visited.contains(triangle)) { // This should
          // never
          // happen
          ; // System.out.println("Warning: Caught in a locate loop");
          break;
        }
        visited.add(triangle);
        // Corner opposite point
        Pnt corner = point.isOutside(triangle.toArray(new Pnt[0]));
        if (corner == null) return triangle;
        triangle = this.neighborOpposite(corner, triangle);
      }
      // No luck; try brute force
      ; // System.out.println("Warning: Checking all triangles for " + point);
      for (Triangle tri : this) {
        if (point.isOutside(tri.toArray(new Pnt[0])) == null) return tri;
      }
      // No such triangle
      ; // System.out.println("Warning: No triangle holds " + point);
      return null;
    }