Esempio n. 1
0
 internal ParabolaProperty(IArcSegment3D parabolicArc)
 {
     Matrix  = new Matrix44();
     IsValid = CalculateParabolaProperty(parabolicArc);
     if (!IsValid)
     {
         var seg = new ArcSegment3D(parabolicArc.StartPoint, parabolicArc.IntermedPoint, parabolicArc.EndPoint);
         ParabolaLength = GeomOperation.GetLength(seg);
     }
 }
Esempio n. 2
0
        /// <summary>
        /// Remove segment[index], adaptes geometry so that shorter segment changes positions
        /// </summary>
        /// <param name="index">Segment index</param>
        public void RemoveAtAdaptShorter(int index)
        {
            int segmentCount = segments.Count;

            if (index == -1)
            {
                throw new ArgumentException("Segment is not included in polyline");
            }

            bool isClosed = IsClosed;

            //if (isClosed || !(index == 0) || !(index == segmentCount - 1))
            if (isClosed || ((index != 0) && (index != segmentCount - 1)))
            {
                if (segmentCount > 2)
                {
                    ISegment3D prevSegment;
                    ISegment3D nextSegment;

                    if (index == 0)
                    {
                        prevSegment = segments[segmentCount - 1];
                        nextSegment = segments[1];
                    }
                    else if (index == segmentCount - 1)
                    {
                        prevSegment = segments[index - 1];
                        nextSegment = segments[0];
                    }
                    else
                    {
                        prevSegment = segments[index - 1];
                        nextSegment = segments[index + 1];
                    }

                    double prevLength = GeomOperation.GetLength(prevSegment);
                    double nextLength = GeomOperation.GetLength(nextSegment);

                    if (prevLength < nextLength)
                    {
                        prevSegment.EndPoint = nextSegment.StartPoint;
                    }
                    else
                    {
                        nextSegment.StartPoint = prevSegment.EndPoint;
                    }
                }
            }

            UnsubscribeEventsFromSegment(segments[index]);
            segments.RemoveAt(index);
        }