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