docs: private static boolean polygonDisjointMultiPath_(Polygon polygon_a,
  			MultiPath multipath_b, double tolerance,
  			ProgressTracker progress_tracker) {
          Point2D pt_a, pt_b;
          Envelope2D env_a_inf = new Envelope2D(), env_b_inf = new Envelope2D();
  
          MultiPathImpl multi_path_impl_a = (MultiPathImpl)polygon_a._getImpl();
          MultiPathImpl multi_path_impl_b = (MultiPathImpl)multipath_b._getImpl();
  
          PairwiseIntersectorImpl intersector = new PairwiseIntersectorImpl(multi_path_impl_a, multi_path_impl_b, tolerance, true);
  
          if (!intersector.next())
              return true; // no rings intersect
  
          boolean b_intersects = linearPathIntersectsLinearPath_(polygon_a, multipath_b, tolerance);
  
          if (b_intersects)
              return false;
  
          Polygon pa = null;
          Polygon p_polygon_a = polygon_a;
  
          Polygon pb = null;
          Polygon p_polygon_b = null;
  
          if (multipath_b.getType().value() == Geometry.GeometryType.Polygon)
              p_polygon_b = (Polygon)multipath_b;
  
          boolean b_checked_polygon_a_quad_tree = false;
          boolean b_checked_polygon_b_quad_tree = false;
  
          do
          {
              int path_a = intersector.getRedElement();
              int path_b = intersector.getBlueElement();
  
              pt_b = multipath_b.getXY(multipath_b.getPathStart(path_b));
              env_a_inf.setCoords(intersector.getRedEnvelope());
              env_a_inf.inflate(tolerance, tolerance);
  
              if (env_a_inf.contains(pt_b))
              {
                  PolygonUtils.PiPResult result = PolygonUtils.isPointInPolygon2D(p_polygon_a, pt_b, 0.0);
  
                  if (result != PolygonUtils.PiPResult.PiPOutside)
                      return false;
              }
  
              if (multipath_b.getType().value() == Geometry.GeometryType.Polygon)
              {
                  pt_a = polygon_a.getXY(polygon_a.getPathStart(path_a));
                  env_b_inf.setCoords(intersector.getBlueEnvelope());
                  env_b_inf.inflate(tolerance, tolerance);
  
                  if (env_b_inf.contains(pt_a))
                  {
                      PolygonUtils.PiPResult result = PolygonUtils.isPointInPolygon2D(p_polygon_b, pt_a, 0.0);
  
                      if (result != PolygonUtils.PiPResult.PiPOutside)
                          return false;
                  }
              }
  
              if (!b_checked_polygon_a_quad_tree) {
                  if (PointInPolygonHelper.quadTreeWillHelp(polygon_a, multipath_b.getPathCount() - 1) && (multi_path_impl_a._getAccelerators() == null || multi_path_impl_a._getAccelerators().getQuadTree() == null)) {
                      pa = new Polygon();
                      polygon_a.copyTo(pa);
                      ((MultiPathImpl) pa._getImpl())._buildQuadTreeAccelerator(Geometry.GeometryAccelerationDegree.enumMedium);
                      p_polygon_a = pa;
                  } else {
                      p_polygon_a = polygon_a;
                  }
  
                  b_checked_polygon_a_quad_tree = true;
              }
  
              if (multipath_b.getType().value() == Geometry.GeometryType.Polygon)
              {
                  if (!b_checked_polygon_b_quad_tree) {
                      Polygon polygon_b = (Polygon) multipath_b;
                      if (PointInPolygonHelper.quadTreeWillHelp(polygon_b, polygon_a.getPathCount() - 1) && (multi_path_impl_b._getAccelerators() == null || multi_path_impl_b._getAccelerators().getQuadTree() == null)) {
                          pb = new Polygon();
                          polygon_b.copyTo(pb);
                          ((MultiPathImpl) pb._getImpl())._buildQuadTreeAccelerator(Geometry.GeometryAccelerationDegree.enumMedium);
                          p_polygon_b = pb;
                      } else {
                          p_polygon_b = (Polygon) multipath_b;
                      }
  
                      b_checked_polygon_b_quad_tree = true;
                  }
              }
  
          } while (intersector.next());
  
          return true;
  	}