Sprache: C#
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.
[b]Benötigte Namespaces für Windows Store Apps[/b]
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]);
}
/// <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]);
}
Alte URL:
/snippet/gerade-einkuerzen/4891