Für alle, die es interessiert: ich hab eine Lösung für das Problem gefunden (vielen Dank an BenBE für den Ansatz): man nimmt alle Seiten des Rechtecks als Vektoren an (also AB, BC, CD, DA) und macht von jedem Eckpunkt einen Vektor zum Punkt (AP, BP, CP, DP). Nun macht man die Vektorprodukte AB*AP, BC*BP, CD*CP, DA*DP und schaut, ob eines davon negativ ist - dann liegt der Punkt außerhalb, ansonsten innerhalb. Die Idee dahinter ist die Formel für den Winkel zwischen zwei Vektoren - der Betrag ist hier nicht interessant, es geht nur um's Vorzeichen, daher wird der Betrag hier auch nicht berechnet. Hab leider kein passendes Programm, um das zeichnen zu können, aber mit einer Zeichnung wird das klarer - es ist wirklich nicht schwer.
Wen der C#-Code interessiert:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| public static bool PointInSelectionBorder(PointF Point, PointF[] SelectionBorder) { for (int i = 0; i < SelectionBorder.Length; i++) { NormVector BorderVector = new NormVector(SelectionBorder[i == SelectionBorder.Length - 1 ? 0 : i + 1].X - SelectionBorder[i].X, SelectionBorder[i == SelectionBorder.Length - 1 ? 0 : i + 1].Y - SelectionBorder[i].Y); NormVector PointVector = new NormVector(Point.X - SelectionBorder[i].X, Point.Y - SelectionBorder[i].Y); double VectorProduct = BorderVector.X * PointVector.X + BorderVector.Y * PointVector.Y; if (VectorProduct < 0) return false; } return true; } |
NormVector ist hierbei ein Typ, der einfach nur die Koordinaten X und Y speichert.
AXMD