AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Echte" Sichtbarkeitsprüfung

Ein Thema von DGL-luke · begonnen am 16. Apr 2006 · letzter Beitrag vom 16. Apr 2006
Antwort Antwort
Benutzerbild von DGL-luke
DGL-luke

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

"Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 20:21
Moin moin,

für mein aktuelles Projekt versuche ich herauszufinden, ob ein Fenster sich in einem bestimmten Bereich befindet. Allerdings ist das ganze ein wenig verzwickter, ich hab da nämlich noch ein boolean, das sagt "soll im bereich sein" bzw. sagt "soll nicht im bereich sein".

Ich zeige mal ein wenig code...

Delphi-Quellcode:
GetWindowRect(handle,r);
IntersectRect(ir,r,area);
intersectspace := abs((ir.Right - ir.Left) * (ir.Bottom - ir.Top));

if ((intersectspace >= puffer) xor IsValidSpace) then
  begin
    machwas;
  end;
ich rechne also zuerst das schnittrechteck zwischen dem zu überprüfenden bereich und dem fenster aus. dann den flächeninhalt dieses rechtecks. wenn der größer ist als ein bestimmter puffer, ist das fenster im bereich.

Wenn das Boolean IsValidSpace wahr ist UND das fenter sich im bereich befindet, dann ist für mich alles ok, und es muss nichts gemacht werden.

Am besten mach ich mal ne wahrheitstabelle...

Code:
A = "fenster im bereich?"
B = "Bereich valide?"
C = "Muss ich was tun?"

1 = wahr
0 = falsch

A|B|C
-+-+-
0|0|0 => fenster ist nicht im nicht validen bereich => alles ok
0|1|1 => fenster ist nicht im validen bereich => was tun!
1|0|1 => fenster ist im nicht-validen bereich => was tun!
1|1|0 => fenster ist im validen bereich => alles ok
Das ist doch eindeutig ein Fall für eine XOR-Verknüpfung, oder?
Warum funktioniert es dann nicht? Ich bekomme ziemlich unerklärliche (wenn auch reproduzierbare^^) Ergebnisse.
Mach ich beim Schneiden irgendwas falsch?
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
Hawkeye219

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

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 20:32
Hallo Lukas,

GetWindowRect liefert Bildschirmkoordinaten. Befinden sich in der Variablen area vielleicht lokale Koordinaten, welche erst in Bildschirmkoordinaten umgerechnet werden müssen?

Gruß Hawkeye
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 20:36
Hallo Lukas,

deine Flächenberechnung solltest du davon abhängig machen, ob das Rechteck ir leer ist:

Delphi-Quellcode:
begin
  // ...
  if not IsRectEmpty(ir) then
    if ((intersectspace >= puffer) xor IsValidSpace) then
    begin
      machwas;
    end;
  // ...
end;
Ostergrüße vom marabu
  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
 
#4

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 20:39
@hawkeye: nein. Kann ich ausschließen. area ist normalerweise der gesamte Bildschirm, also 0|0-1024|768 oder ähnlich.

@marabu: werd ich probieren... aber wenn es leer ist, heisst das doch nur, dass der erste teil false ergibt, also "nicht im bereich" -> as expected...

EDIT: das muss sogar mit aufgenommen werden. denn wenn das rect leer ist und IsValidSpace true, also "nicht im validen Bereich", will ich ja was machen.
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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 20:50
Zitat von DGL-luke:
aber wenn es leer ist, heisst das doch nur, dass der erste teil false ergibt
Würde ich so nicht behaupten wollen:

Delphi-Quellcode:
function InterSectRect(var rect: TRect; const r1, r2: TRect): Boolean;
begin
  rect.Left := Max(r1.Left, r2.Left);
  rect.Top := Max(r1.Top, r2.Top);
  rect.Right := Min(r1.Right, r2.Right );
  rect.Bottom := Min(r1.Bottom, r2.Bottom);
  Result := (rect.Left <= rect.Right) and (rect.Top <= rect.Bottom);
end;
Durch deinen Einsatz von Abs() ignorierst du die Bedingung für ein leeres Rechteck.

Zitat von DGL-luke:
das muss sogar mit aufgenommen werden. denn wenn das rect leer ist und IsValidSpace true, ... will ich ja was machen.
Okay, dann so:

Delphi-Quellcode:
begin
  // ...
  if IsRectEmpty(ir)
    then intersectspace := 0
    else intersectspace := abs((ir.Right - ir.Left) * (ir.Bottom - ir.Top));
 
  if ((intersectspace >= puffer) xor IsValidSpace) then
  begin
    machwas;
  end;
  // ...
