public static com.epl.geometry.Envelope2D GetMergedExtent(com.epl.geometry.Geometry geom1, com.epl.geometry.Envelope2D env2) { com.epl.geometry.Envelope2D env1 = new com.epl.geometry.Envelope2D(); geom1.QueryLooseEnvelope2D(env1); env1.Merge(env2); return(env1); }
internal virtual void CalculateEnvelope2D(com.epl.geometry.Envelope2D env, bool bExact) { env.SetEmpty(); com.epl.geometry.AttributeStreamOfDbl stream = (com.epl.geometry.AttributeStreamOfDbl)m_vertexAttributes[0]; com.epl.geometry.Point2D pt = new com.epl.geometry.Point2D(); for (int i = 0; i < m_pointCount; i++) { stream.Read(2 * i, pt); env.Merge(pt); } }
internal static com.epl.geometry.Geometry SymmetricDifference(com.epl.geometry.Geometry geometry_a, com.epl.geometry.Geometry geometry_b, com.epl.geometry.SpatialReference spatial_reference, com.epl.geometry.ProgressTracker progress_tracker) { int dim_a = geometry_a.GetDimension(); int dim_b = geometry_b.GetDimension(); if (geometry_a.IsEmpty() && geometry_b.IsEmpty()) { return(dim_a > dim_b ? geometry_a : geometry_b); } if (geometry_a.IsEmpty()) { return(geometry_b); } if (geometry_b.IsEmpty()) { return(geometry_a); } com.epl.geometry.Envelope2D env_a = new com.epl.geometry.Envelope2D(); com.epl.geometry.Envelope2D env_b = new com.epl.geometry.Envelope2D(); com.epl.geometry.Envelope2D env_merged = new com.epl.geometry.Envelope2D(); geometry_a.QueryEnvelope2D(env_a); geometry_b.QueryEnvelope2D(env_b); env_merged.SetCoords(env_a); env_merged.Merge(env_b); double tolerance = com.epl.geometry.InternalUtils.CalculateToleranceFromGeometry(spatial_reference, env_merged, false); int type_a = geometry_a.GetType().Value(); int type_b = geometry_b.GetType().Value(); if (type_a == com.epl.geometry.Geometry.GeometryType.Point && type_b == com.epl.geometry.Geometry.GeometryType.Point) { return(PointSymDiffPoint_((com.epl.geometry.Point)(geometry_a), (com.epl.geometry.Point)(geometry_b), tolerance, progress_tracker)); } if (type_a != type_b) { if (dim_a > 0 || dim_b > 0) { return(dim_a > dim_b ? geometry_a : geometry_b); } // Multi_point/Point case if (type_a == com.epl.geometry.Geometry.GeometryType.MultiPoint) { return(MultiPointSymDiffPoint_((com.epl.geometry.MultiPoint)(geometry_a), (com.epl.geometry.Point)(geometry_b), tolerance, progress_tracker)); } return(MultiPointSymDiffPoint_((com.epl.geometry.MultiPoint)(geometry_b), (com.epl.geometry.Point)(geometry_a), tolerance, progress_tracker)); } return(com.epl.geometry.TopologicalOperations.SymmetricDifference(geometry_a, geometry_b, spatial_reference, progress_tracker)); }
internal void StrokeDrawPolyPath(com.epl.geometry.SimpleRasterizer rasterizer, com.epl.geometry.MultiPathImpl polyPath, double tol) { com.epl.geometry.Point2D[] fan = new com.epl.geometry.Point2D[4]; for (int i = 0; i < fan.Length; i++) { fan[i] = new com.epl.geometry.Point2D(); } com.epl.geometry.SegmentIteratorImpl segIter = polyPath.QuerySegmentIterator(); double strokeHalfWidth = m_transform.Transform(tol) + 1.5; double shortSegment = 0.25; com.epl.geometry.Point2D vec = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D vecA = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D vecB = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D ptStart = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D ptEnd = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D prev_start = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D prev_end = new com.epl.geometry.Point2D(); double[] helper_xy_10_elm = new double[10]; com.epl.geometry.Envelope2D segEnv = new com.epl.geometry.Envelope2D(); com.epl.geometry.Point2D ptOld = new com.epl.geometry.Point2D(); while (segIter.NextPath()) { bool hasFan = false; bool first = true; ptOld.SetCoords(0, 0); while (segIter.HasNextSegment()) { com.epl.geometry.Segment seg = segIter.NextSegment(); ptStart.x = seg.GetStartX(); ptStart.y = seg.GetStartY(); ptEnd.x = seg.GetEndX(); ptEnd.y = seg.GetEndY(); segEnv.SetEmpty(); segEnv.Merge(ptStart.x, ptStart.y); segEnv.MergeNE(ptEnd.x, ptEnd.y); if (!m_geomEnv.IsIntersectingNE(segEnv)) { if (hasFan) { rasterizer.StartAddingEdges(); rasterizer.AddSegmentStroke(prev_start.x, prev_start.y, prev_end.x, prev_end.y, strokeHalfWidth, false, helper_xy_10_elm); rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); hasFan = false; } first = true; continue; } m_transform.Transform(ptEnd, ptEnd); if (first) { m_transform.Transform(ptStart, ptStart); ptOld.SetCoords(ptStart); first = false; } else { ptStart.SetCoords(ptOld); } prev_start.SetCoords(ptStart); prev_end.SetCoords(ptEnd); rasterizer.StartAddingEdges(); hasFan = !rasterizer.AddSegmentStroke(prev_start.x, prev_start.y, prev_end.x, prev_end.y, strokeHalfWidth, true, helper_xy_10_elm); rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); if (!hasFan) { ptOld.SetCoords(prev_end); } } if (hasFan) { rasterizer.StartAddingEdges(); hasFan = !rasterizer.AddSegmentStroke(prev_start.x, prev_start.y, prev_end.x, prev_end.y, strokeHalfWidth, false, helper_xy_10_elm); rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); } } }
internal static com.epl.geometry.Geometry Difference(com.epl.geometry.Geometry geometry_a, com.epl.geometry.Geometry geometry_b, com.epl.geometry.SpatialReference spatial_reference, com.epl.geometry.ProgressTracker progress_tracker) { if (geometry_a.IsEmpty() || geometry_b.IsEmpty()) { return(geometry_a); } int dimension_a = geometry_a.GetDimension(); int dimension_b = geometry_b.GetDimension(); if (dimension_a > dimension_b) { return(geometry_a); } int type_a = geometry_a.GetType().Value(); int type_b = geometry_b.GetType().Value(); com.epl.geometry.Envelope2D env_a = new com.epl.geometry.Envelope2D(); com.epl.geometry.Envelope2D env_b = new com.epl.geometry.Envelope2D(); com.epl.geometry.Envelope2D env_merged = new com.epl.geometry.Envelope2D(); geometry_a.QueryEnvelope2D(env_a); geometry_b.QueryEnvelope2D(env_b); env_merged.SetCoords(env_a); env_merged.Merge(env_b); double tolerance = com.epl.geometry.InternalUtils.CalculateToleranceFromGeometry(spatial_reference, env_merged, false); double tolerance_cluster = tolerance * System.Math.Sqrt(2.0) * 1.00001; com.epl.geometry.Envelope2D env_a_inflated = new com.epl.geometry.Envelope2D(); env_a_inflated.SetCoords(env_a); env_a_inflated.Inflate(tolerance_cluster, tolerance_cluster); // inflate // by // cluster // tolerance if (!env_a_inflated.IsIntersecting(env_b)) { return(geometry_a); } if (dimension_a == 1 && dimension_b == 2) { return(PolylineMinusArea_(geometry_a, geometry_b, type_b, spatial_reference, progress_tracker)); } if (type_a == com.epl.geometry.Geometry.GeometryType.Point) { com.epl.geometry.Geometry geometry_b_; if (com.epl.geometry.MultiPath.IsSegment(type_b)) { geometry_b_ = new com.epl.geometry.Polyline(geometry_b.GetDescription()); ((com.epl.geometry.Polyline)(geometry_b_)).AddSegment((com.epl.geometry.Segment)(geometry_b), true); } else { geometry_b_ = geometry_b; } switch (type_b) { case com.epl.geometry.Geometry.GeometryType.Polygon: { return(PointMinusPolygon_((com.epl.geometry.Point)(geometry_a), (com.epl.geometry.Polygon)(geometry_b_), tolerance, progress_tracker)); } case com.epl.geometry.Geometry.GeometryType.Polyline: { return(PointMinusPolyline_((com.epl.geometry.Point)(geometry_a), (com.epl.geometry.Polyline)(geometry_b_), tolerance, progress_tracker)); } case com.epl.geometry.Geometry.GeometryType.MultiPoint: { return(PointMinusMultiPoint_((com.epl.geometry.Point)(geometry_a), (com.epl.geometry.MultiPoint)(geometry_b_), tolerance, progress_tracker)); } case com.epl.geometry.Geometry.GeometryType.Envelope: { return(PointMinusEnvelope_((com.epl.geometry.Point)(geometry_a), (com.epl.geometry.Envelope)(geometry_b_), tolerance, progress_tracker)); } case com.epl.geometry.Geometry.GeometryType.Point: { return(PointMinusPoint_((com.epl.geometry.Point)(geometry_a), (com.epl.geometry.Point)(geometry_b_), tolerance, progress_tracker)); } default: { throw new System.ArgumentException(); } } } else { if (type_a == com.epl.geometry.Geometry.GeometryType.MultiPoint) { switch (type_b) { case com.epl.geometry.Geometry.GeometryType.Polygon: { return(MultiPointMinusPolygon_((com.epl.geometry.MultiPoint)(geometry_a), (com.epl.geometry.Polygon)(geometry_b), tolerance, progress_tracker)); } case com.epl.geometry.Geometry.GeometryType.Envelope: { return(MultiPointMinusEnvelope_((com.epl.geometry.MultiPoint)(geometry_a), (com.epl.geometry.Envelope)(geometry_b), tolerance, progress_tracker)); } case com.epl.geometry.Geometry.GeometryType.Point: { return(MultiPointMinusPoint_((com.epl.geometry.MultiPoint)(geometry_a), (com.epl.geometry.Point)(geometry_b), tolerance, progress_tracker)); } default: { break; } } } } return(com.epl.geometry.TopologicalOperations.Difference(geometry_a, geometry_b, spatial_reference, progress_tracker)); }
public virtual void Merge(com.epl.geometry.Point2D pt) { _touch(); m_envelope.Merge(pt); }