AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Überprüfung, ob sich Rechtecke schneiden
Thema durchsuchen
Ansicht
Themen-Optionen

Überprüfung, ob sich Rechtecke schneiden

Ein Thema von Nikolas · begonnen am 27. Jun 2007 · letzter Beitrag vom 1. Jul 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#11

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 28. Jun 2007, 10:38
Du kannst das Problem vereinfachen: Prüfe für jeden der 8 Punkte, ob er sich im jeweils anderen Rechteck befindet. Falls das bei einem der Fall ist, schneiden sie sich. Falls das bei allen nicht der fall ist, schneiden sie sich nicht. (gibt es nicht sogar ein PtInRect Funktion?)
Ob das die performateste Lösung ist, weis ich jetzt nicht, aber nach den bounding circles dürften ja eh nicht mehr soviele berechnungen gemacht werden
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 28. Jun 2007, 10:43
oh, damit stellt sich das Problem natürlich ganz anders dar. Mit in der HInsicht gedrehten Sachen hatte ich nicht gerechnet.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#13

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 28. Jun 2007, 12:05
Zitat:
Du kannst das Problem vereinfachen: Prüfe für jeden der 8 Punkte, ob er sich im jeweils anderen Rechteck befindet. Falls das bei einem der Fall ist, schneiden sie sich. Falls das bei allen nicht der fall ist, schneiden sie sich nicht.
Leider auch nicht. Leg mal ein langes Lineal auf ein Blatt Papier, so dass keine Ecke des Papiers bedeckt ist.

Zitat:
Mit in der HInsicht gedrehten Sachen hatte ich nicht gerechnet.
Alles andere ist trivial, da hätte ich kein Problem..
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Hawkeye219

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

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 28. Jun 2007, 19:18
Hallo Nikolas,

wenn du keine rein mathematische Lösung mehr findest, kannst du auch auf die Regionen-Befehle der WinAPI ausweichen:

Delphi-Quellcode:
function RectPolygonIntersect (const R: TRect; const P: array of TPoint): Boolean;
var
  RectRgn : HRGN;
  PolyRgn : HRGN;
begin
  RectRgn := CreateRectRgnIndirect(R);
  PolyRgn := CreatePolygonRgn(P[0], Length(P), WINDING);
  Result := (CombineRgn(RectRgn, RectRgn, PolyRgn, RGN_AND) <> NULLREGION);
  DeleteObject(PolyRgn);
  DeleteObject(RectRgn);
end;
Sollte sich diese Lösung als zu langsam erweisen, hilft vielleicht ein vorgeschalteter BoundingBox-Test, so wie es bereits in den vorigen Beiträgen vorgeschlagen wurde.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Clobber the mob

Registriert seit: 28. Jan 2007
11 Beiträge
 
#15

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 29. Jun 2007, 08:12
Delphi-Quellcode:
procedure blub (...);
var
  Overlay: TRect;

begin
if IntersectRect (Overlay, Rect1.BoundsRect, Rect2.BoundsRect) then
  begin
   .
   .
   .
  end;
end;
Wär das ne Möglichkeit=?
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#16

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 29. Jun 2007, 09:25
Ich hab heute keinen Windowsrechner, von da her kann ich zu dem Intersect Rect nichts sagen. Könnte vielleicht jemand den Quellcode oder wenigstens den HilfeEintrag hier posten.
// Ich hab die Hilfe gefunden. Die Funktion erwartet Rechtecke, deren Achsen parallel zu den Koordinatenachsen sind. Deswegen hilft mir die Funktion überhaupt nicht.


Als kleine Fiesigkeit der Tutoren darf ich mein geliebtes Pascal nicht einsetzen, sondern muss C++ schreiben, so dass ich die Funktion umschreiben müsste.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#17

Re: Überprüfung, ob sich Rechtecke schneiden

  Alt 1. Jul 2007, 13:36
Hier mal meine Lösung:

Mit dem Drehwinkel des zweiten Rechtecks kann ich die unterste Ecke bestimmen (oder auch die untersten Ecken im Fall von z.B. winkel=0)
Wenn dann z.B. die y-Komponente der Geschwindigkeit kleiner als Null ist, schneide ich die Halbgerade, die entsteht, wenn ich den Richtungsvektor an die unterste Ecke hänge, mit der oberen Kante meines stehenden Rechtecks.

Wenn aber die y-Komponente positiv ist, schneide ich die übernachste Ecke nach der untersten mit der unteren Seite des stehenden Rechtecks.

Egal wie zweite Rechteck gedreht ist, schneide ich maximal 4 halbgeraden. (z.B. dann wenn das Rechteck nicht gedreht ist und von oben links auf das stehende prallt. Dann kann die untere linke und rechts ecke mit der oberen kante zusammenstoßen, aber auch die rechte obere und untere mit der linken Seite des Rechtecks.

Insgesamt also nicht allzu viel Aufwand.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:29 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