Index: src/Common/GeoAPI/Geometries/IntersectionMatrix.cs
===================================================================
diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r5fc71a385897af92ccb092f2f969b5709afab85a
--- src/Common/GeoAPI/Geometries/IntersectionMatrix.cs (.../IntersectionMatrix.cs) (revision 8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9)
+++ src/Common/GeoAPI/Geometries/IntersectionMatrix.cs (.../IntersectionMatrix.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a)
@@ -23,7 +23,7 @@
///
/// Internal representation of this .
///
- private Dimensions[,] matrix;
+ private readonly Dimensions[,] matrix;
///
/// Creates an with null location values.
@@ -51,17 +51,32 @@
/// An to copy.
public IntersectionMatrix(IntersectionMatrix other) : this()
{
- matrix[(int) Locations.Interior, (int)Locations.Interior] = other.matrix[(int) Locations.Interior, (int) Locations.Interior];
- matrix[(int) Locations.Interior, (int)Locations.Boundary] = other.matrix[(int) Locations.Interior, (int) Locations.Boundary];
- matrix[(int) Locations.Interior, (int)Locations.Exterior] = other.matrix[(int) Locations.Interior, (int) Locations.Exterior];
- matrix[(int) Locations.Boundary, (int)Locations.Interior] = other.matrix[(int) Locations.Boundary, (int) Locations.Interior];
- matrix[(int) Locations.Boundary, (int)Locations.Boundary] = other.matrix[(int) Locations.Boundary, (int) Locations.Boundary];
- matrix[(int) Locations.Boundary, (int)Locations.Exterior] = other.matrix[(int) Locations.Boundary, (int) Locations.Exterior];
- matrix[(int) Locations.Exterior, (int)Locations.Interior] = other.matrix[(int) Locations.Exterior, (int) Locations.Interior];
- matrix[(int) Locations.Exterior, (int)Locations.Boundary] = other.matrix[(int) Locations.Exterior, (int) Locations.Boundary];
- matrix[(int) Locations.Exterior, (int)Locations.Exterior] = other.matrix[(int) Locations.Exterior, (int) Locations.Exterior];
+ matrix[(int) Locations.Interior, (int) Locations.Interior] = other.matrix[(int) Locations.Interior, (int) Locations.Interior];
+ matrix[(int) Locations.Interior, (int) Locations.Boundary] = other.matrix[(int) Locations.Interior, (int) Locations.Boundary];
+ matrix[(int) Locations.Interior, (int) Locations.Exterior] = other.matrix[(int) Locations.Interior, (int) Locations.Exterior];
+ matrix[(int) Locations.Boundary, (int) Locations.Interior] = other.matrix[(int) Locations.Boundary, (int) Locations.Interior];
+ matrix[(int) Locations.Boundary, (int) Locations.Boundary] = other.matrix[(int) Locations.Boundary, (int) Locations.Boundary];
+ matrix[(int) Locations.Boundary, (int) Locations.Exterior] = other.matrix[(int) Locations.Boundary, (int) Locations.Exterior];
+ matrix[(int) Locations.Exterior, (int) Locations.Interior] = other.matrix[(int) Locations.Exterior, (int) Locations.Interior];
+ matrix[(int) Locations.Exterior, (int) Locations.Boundary] = other.matrix[(int) Locations.Exterior, (int) Locations.Boundary];
+ matrix[(int) Locations.Exterior, (int) Locations.Exterior] = other.matrix[(int) Locations.Exterior, (int) Locations.Exterior];
}
+ ///
+ /// See methods Get(int, int) and Set(int, int, int value)
+ ///
+ public Dimensions this[Locations row, Locations column]
+ {
+ get
+ {
+ return Get(row, column);
+ }
+ set
+ {
+ Set(row, column, value);
+ }
+ }
+
///
/// Adds one matrix to another.
/// Addition is defined by taking the maximum dimension value of each position
@@ -70,9 +85,13 @@
/// The matrix to add.
public void Add(IntersectionMatrix im)
{
- for (int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
+ {
for (int j = 0; j < 3; j++)
- SetAtLeast((Locations) i, (Locations) j, im.Get((Locations) i, (Locations) j));
+ {
+ SetAtLeast((Locations) i, (Locations) j, im.Get((Locations) i, (Locations) j));
+ }
+ }
}
///
@@ -91,19 +110,31 @@
/// true if the dimension symbol encompasses the dimension value.
///
public static bool Matches(Dimensions actualDimensionValue, char requiredDimensionSymbol)
- {
+ {
if (requiredDimensionSymbol == '*')
- return true;
+ {
+ return true;
+ }
if (requiredDimensionSymbol == 'T' && (actualDimensionValue >= Dimensions.Point || actualDimensionValue == Dimensions.True))
- return true;
+ {
+ return true;
+ }
if (requiredDimensionSymbol == 'F' && actualDimensionValue == Dimensions.False)
- return true;
+ {
+ return true;
+ }
if (requiredDimensionSymbol == '0' && actualDimensionValue == Dimensions.Point)
- return true;
+ {
+ return true;
+ }
if (requiredDimensionSymbol == '1' && actualDimensionValue == Dimensions.Curve)
+ {
return true;
+ }
if (requiredDimensionSymbol == '2' && actualDimensionValue == Dimensions.Surface)
+ {
return true;
+ }
return false;
}
@@ -158,8 +189,8 @@
{
for (int i = 0; i < dimensionSymbols.Length; i++)
{
- int row = i / 3;
- int col = i % 3;
+ int row = i/3;
+ int col = i%3;
matrix[row, col] = Dimension.ToDimensionValue(dimensionSymbols[i]);
}
}
@@ -183,9 +214,11 @@
public void SetAtLeast(Locations row, Locations column, Dimensions minimumDimensionValue)
{
if (matrix[(int) row, (int) column] < minimumDimensionValue)
- matrix[(int) row, (int) column] = minimumDimensionValue;
+ {
+ matrix[(int) row, (int) column] = minimumDimensionValue;
+ }
}
-
+
///
/// If row >= 0 and column >= 0, changes the specified element to minimumDimensionValue
/// if the element is less. Does nothing if row is smaller to 0 or column is smaller to 0.
@@ -196,9 +229,11 @@
public void SetAtLeastIfValid(Locations row, Locations column, Dimensions minimumDimensionValue)
{
if (row >= Locations.Interior && column >= Locations.Interior)
- SetAtLeast(row, column, minimumDimensionValue);
+ {
+ SetAtLeast(row, column, minimumDimensionValue);
+ }
}
-
+
///
/// For each element in this , changes the
/// element to the corresponding minimum dimension symbol if the element is
@@ -213,8 +248,8 @@
{
for (int i = 0; i < minimumDimensionSymbols.Length; i++)
{
- int row = i / 3;
- int col = i % 3;
+ int row = i/3;
+ int col = i%3;
SetAtLeast((Locations) row, (Locations) col, Dimension.ToDimensionValue(minimumDimensionSymbols[i]));
}
}
@@ -229,8 +264,12 @@
public void SetAll(Dimensions dimensionValue)
{
for (int ai = 0; ai < 3; ai++)
- for (int bi = 0; bi < 3; bi++)
- matrix[ai, bi] = dimensionValue;
+ {
+ for (int bi = 0; bi < 3; bi++)
+ {
+ matrix[ai, bi] = dimensionValue;
+ }
+ }
}
///
@@ -252,21 +291,6 @@
}
///
- /// See methods Get(int, int) and Set(int, int, int value)
- ///
- public Dimensions this[Locations row, Locations column]
- {
- get
- {
- return Get(row, column);
- }
- set
- {
- Set(row, column, value);
- }
- }
-
- ///
/// Returns true if this is FF*FF****.
///
///
@@ -308,19 +332,23 @@
public bool IsTouches(Dimensions dimensionOfGeometryA, Dimensions dimensionOfGeometryB)
{
if (dimensionOfGeometryA > dimensionOfGeometryB)
+ {
//no need to get transpose because pattern matrix is symmetrical
- return IsTouches(dimensionOfGeometryB, dimensionOfGeometryA);
+ return IsTouches(dimensionOfGeometryB, dimensionOfGeometryA);
+ }
- if ((dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Surface) ||
- (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Curve) ||
- (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Surface) ||
- (dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Surface) ||
- (dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Curve))
+ if ((dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Surface) ||
+ (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Curve) ||
+ (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Surface) ||
+ (dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Surface) ||
+ (dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Curve))
+ {
return matrix[(int) Locations.Interior, (int) Locations.Interior] == Dimensions.False &&
- (Matches(matrix[(int) Locations.Interior, (int) Locations.Boundary], 'T') ||
- Matches(matrix[(int) Locations.Boundary, (int) Locations.Interior], 'T') ||
- Matches(matrix[(int) Locations.Boundary, (int) Locations.Boundary], 'T'));
-
+ (Matches(matrix[(int) Locations.Interior, (int) Locations.Boundary], 'T') ||
+ Matches(matrix[(int) Locations.Boundary, (int) Locations.Interior], 'T') ||
+ Matches(matrix[(int) Locations.Boundary, (int) Locations.Boundary], 'T'));
+ }
+
return false;
}
@@ -340,21 +368,27 @@
///
public bool IsCrosses(Dimensions dimensionOfGeometryA, Dimensions dimensionOfGeometryB)
{
- if ((dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Curve) ||
- (dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Surface) ||
- (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Surface))
+ if ((dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Curve) ||
+ (dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Surface) ||
+ (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Surface))
+ {
return Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
Matches(matrix[(int) Locations.Interior, (int) Locations.Exterior], 'T');
-
- if ((dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Point) ||
- (dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Point) ||
- (dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Curve))
+ }
+
+ if ((dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Point) ||
+ (dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Point) ||
+ (dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Curve))
+ {
return Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
Matches(matrix[(int) Locations.Exterior, (int) Locations.Interior], 'T');
-
- if (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Curve)
- return matrix[(int) Locations.Interior, (int) Locations.Interior] == 0;
-
+ }
+
+ if (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Curve)
+ {
+ return matrix[(int) Locations.Interior, (int) Locations.Interior] == 0;
+ }
+
return false;
}
@@ -365,9 +399,9 @@
/// true if the first is within the second.
public bool IsWithin()
{
- return Matches( matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
- matrix[(int) Locations.Interior, (int) Locations.Exterior] == Dimensions.False &&
- matrix[(int) Locations.Boundary, (int) Locations.Exterior] == Dimensions.False;
+ return Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
+ matrix[(int) Locations.Interior, (int) Locations.Exterior] == Dimensions.False &&
+ matrix[(int) Locations.Boundary, (int) Locations.Exterior] == Dimensions.False;
}
///
@@ -377,9 +411,9 @@
/// true if the first contains the second.
public bool IsContains()
{
- return Matches( matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
- matrix[(int) Locations.Exterior, (int) Locations.Interior] == Dimensions.False &&
- matrix[(int) Locations.Exterior, (int) Locations.Boundary] == Dimensions.False;
+ return Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
+ matrix[(int) Locations.Exterior, (int) Locations.Interior] == Dimensions.False &&
+ matrix[(int) Locations.Exterior, (int) Locations.Boundary] == Dimensions.False;
}
///
@@ -389,14 +423,14 @@
/// true if the first covers the second
public bool IsCovers()
{
- bool hasPointInCommon = Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T')
- || Matches(matrix[(int) Locations.Interior, (int) Locations.Boundary], 'T')
- || Matches(matrix[(int) Locations.Boundary, (int) Locations.Interior], 'T')
- || Matches(matrix[(int) Locations.Boundary, (int) Locations.Boundary], 'T');
+ bool hasPointInCommon = Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T')
+ || Matches(matrix[(int) Locations.Interior, (int) Locations.Boundary], 'T')
+ || Matches(matrix[(int) Locations.Boundary, (int) Locations.Interior], 'T')
+ || Matches(matrix[(int) Locations.Boundary, (int) Locations.Boundary], 'T');
return hasPointInCommon &&
- matrix[(int) Locations.Exterior, (int) Locations.Interior] == Dimensions.False &&
- matrix[(int) Locations.Exterior, (int) Locations.Boundary] == Dimensions.False;
+ matrix[(int) Locations.Exterior, (int) Locations.Interior] == Dimensions.False &&
+ matrix[(int) Locations.Exterior, (int) Locations.Boundary] == Dimensions.False;
}
///
@@ -413,13 +447,15 @@
public bool IsEquals(Dimensions dimensionOfGeometryA, Dimensions dimensionOfGeometryB)
{
if (dimensionOfGeometryA != dimensionOfGeometryB)
- return false;
+ {
+ return false;
+ }
- return Matches( matrix[(int) Locations.Interior,(int)Locations.Interior], 'T') &&
- matrix[(int) Locations.Exterior, (int) Locations.Interior] == Dimensions.False &&
- matrix[(int) Locations.Interior, (int) Locations.Exterior] == Dimensions.False &&
- matrix[(int) Locations.Exterior, (int) Locations.Boundary] == Dimensions.False &&
- matrix[(int) Locations.Boundary, (int) Locations.Exterior] == Dimensions.False;
+ return Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
+ matrix[(int) Locations.Exterior, (int) Locations.Interior] == Dimensions.False &&
+ matrix[(int) Locations.Interior, (int) Locations.Exterior] == Dimensions.False &&
+ matrix[(int) Locations.Exterior, (int) Locations.Boundary] == Dimensions.False &&
+ matrix[(int) Locations.Boundary, (int) Locations.Exterior] == Dimensions.False;
}
///
@@ -437,16 +473,20 @@
///
public bool IsOverlaps(Dimensions dimensionOfGeometryA, Dimensions dimensionOfGeometryB)
{
- if ((dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Point) ||
+ if ((dimensionOfGeometryA == Dimensions.Point && dimensionOfGeometryB == Dimensions.Point) ||
(dimensionOfGeometryA == Dimensions.Surface && dimensionOfGeometryB == Dimensions.Surface))
+ {
return Matches(matrix[(int) Locations.Interior, (int) Locations.Interior], 'T') &&
Matches(matrix[(int) Locations.Interior, (int) Locations.Exterior], 'T') &&
- Matches(matrix[(int) Locations.Exterior, (int) Locations.Interior], 'T');
+ Matches(matrix[(int) Locations.Exterior, (int) Locations.Interior], 'T');
+ }
if (dimensionOfGeometryA == Dimensions.Curve && dimensionOfGeometryB == Dimensions.Curve)
+ {
return matrix[(int) Locations.Interior, (int) Locations.Interior] == Dimensions.Curve &&
Matches(matrix[(int) Locations.Interior, (int) Locations.Exterior], 'T') &&
Matches(matrix[(int) Locations.Exterior, (int) Locations.Interior], 'T');
+ }
return false;
}
@@ -467,12 +507,20 @@
public bool Matches(string requiredDimensionSymbols)
{
if (requiredDimensionSymbols.Length != 9)
- throw new ArgumentException("Should be length 9: " + requiredDimensionSymbols);
+ {
+ throw new ArgumentException("Should be length 9: " + requiredDimensionSymbols);
+ }
- for (int ai = 0; ai < 3; ai++)
- for (int bi = 0; bi < 3; bi++)
- if (!Matches(matrix[ai, bi], requiredDimensionSymbols[3 * ai + bi]))
- return false;
+ for (int ai = 0; ai < 3; ai++)
+ {
+ for (int bi = 0; bi < 3; bi++)
+ {
+ if (!Matches(matrix[ai, bi], requiredDimensionSymbols[3*ai + bi]))
+ {
+ return false;
+ }
+ }
+ }
return true;
}
@@ -507,10 +555,14 @@
public override string ToString()
{
StringBuilder buf = new StringBuilder("123456789");
- for (int ai = 0; ai < 3; ai++)
- for (int bi = 0; bi < 3; bi++)
- buf[3 * ai + bi] = Dimension.ToDimensionSymbol((Dimensions)matrix[ai,bi]);
+ for (int ai = 0; ai < 3; ai++)
+ {
+ for (int bi = 0; bi < 3; bi++)
+ {
+ buf[3*ai + bi] = Dimension.ToDimensionSymbol((Dimensions) matrix[ai, bi]);
+ }
+ }
return buf.ToString();
}
}
-}
+}
\ No newline at end of file