private bool showLine() { ArrayList usableCurves = new ArrayList(); // ArrayList usablePoints = new ArrayList(); double mindist = double.MaxValue; for (int i = 0; i < tangCurves.Length; ++i) { Plane pl; int solCount = 0; if (Curves.GetCommonPlane(startPoint, tangCurves[i], out pl)) { ICurve2D l2D = tangCurves[i].GetProjectedCurve(pl); if (l2D is Path2D) { (l2D as Path2D).Flatten(); } GeoPoint2D[] tangentPoints = l2D.TangentPoints(pl.Project(startPoint), pl.Project(objectPoint)); //!!! if (tangentPoints.Length > 0) { // eine gültige Kurve ist gefunden solCount = tangentPoints.Length; usableCurves.Add(tangCurves[i]); // zur lokalen Liste zufügen for (int j = 0; j < tangentPoints.Length; ++j) { double dist = Geometry.Dist(tangentPoints[j], pl.Project(objectPoint)); if (dist < mindist) { mindist = dist; selected = usableCurves.Count - 1; // merken, welche Kurve die aktuell benutzte ist // die Punkte werden als sortiert erwartet!! Hier nur über modulo (%) den Index bestimmen endPoint = tangentPoints[Math.Abs(selSol) % tangentPoints.Length]; } } } } if (mindist < double.MaxValue) { base.MultiSolutionCount = solCount; line.SetTwoPoints(startPoint, pl.ToGlobal(endPoint)); tangCurves = (ICurve[])usableCurves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert base.ShowActiveObject = true; return(true); } } base.MultiSolutionCount = 0; line.SetTwoPoints(startPoint, objectPoint); base.ShowActiveObject = true; return(false); }