docs: static boolean polygonRelatePoint_(Polygon polygon_a, Point point_b,
  			double tolerance, String scl, ProgressTracker progress_tracker) {
          RelationalOperationsMatrix relOps = new RelationalOperationsMatrix();
          relOps.resetMatrix_();
          relOps.setPredicates_(scl);
          relOps.setAreaPointPredicates_();
  
          Envelope2D env_a = new Envelope2D();
          polygon_a.queryEnvelope2D(env_a);
          Point2D pt_b = point_b.getXY();
  
          boolean bRelationKnown = false;
          boolean b_disjoint = RelationalOperations.pointDisjointEnvelope_(pt_b, env_a, tolerance, progress_tracker);
  
          if (b_disjoint)
          {
              relOps.areaPointDisjointPredicates_(polygon_a);
              bRelationKnown = true;
          }
  
          if (!bRelationKnown)
          {
              PolygonUtils.PiPResult res = PolygonUtils.isPointInPolygon2D(polygon_a, pt_b, tolerance); // uses accelerator
  
              if (res == PolygonUtils.PiPResult.PiPInside)
              {// polygon must have area
                  relOps.m_matrix[MatrixPredicate.InteriorInterior] = 0;
                  relOps.m_matrix[MatrixPredicate.InteriorExterior] = 2;
                  relOps.m_matrix[MatrixPredicate.BoundaryInterior] = -1;
                  relOps.m_matrix[MatrixPredicate.BoundaryExterior] = 1;
                  relOps.m_matrix[MatrixPredicate.ExteriorInterior] = -1;
              }
              else if (res == PolygonUtils.PiPResult.PiPBoundary)
              {
                  relOps.m_matrix[MatrixPredicate.ExteriorInterior] = -1;
  
                  double area = polygon_a.calculateArea2D();
  
                  if (area != 0)
                  {
                      relOps.m_matrix[MatrixPredicate.InteriorInterior] = -1;
                      relOps.m_matrix[MatrixPredicate.BoundaryInterior] = 0;
                      relOps.m_matrix[MatrixPredicate.InteriorExterior] = 2;
                      relOps.m_matrix[MatrixPredicate.BoundaryExterior] = 1;
                  }
                  else
                  {
                      relOps.m_matrix[MatrixPredicate.InteriorInterior] = 0;
                      relOps.m_matrix[MatrixPredicate.BoundaryInterior] = -1;
                      relOps.m_matrix[MatrixPredicate.BoundaryExterior] = -1;
  
                      Envelope2D env = new Envelope2D();
                      polygon_a.queryEnvelope2D(env);
                      relOps.m_matrix[MatrixPredicate.InteriorExterior] = (env.getHeight() == 0.0 && env.getWidth() == 0.0 ? -1 : 1);
                  }
              }
              else
              {
                  relOps.areaPointDisjointPredicates_(polygon_a);
              }
          }
  
          boolean bRelation = relationCompare_(relOps.m_matrix, scl);
          return bRelation;
  	}