Rechtecke finden

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Joh
Lazarusforum e. V.
Beiträge: 288
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Rechtecke finden

Beitrag von Joh »

Ich habe hier
Joh hat geschrieben: So 21. Apr 2024, 17:01
ein Bild einer ähh, Familienstruktur gepostet.
Jetzt ziehe ich ein Auswahlrechteck auf und möchte alle Objekte (Familienmitglieder; Rechtecke), die innerhalb meines Auswahlrechteckes liegen finden...

Aber wie?

Klar: einfach ist, wenn ich alle Elemente markiere, deren Punkt links oben innerhalb der Auswahl ist...
Das bekomme ich hin. (Abgesehen davon, das ich RoundedRectangels benutze und von daher eigentlich keinen oberen linken Punkt habe :( )
Aber was ist mit rechts unten oder nur eine Übereinstimmung in der Mitte?

Wie bekomme ich Teilmengen oder Schnittmengen von Rechtecken programmatisch erfasst?

Klar kann ich jeden Punkt der Objekte checken, quasi
for i = 0 to Objekt.Width do
for j = 0 to Objekt.Height do
if (objekt.left + i) >= Auswahl.links... etc.

Aber nee, das geht nicht; dann lieber wie manche anderen Programme: nur die Objekte auswählen, die komplett im Rahmen liegen; also x1, y1 und x2, y2 des Objektes im Auswahlrechteck.

Oder gibts da doch eine bessere Idee?
just my two Beer

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Rechtecke finden

Beitrag von Niesi »

Wenn Du RoundedRectangle benutzt und den Radius als Grenze ansiehst, dann wird es schwieriger, ganz klar. Ist aber auch "nur" Mathematik.

Ansonsten müssen die Objekte ja auch jeweils x, y, width und height haben. Damit kannst Du berechnen, ob ein Objekt komplett im Auswahlrechteck x1, y1, x2, y2 (oder x1, y1, w1, h1) liegt oder zum Teil drin ist oder gar nicht. Bei LibreCAD ist es so, dass ein Auswahlrechteck, welches von links nach rechts aufgezogen wird, alle Objekte aktiviert, die komplett im Auswahlrechteck sind. Auswahlrechtecke von links nach rechts aktivieren auch Objekte, die nur teilweise im Auswahlrechteck liegen.

Bei RoundedRectangle musst Du halt jeweils x1ra, y1ra, x1re, y1re und den Viertelkreis berechnen, ermitteln, welch Objekte drin oder draußen sind - das ist machbar, aber aufwändig.

Mach Dir dazu Zeichnungen, LibreCAD ist dazu gut geeignet, LibreOffice Draw geht aber auch ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
theo
Beiträge: 10919
Registriert: Mo 11. Sep 2006, 19:01

Re: Rechtecke finden

Beitrag von theo »

So ganz verstehe ich deine Situation nicht, möchte aber auf folgende Funktionen hinweisen:

PtInRect
IntersectRect
UnionRect
IsRectEmpty

S.a. etc.
https://www.freepascal.org/docs-html/3. ... nrect.html

Joh
Lazarusforum e. V.
Beiträge: 288
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Rechtecke finden

Beitrag von Joh »

Niesi hat geschrieben: Sa 11. Mai 2024, 07:16 Wenn Du RoundedRectangle benutzt und den Radius als Grenze ansiehst, dann wird es schwieriger, ganz klar. Ist aber auch "nur" Mathematik.
...
Bei RoundedRectangle musst Du halt jeweils x1ra, y1ra, x1re, y1re und den Viertelkreis berechnen, ermitteln, welch Objekte drin oder draußen sind - das ist machbar, aber aufwändig.
Danke. Da in diesem Projekt die rechteckige Mausauswahl eher nebensächlich ist (ich wollte sie mal drin haben), werde ich jetzt hingehen und nur checken, ob das komplette Rechteck in der Auswahl liegt. damit ist auch das RoundedRectangle sauber abgehakt. Ohne Viertelkreise berechnen und checken.

Ich hatte eigentlich gehofft, das es dafür fertige Routinen gibt. Vieles, was ich eigentlich zu Fuß programmiere steckt in Lazarus ja schon in der einen oder anderen Unit...
just my two Beer

Joh
Lazarusforum e. V.
Beiträge: 288
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Rechtecke finden

Beitrag von Joh »

theo hat geschrieben: Sa 11. Mai 2024, 12:16 PtInRect
IntersectRect
UnionRect
IsRectEmpty
Danke. Die hatte ich gesucht und nicht gefunden.

PS. Da hat sich deine Antwort mit meiner auf Niesi überschnitten.
just my two Beer

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Rechtecke finden

Beitrag von Mathias »

Ich habe mal sowas ähnliche mit Panels gemacht.
Die Panels könnten einzelne Element in einem Grafikprogramm darstellen.
Dateianhänge
Fensterverwaltung_00.zip
(4.02 KiB) 34-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten