public Polygon TwoPieces(Polygon polygon1, Polygon polygon2, LineString line1, LineString line2) { if (polygon1.Intersects(polygon2) || polygon1.Touches(polygon2)) { return polygon1.Union(polygon2) as Polygon; } else { var pg = GetConvexHull(line1, line2); return pg.Union(polygon1).Union(polygon2) as Polygon; } }
/// <summary> /// Returns true if the element intersect the rectangle from the parent class /// </summary> /// <param name="rect">The rectangle to test must be in the virtual modeling coordinant plane</param> /// <returns></returns> public virtual bool ElementInRectangle(Rectangle rect) { IGeometry rectanglePoly; if ((rect.Height == 0) && (rect.Width == 0)) { rectanglePoly = new Topology.Point(rect.X, rect.Y); } else if (rect.Width == 0) { Topology.Point[] rectanglePoints = new Topology.Point[2]; rectanglePoints[0] = new Topology.Point(rect.X, rect.Y); rectanglePoints[1] = new Topology.Point(rect.X, rect.Y + rect.Height); rectanglePoly = new LineString(rectanglePoints); } else if (rect.Height == 0) { Topology.Point[] rectanglePoints = new Topology.Point[2]; rectanglePoints[0] = new Topology.Point(rect.X, rect.Y); rectanglePoints[1] = new Topology.Point(rect.X + rect.Width, rect.Y); rectanglePoly = new LineString(rectanglePoints); } else { Topology.Point[] rectanglePoints = new Topology.Point[5]; rectanglePoints[0] = new Topology.Point(rect.X, rect.Y); rectanglePoints[1] = new Topology.Point(rect.X, rect.Y + rect.Height); rectanglePoints[2] = new Topology.Point(rect.X + rect.Width, rect.Y + rect.Height); rectanglePoints[3] = new Topology.Point(rect.X + rect.Width, rect.Y); rectanglePoints[4] = new Topology.Point(rect.X, rect.Y); rectanglePoly = new Polygon(new LinearRing(rectanglePoints)); } switch (Shape) { case ModelShape.Rectangle: return (rect.IntersectsWith(Rectangle)); case ModelShape.Ellipse: int b = Height / 2; int a = Width / 2; Topology.Point[] ellipsePoints = new Topology.Point[(4 * a) + 1]; for (int x = -a; x <= a; x++) { if (x == 0) { ellipsePoints[x + a] = new Topology.Point(Location.X + x + a, Location.Y); ellipsePoints[3 * a - x] = new Topology.Point(Location.X + x + a, Location.Y + Height); } else { ellipsePoints[x + a] = new Topology.Point(Location.X + x + a, Location.Y + b - Math.Sqrt(Math.Abs(((b * b * x * x) / (a * a)) - (b * b)))); ellipsePoints[3 * a - x] = new Topology.Point(Location.X + x + a, Location.Y + b + Math.Sqrt(Math.Abs(((b * b * x * x) / (a * a)) - (b * b)))); } } Polygon ellipsePoly = new Polygon(new LinearRing(ellipsePoints)); return (ellipsePoly.Intersects(rectanglePoly)); case ModelShape.Triangle: Topology.Point[] trianglePoints = new Topology.Point[4]; trianglePoints[0] = new Topology.Point(Location.X, Location.Y); trianglePoints[1] = new Topology.Point(Location.X, Location.Y + Height); trianglePoints[2] = new Topology.Point(Location.X + Width - 5, Location.Y + ((Height - 5) / 2)); trianglePoints[3] = new Topology.Point(Location.X, Location.Y); Polygon trianglePoly = new Polygon(new LinearRing(trianglePoints)); return (trianglePoly.Intersects(rectanglePoly)); default: return false; } }