Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   C# Herausfinden, ob Punkt in einem Bereich liegt (https://www.delphipraxis.net/70451-herausfinden-ob-punkt-einem-bereich-liegt.html)

Dust Signs 30. Mai 2006 15:10


Herausfinden, ob Punkt in einem Bereich liegt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Ich suche nach einer Routine, mit der ich herausfinden kann, ob ein Punkt in einem bestimmten Bereich liegt. Recherchen in der MSDN haben auf System.Drawing.Region hingewiesen - so weit, so gut. Allerdings finde ich keine Routine, mit der ich herausfinden kann, ob ein Punkt in dieser Region liegt.
Konkret geht es um ein "schiefes" Rechteck (um einen bestimmten Winkel gedreht) - ich muss herausfinden, ob ein Mausklick auf eine Grafik innerhalb dieses Rechtecks (siehe Grafik, halbtransparenter Bereich) liegt oder nicht. Gibt es da eine Methode? In Delphi gab es PtInRect für "normale" Rechtecke...

Dust Signs

PS. Crosspost CSF

[edit=sakura] C# als Fragebereich definiert. Mfg, sakura[/edit]

MrKnogge 30. Mai 2006 15:13

Re: Herausfinden, ob Punkt in einem Bereich liegt
 
Such mal nach Kollisionsabfrage, die Frage gab es imho schon öfters.

Hawkeye219 30. Mai 2006 15:19

Re: Herausfinden, ob Punkt in einem Bereich liegt
 
Hi,

dieser Thread könnte interessant für dich sein.

Gruß Hawkeye

Dust Signs 30. Mai 2006 15:24

Re: Herausfinden, ob Punkt in einem Bereich liegt
 
Zitat:

Zitat von Hawkeye219
Hi,

dieser Thread könnte interessant für dich sein.

Gruß Hawkeye

Sieht sehr interessant aus, allerdings habe ich vergessen zu erwähnen, dass das ganze in C# sein soll (da es dort PtInRegion eben nicht gibt (und auch nichts ähnliches), suche ich einen mathematischen Ansatz dafür, das zu lösen - also quasi PtInRegion ausprogrammiert ;))

Dust Signs

//EDIT: Hab ich ja ganz übersehn, dass ihr eine C#-Sparte habt :wall:

DP-Maintenance 30. Mai 2006 15:25

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Multimedia" verschoben.
Du sagst doch selbst C# :zwinker:

Dust Signs 1. Jun 2006 16:08

Re: Herausfinden, ob Punkt in einem Bereich liegt
 
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:

Code:
        /// <summary>
        /// Determines if the specified point is within the given selection border
        /// </summary>
        /// <param name="Point">Point (px)</param>
        /// <param name="SelectionBorder">Selection border coordinates (px)</param>
        /// <returns>True if the point is within the specified points, false if it is not</returns>
        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); //Vector from current selection border point to the next one
                NormVector PointVector = new NormVector(Point.X - SelectionBorder[i].X, Point.Y - SelectionBorder[i].Y); //Vector from current selection border point to Point
                double VectorProduct = BorderVector.X * PointVector.X + BorderVector.Y * PointVector.Y;
                if (VectorProduct < 0) //If vector product is negative, angle between BorderVector and PointVector is negative,...
                    return false; //...so Point is outside SelectionBorder => return false
            }
            return true; //If all vector products are positive, Point is in SelectionBorder => return true
        }
NormVector ist hierbei ein Typ, der einfach nur die Koordinaten X und Y speichert.

Dust Signs

//EDIT: diverse Formatierungsprobleme mit dem Code :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz