예제 #1
0
        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);
        }