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); } }
/// <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); }