Autor |
Beitrag |
Nagelbrett
      
Beiträge: 75
|
Verfasst: Mo 18.10.04 09:27
Ich bin gerade zu blöd zum Denken scheint mir.. jedenfalls: ich möchte prüfen, ob sich zwei Rechtecke schneiden. Dabei sollen auch die Fälle, dass ein Rechteck das andere vollständig umschließt, nicht unberücksichtigt bleiben. Die Eckpunkte der Rechtecke sind bekannt... wie stellt man das mit dem wenigsten Programmieraufwand am günstigsten an? gibt es da irgend eine geschickte Möglichkeit..
oder muss ich da im schlimmsten Fall wirklich für alle Eckpunkte beider Rechtecke prüfen, ob sie sich jeweils innerhalb des anderen Rechtecks befinden? denn wenn ein Rechteck das andere umschließt, nützt es mir nichts, das nur für 1 Rechteck zu tun... etc.
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Mo 18.10.04 09:34
Annahme: Ungedrehte, also waagerechte Rechtecke. Es reicht, wenn du zwei gegenüberliegende Eckpunkte nimmst, da dann alle Ausmaße des jeweiligen Rechtecks berücksichtigt sind. Dann schreibst du eine Routine, die prüft, ob ein Punkt zwischen zwei anderen liegt (sowohl in X- als auch in Y-Richtung). Liegt ein Punkt von Rechteck 1 zwischen den gegenüberliegenden Ecken von Rechteck 2, so überschneiden sie sich. Liegen beide Punkte dazwischen, so wird es von Rechteck 2 umschlossen.
Gruß,
Jörg
PS: Hausaufgabenverdacht. 
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
Nagelbrett 
      
Beiträge: 75
|
Verfasst: Mo 18.10.04 09:44
ja die Rechtecke befinden sich natürlich in einer Ebene, also wir reden von 2D hier (falls du das mit ungedreht meintest)
und nein, es sind keine Hausaufgaben.. ich brauch das für ein privates Projekt
aber danke erstmal, klingt logisch, ich werds mal so ausprobieren 
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Mo 18.10.04 09:51
Nagelbrett hat folgendes geschrieben: | ja die Rechtecke befinden sich natürlich in einer Ebene, also wir reden von 2D hier (falls du das mit ungedreht meintest) |
Von der Ebene bin ich sowieso mal ausgegangen. Mit ungedreht meinte ich Rechtecke, wie man z.B. mit Canvas.Rectangle zeichnet. Also zwei Seiten waagerecht, zwei Seiten senkrecht, nicht irgendwie schräg.
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 18.10.04 09:56
Wenn ich .Chef richtig verstanden habe, meint er mit ungedreht, dass bei beiden Rechtecken die Seiten parallel sind. Ein Rechteck hat sowieso parallele Seiten. Die sind dann aber aúch noch parallel zu 2 Seiten des anderen Rechtecks.
Quelltext 1: 2: 3: 4: 5: 6: 7:
| Etwa so: -------- | | | ----------------- | | | | | ----------------- -------- |
Und nicht, dass eins davon "schräg" liegt.
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Mo 18.10.04 09:59
Jup, haste schön gebastelt. 
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 18.10.04 10:01
Oh, Danke. *verlegen nach unten gucken*
|
|
Nagelbrett 
      
Beiträge: 75
|
Verfasst: Mo 18.10.04 10:03
Jup passt schon, sie sind auch nicht schräg.. und es funktioniert auch schon wie gewollt.
Also danke nochmal, hat sich dann erledigt hier 
|
|
Nagelbrett 
      
Beiträge: 75
|
Verfasst: Mo 18.10.04 10:59
Kommando zurück.. ich hab gerade noch einen Fall gefunden, für den es noch nicht ganz klappt.
Erstmal wie ichs jetzt habe: ich prüfe jeweils 2 gegenüberliegende Ecken eines jeden Rechtecks, ob sie zwischen zwei gegenüberliegenden des anderen Rechtecks liegen. Dabei prüfe ich beim 1. Rechteck die obere linke/untere rechte und beim 2. dann obere rechte/untere linke, damit da auch nichts ausgelassen wird.
Funktioniert auch fast immer, aber wenn nun folgender Fall eintritt:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| ---- | | --| |-- | | | | --| |-- | | ---- | dann springt die Sache nicht an... ja auch logisch, hier liegt KEINE Ecke wirklich zwischen zwei gegenüberliegenden des anderen Rechtecks (sowohl für x als auch y Werte betrachtet, wie du's oben ja sagtest)...
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Mo 18.10.04 11:05
Ich hab das oben nicht als UND- sondern als ODER-Verknüpfung der Bedingungen gemeint. Und im vorliegenden Fall liegen dann die Y-Koordinaten des hinteren Rechtecks zwischen denen des vorderen, nicht aber die X-Koordinaten. Wie auch immer, war vielleicht blöd ausgedrückt. Das nächste Mal schreib ich gleich den Source her. 
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
Nagelbrett 
      
Beiträge: 75
|
Verfasst: Mo 18.10.04 11:22
Hmmmm, ja moment.. jetzt hast du mich völlig verwirrt
Sorry, dass ich so schwierig bin  aber.. wenn ich da eine ODER Verknüpfung nehme, dann funktioniert das ganze doch überhaupt nicht mehr.. oder hab ich irgendwas falsch verstanden? könntest du bitte nochmal etwas detaillierter beschreiben, wie genau ich da vorgehen muss, wenn ich meine Prüfungsroutine auf ODER getrimmt hab?
Denn wenn ich einen Punkt von Rechteck 1 hernehme.. und schau ob er sich in X ODER Y Richtung zwischen den 2 gegenüberliegenden des anderen Rechtecks befindet, dann bin ich irgendwie noch nicht wirklich weiter...
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 18.10.04 12:23
Also:
Angenommen, unsere zwei Vierecke setzen sich aus jeweils zwei Punkten mit wiederum jeweils X- und Y-Koordinate zusammen.
Delphi-Quelltext 1: 2: 3: 4:
| TMeinRechteck=record P1:TPoint; P2:TPoint; end; |
Für jedes Rechteck gelte
P1.X<P2.X and P1.Y<P2.Y
Dann gilt für zwei Rechtecke A und B vom Typ TMeinRechteck, daß sie sich dann überschneiden, wenn gilt:
Delphi-Quelltext 1: 2: 3: 4: 5:
| function Overlapping(const A,B:TMeinRechteck):Boolean; begin Result:=((B.P1.X<A.P2.X) and(A.P1.X<B.P2.X)) and ((B.P1.Y<A.P2.Y) and(A.P1.Y<B.P2.Y)); end; |
Cu,
Udontknow
|
|
Nagelbrett 
      
Beiträge: 75
|
Verfasst: Mo 18.10.04 23:23
Tatsächlich, das funktioniert.
Da ist zwar jetzt auch keine Oder-Verknüpfung drin, aber nun gut.. Danke jedenfalls! 
|
|