Ejemplo n.º 1
0
        private bool showLine()
        {
            ArrayList usableCurves = new ArrayList(); // lokales Array, das die gültigen Kurven sammelt
            double    mindist      = double.MaxValue;

            for (int i = 0; i < tangCurves.Length; ++i)
            {
                Plane  pl;
                double lineAngle;
                if (Curves.GetCommonPlane(objectPoint, tangCurves[i], out pl))
                {
                    ICurve2D l2D = tangCurves[i].GetProjectedCurve(pl);
                    if (l2D is Path2D)
                    {
                        (l2D as Path2D).Flatten();
                    }
                    lineAngle = pl.Project(lineDir).Angle; // 2D-Winkel aus der Richtung erzeugen
                    GeoPoint2D[] tangentPoints = l2D.TangentPointsToAngle(lineAngle, pl.Project(objectPoint));
                    if (tangentPoints.Length > 0)
                    {   // eine gültige Kurve ist gefunden
                        usableCurves.Add(tangCurves[i]);
                        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
                                startPoint2D = tangentPoints[j];
                            }
                        }
                    }
                }
                if (mindist < double.MaxValue)
                {
                    if (!linePositionMiddle)
                    {
                        startPoint = pl.ToGlobal(startPoint2D);
                        endPoint   = startPoint + lineLength * lineDir;
                    }
                    else
                    {
                        startPoint = pl.ToGlobal(startPoint2D) - (lineLength / 2.0) * lineDir;
                        endPoint   = pl.ToGlobal(startPoint2D) + (lineLength / 2.0) * lineDir;
                    }
                    line.SetTwoPoints(startPoint, endPoint);
                    tangCurves     = (ICurve[])usableCurves.ToArray(typeof(ICurve)); // tangCurves wird mit den gültigen überschrieben und unten zur Anzeige zurückgegeben an den Sender
                    base.BasePoint = pl.ToGlobal(startPoint2D);
                    //					base.BasePoint = line.StartPoint;
                    return(true);
                }
            }
            // hier Prototyp-Darstellung:
            if (!linePositionMiddle)
            {
                startPoint = base.BasePoint;
                endPoint   = startPoint + lineLength * lineDir;
            }
            else
            {
                startPoint = base.BasePoint - (lineLength / 2.0) * lineDir;
                endPoint   = base.BasePoint + (lineLength / 2.0) * lineDir;
            }
            //			startPoint = base.BasePoint;
            //			endPoint = startPoint+lineLength*lineDir;
            line.SetTwoPoints(startPoint, endPoint);
            return(false);
        }