// Segment internal uint Intersect(IPointGeometry start, IPointGeometry end) { ILineSegmentGeometry seg = new LineSegmentGeometry(start, end); return m_IntersectedObject.LineGeometry.IntersectSegment(this, seg); }
internal void Draw() { ISpatialDisplay display = m_Cmd.ActiveDisplay; // Draw the line we're extending in a special colour (any highlighting it // originally had should have been removed during LineExtensionControl_Load) if (m_ExtendLine!=null) m_ExtendLine.Draw(display, Color.DarkBlue); // If we're doing an update, draw the original extension in grey. LineExtensionOperation pop = UpdateOp; if (pop!=null) { LineFeature origLine = pop.NewLine; if (origLine!=null) origLine.Draw(display, Color.Gray); PointFeature origPoint = pop.NewPoint; if (origPoint!=null) origPoint.Draw(display, Color.Gray); } // Calculate the start and end points of the extension, initially // assuming that it's a straight line extension. IPosition start, end; if (LineExtensionUI.Calculate(m_ExtendLine, m_IsExtendFromEnd, m_Length, out start, out end)) { // Draw the straight extension line IDrawStyle style = (m_WantLine ? new DrawStyle(Color.Magenta) : new DottedStyle(Color.Magenta)); LineSegmentGeometry seg = new LineSegmentGeometry(start, end); seg.Render(display, style); } else { // Perhaps it's a circular arc ... IPosition center; bool iscw; if (LineExtensionUI.Calculate(m_ExtendLine, m_IsExtendFromEnd, m_Length, out start, out end, out center, out iscw)) { // And draw the curve. IDrawStyle style = (m_WantLine ? new DrawStyle(Color.Magenta) : new DottedStyle(Color.Magenta)); IPointGeometry c = PointGeometry.Create(center); CircularArcGeometry arc = new CircularArcGeometry(c, start, end, iscw); arc.Render(display, style); } else if (m_ExtendLine!=null) { // Get the position we're extending from. end = (m_IsExtendFromEnd ? m_ExtendLine.EndPoint : m_ExtendLine.StartPoint); } } // If we actually got something, draw the end point. if (end!=null) { IDrawStyle style = m_Cmd.Controller.DrawStyle; style.FillColor = Color.Magenta; style.Render(display, end); } }
/// <summary> /// Checks whether this closed shape intersects (overlaps) a line. /// This assumes that a window-window overlap has already been checked for. /// </summary> /// <param name="line">The line to compare with the shape</param> /// <returns>True if intersection found.</returns> bool IsIntersect(LineGeometry line) { //IntersectionResult xres = new IntersectionResult(line); //return (xres.IntersectMultiSegment(this) > 0); IntersectionResult xres = new IntersectionResult(line); // Intersect each segment of this shape with the line. IPointGeometry[] data = this.Data; for (int i=1; i<data.Length; i++) { LineSegmentGeometry thisSeg = new LineSegmentGeometry(data[i-1], data[i]); if (xres.IntersectSegment(thisSeg) > 0) return true; } return false; }
public void Render(ISpatialDisplay display, IDrawStyle style) { LineSegmentGeometry.Render(this, display, style); }
public ILength Distance(IPosition point) { return(LineSegmentGeometry.GetDistance(this, point)); }
/// <summary> /// Obtains the geometry for spans along this leg. /// </summary> /// <param name="pos">The position for the start of the leg. /// <param name="bearing">The bearing of the leg.</param> /// <param name="sfac">Scale factor to apply to distances.</param> /// <param name="spans">Information for the spans coinciding with this leg.</param> /// <returns>The sections along this leg</returns> internal override ILineGeometry[] GetSpanSections(IPosition pos, double bearing, double sfac, SpanInfo[] spans) { var result = new ILineGeometry[spans.Length]; // A leg with just one span, but no observed distance is due to the fact that the Leg constructor // that accepts a span count will always produce an array with at least one span (this covers cul-de-sacs // defined only with a central angle). May be better to handle it there. if (spans.Length == 1 && spans[0].ObservedDistance == null) { result[0] = new LineSegmentGeometry(pos, pos); return result; } double sinBearing = Math.Sin(bearing); double cosBearing = Math.Cos(bearing); IPosition sPos = pos; IPosition ePos = null; double edist = 0.0; for (int i = 0; i < result.Length; i++, sPos=ePos) { edist += (spans[i].ObservedDistance.Meters * sfac); ePos = new Position(pos.X + (edist * sinBearing), pos.Y + (edist * cosBearing)); result[i] = new LineSegmentGeometry(sPos, ePos); } return result; }