end;
marabu
  Mit Zitat antworten Zitat
Hawkeye219

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

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 21:04
@marabu:
Jetzt hast Du ja doch noch Deinen InterSectRect-Algorithmus verraten! 3_of_8 wird sich freuen.

Falls Lukas aber die Routine aus Windows.pas nimmt, dann gilt das hier:

Zitat von Win32 Programmer's Reference:
If the source rectangles do not intersect, an empty rectangle (in which all coordinates are set to zero) is placed into the destination rectangle.
Vielleicht sollte er das mal prüfen. Möglicherweise benutzt er ja eine andere Routine und erwartet ein leeres Rechteck bei sich nicht überschneidenen Rechtecken.

Gruß Hawkeye
  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
 
#7

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 21:07
Zitat:
Überlappen sich R1 und R2 nicht, gibt IntersectRect false zurück und dem Parameter Rect wird ein Rechteck mit der Position (0,0), der Breite 0 und der Höhe 0 zugewiesen.
Belügt mich da die Delphi-OH?! Wohl eher die als dein Source-Code(hab ja keine vcl-sourcen)...

hab das jetzt so nachgebildet:

Delphi-Quellcode:
if not IntersectRect(ir,r,area) then
    begin
      ir.left := 0;
      ir.Top := 0;
      ir.Right := 0;
      ir.Bottom := 0;
    end;
und dann folgerichtig meinen anfänglichen code wieder eingetragen:

Delphi-Quellcode:
intersectspace := abs((ir.Right - ir.Left) * (ir.Bottom - ir.Top));

if ((intersectspace > 50) xor IsValidSpace) then
  begin
    machwas;
  end;
Kurioserweise bekomme ich jetzt nur die Borland-IDE und die Anwendung selbst in machwas geliefert (das ist ein teil einer EnumWindowsProc)...

//roter Kasten:
Ja, genau....
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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 21:21
Zitat von DGL-luke:
Belügt mich da die Delphi-OH?! Wohl eher die als dein Source-Code(hab ja keine vcl-sourcen)...
Ist meine Implementierung von IntersectRect. Delphi kapselt lediglich die gleichnamige API Funktion. Ich hatte mich wohl zu sehr von dem hier leiten lassen:

Im PSDK steht
The IsRectEmpty function determines whether the specified rectangle is empty. A empty rectangle is one that has no area; that is, the coordinate of the right side is less than or equal to the coordinate of the left side, or the coordinate of the bottom side is less than or equal to the coordinate of the top side.

Jetzt bin ich auch etwas ratlos. Werde mal drüber schlafen.

Zitat von Hawkeye219:
Jetzt hast Du ja doch noch Deinen InterSectRect-Algorithmus verraten! 3_of_8 wird sich freuen.
Ob er es merkt? Und selbst wenn - ob er es dann auch erklären kann?

marabu
  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
 
#9

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 21:36
OK, dann is das klar.

Ich werd jetzt meinen Code noch mal von anfang an aufziehen.

Inzwischen hab ich auch die Abfrage geändert:

Delphi-Quellcode:
if (inspace and (not spacevalid)) or ((not inspace) and spacevalid) then
    machwas;
das sollte ja hoffentlich funktionieren... (oder schlägt da eh die compiler-optimierung zu? )
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 DGL-luke
DGL-luke

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

Re: "Echte" Sichtbarkeitsprüfung

  Alt 16. Apr 2006, 23:02
Sodele... hab das jetzt gelöst. Der relevante Code:
Delphi-Quellcode:
GetWindowRect(handle,wr);

  //wenn das fenster die Höhe/Breite 0 hat, ist es offensichtlich kein
  //relevantes fenster.
  if (wr.Right = wr.Left) or (wr.Bottom = wr.Top) or
     ((wr.Left = -32000) and Form1.CBSkipMaximized.Checked) then
    Exit;

if (IntersectRect(ir,wr,Form1.area) xor Form1.RBValid.Checked) then
    Form1.ListBox1.AddItem(c,TObject(handle));
Hab den Puffer einfach rausgenommen.

So einfach isses

Tut wunderbar.. hab übrigens nicht deine Intersectrect hergenommen.

Haben maximierte Fenster eigentlich immer das offset (-32000|-32000) ?!

Den kompletten Code gibts hier: http://www.delphipraxis.net/internal...ct.php?t=80732
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
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 17:49 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