Feedback

C# - Gerade einkürzen

Veröffentlicht von am 7/17/2014
(0 Bewertungen)
Beim zeichnen von Mathematischen Konstruktionen in Windows Store Apps (WPF und Co. natürlich auch), kann man schnell sehr lange Linien erhalten. Diese werden häufig nicht ordentlich gerendert.
Diese Methode ermöglicht es eine Gerade (welche durch 2 Punkte verläuft) auf den sichtbaren Bereich einzukürzen.

Benötigte Namespaces für Windows Store Apps
System
Windows.Foundation
/// <summary>
/// Ermittelt die Schnittpunkte eines Rahmens mit einer Gerade, welche durch 2 andere Punkte gezogen wird.
/// </summary>
/// <param name="p1">Der erste Punkt, durch den die Gerade verläuft.</param>
/// <param name="p2">Der zweite Punkt, durch den die Gerade verläuft.</param>
/// <param name="view">Der Rahmen, in dem die Linie angezeigt werden soll.</param>
/// <returns>Ein <see cref="System.Tuple{T1,T2}"/> mit den 2 Punkten, zwischen denen die Gerade verlaufen muss um in <paramref name="view"/> sichtbar zu sein.</returns>
/// <remarks>Sollten <paramref name="p1"/> und <paramref name="p2"/> übereinstimmen oder die Gerade nicht durch <paramref name="view"/> verlaufen, 
/// werden die <see cref="Windows.Foundation.Point"/> Instanzen im Ergebnis auf den selben Punkt, links oberhalb von <paramref name="view"/> verweisen.</remarks>
static Tuple<Point, Point> ChangePointsIntoView(Point p1, Point p2, Rect view)
{
    Point[] result = new Point[2];
    if (p1.X == p2.X)
    {
        if (p1.Y != p2.Y)
        {
            //vertical line
            result[0] = new Point(p1.X, view.Top);
            result[1] = new Point(p2.X, view.Bottom);
        }
        else//p1==p2 > hide line in the top left corner
            result[0] = result[1] = new Point(view.Left - 1, view.Top - 1);
    }
    else
    {
        //determine the term of the linear function
        var m = (p1.Y - p2.Y) / (p1.X - p2.X);
        var n = p1.Y - m * p1.X;

        //determine the intersection points (the other coordinate is given by the view parameter)
        var x1 = (view.Top - n) / m;//top
        var x2 = (view.Bottom - n) / m;//bottom
        var y1 = m * view.Left + n;//left
        var y2 = m * view.Right + n;//right

        int i = 0;
        if (x1 >= view.Left && x1 <= view.Right)
            result[i++] = new Point(x1, view.Top);
        if (x2 >= view.Left && x2 <= view.Right)
            result[i++] = new Point(x2, view.Bottom);
        if (y1 >= view.Top && y1 <= view.Bottom && i < 2)
            result[i++] = new Point(view.Left, y1);
        if (y2 >= view.Top && y2 <= view.Bottom && i < 2)
            result[i++] = new Point(view.Right, y2);

        if (i < 2)//only 0 or 1 intersection points with view > hide line in the top left corner
            result[0] = result[1] = new Point(view.Left - 1, view.Top - 1);
    }
    return Tuple.Create(result[0], result[1]);
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!