isCrosses method

bool isCrosses(
  1. int dimensionOfGeometryA,
  2. int dimensionOfGeometryB
)

Tests whether this geometry crosses the specified geometry.

The crosses predicate has the following equivalent definitions:

  • The geometries have some but not all interior points in common.
  • The DE-9IM Intersection Matrix for the two geometries is
    • T*T****** (for P/L, P/A, and L/A situations)
    • T*****T** (for L/P, L/A, and A/L situations)
    • 0******** (for L/L situations)
For any other combination of dimensions this predicate returns false.

The SFS defined this predicate only for P/L, P/A, L/L, and L/A situations. JTS extends the definition to apply to L/P, A/P and A/L situations as well. This makes the relation symmetric.

@param dimensionOfGeometryA the dimension of the first Geometry @param dimensionOfGeometryB the dimension of the second Geometry @return true if the two Geometrys related by this IntersectionMatrix cross.

Implementation

bool isCrosses(int dimensionOfGeometryA, int dimensionOfGeometryB) {
  if ((dimensionOfGeometryA == Dimension.P &&
          dimensionOfGeometryB == Dimension.L) ||
      (dimensionOfGeometryA == Dimension.P &&
          dimensionOfGeometryB == Dimension.A) ||
      (dimensionOfGeometryA == Dimension.L &&
          dimensionOfGeometryB == Dimension.A)) {
    return isTrue(matrix[Location.INTERIOR][Location.INTERIOR]) &&
        isTrue(matrix[Location.INTERIOR][Location.EXTERIOR]);
  }
  if ((dimensionOfGeometryA == Dimension.L &&
          dimensionOfGeometryB == Dimension.P) ||
      (dimensionOfGeometryA == Dimension.A &&
          dimensionOfGeometryB == Dimension.P) ||
      (dimensionOfGeometryA == Dimension.A &&
          dimensionOfGeometryB == Dimension.L)) {
    return isTrue(matrix[Location.INTERIOR][Location.INTERIOR]) &&
        isTrue(matrix[Location.EXTERIOR][Location.INTERIOR]);
  }
  if (dimensionOfGeometryA == Dimension.L &&
      dimensionOfGeometryB == Dimension.L) {
    return matrix[Location.INTERIOR][Location.INTERIOR] == 0;
  }
  return false;
}