// 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;
        }
Exemple #4
0
 public void Render(ISpatialDisplay display, IDrawStyle style)
 {
     LineSegmentGeometry.Render(this, display, style);
 }
Exemple #5
0
 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;
        }