public static Polygon CreateRectInstance(Rectangle shape, List<MeshNode> nodesToUse, List<Polygon> polygons) { MeshNode leftUpper = null; MeshNode rightUpper = null; MeshNode rightLower = null; MeshNode leftLower = null; foreach(MeshNode node in nodesToUse) { // ReSharper disable CompareOfFloatsByEqualityOperator // I expect all node coordinates to be rounding-error-free if (node.mVector.X == shape.X && node.mVector.Y == shape.Y) leftUpper = node; if (node.mVector.X == shape.X+shape.Width && node.mVector.Y == shape.Y) rightUpper = node; if (node.mVector.X == shape.X+shape.Width && node.mVector.Y == shape.Y+shape.Height) rightLower = node; if (node.mVector.X == shape.X && node.mVector.Y == shape.Y+shape.Height) leftLower = node; // ReSharper restore CompareOfFloatsByEqualityOperator } if (leftUpper == null) { leftUpper = new MeshNode(shape.X, shape.Y); nodesToUse.Add(leftUpper); foreach (Polygon polygon in polygons) polygon.TrySplit(leftUpper); } if (rightUpper == null) { rightUpper = new MeshNode(shape.X+shape.Width, shape.Y); nodesToUse.Add(rightUpper); foreach (Polygon polygon in polygons) polygon.TrySplit(rightUpper); } if (rightLower == null) { rightLower = new MeshNode(shape.X+shape.Width, shape.Y+shape.Height); nodesToUse.Add(rightLower); foreach (Polygon polygon in polygons) polygon.TrySplit(rightLower); } if (leftLower == null) { leftLower = new MeshNode(shape.X, shape.Y+shape.Height); nodesToUse.Add(leftLower); foreach (Polygon polygon in polygons) polygon.TrySplit(leftLower); } Polygon result = new Polygon(new List<MeshNode> {leftUpper, rightUpper, rightLower, leftLower}); foreach (MeshNode node in nodesToUse) result.TrySplit(node); return result; }