AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia C# Herausfinden, ob Punkt in einem Bereich liegt
Thema durchsuchen
Ansicht
Themen-Optionen

Herausfinden, ob Punkt in einem Bereich liegt

Ein Thema von Dust Signs · begonnen am 30. Mai 2006 · letzter Beitrag vom 1. Jun 2006
Antwort Antwort
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#1

Herausfinden, ob Punkt in einem Bereich liegt

  Alt 30. Mai 2006, 16:10
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]
Miniaturansicht angehängter Grafiken
cmpxdemo_174.jpg  
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Herausfinden, ob Punkt in einem Bereich liegt

  Alt 30. Mai 2006, 16:13
Such mal nach Kollisionsabfrage, die Frage gab es imho schon öfters.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Herausfinden, ob Punkt in einem Bereich liegt

  Alt 30. Mai 2006, 16:19
Hi,

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#4

Re: Herausfinden, ob Punkt in einem Bereich liegt

  Alt 30. Mai 2006, 16:24
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
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
30. Mai 2006, 16:25
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Multimedia" verschoben.
Du sagst doch selbst C#
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#6

Re: Herausfinden, ob Punkt in einem Bereich liegt

  Alt 1. Jun 2006, 17:08
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
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz