Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi selbsterstellte Canvas-Objecte sollen sich nicht überschneid (https://www.delphipraxis.net/35049-selbsterstellte-canvas-objecte-sollen-sich-nicht-ueberschneid.html)

Delphi-Noobie 1. Dez 2004 20:15


selbsterstellte Canvas-Objecte sollen sich nicht überschneid
 
hi, ich hab ne unit geschrieben, die ein haus mit canvas auf einem Formular erzeugt, dazu werden 3 werte übergeben (x1,y1, breite des hauses). Jetzt werden die häuser mit randombreiten erstellt. Wie kann ich abfangen, dass die häuser sich überschneiden, jedoch jeder vorhandene Platz auf dem Formular genutz wird? Hier mal der Code:
Code:
var t:integer = 0;
    q,w,e:array[0..100000] of integer; // zum speichern der Koordinaten im randomfall

implementation

constructor Thaus.create(a:Tform;zx,zy,zbreite:integer);
var g:integer;
begin
zx := (zx div 30) * 30;  // das geht nur, wenn zbreite immer konstant ist, hier 30
zy := (zy div 45) * 45 ; // das haus is zbreite breit und zbreite + zbreite div 2 hoch
q[t]:=zx;
w[t]:=zy;
e[t]:=zbreite;
for g:=t-1 downto 0 do begin
if ((q[g] = zx) and (w[g] = zy)) // dadurch werden sie nicht am selben Punkt nochmal erstellt
then begin inc(v); a.Caption:=inttostr(v)+ ' Häuser konnten nicht erstellt werden, da sie sich überlagern würden!!'; exit; end; /
end;
inc(t);
end;
gemalt wird das haus natürlich mit einer anderen procedure. Er soll jetzt aber immer ein Haus an einer freien Stelle erstellen können bei random breiten, abhängig von der größe von zbreite, die sich nicht überschneiden. Hab keine Peilung wie ich das machen soll :(

supermuckl 1. Dez 2004 20:26

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
mach ne schleife, wo du immer zuerst kontrollierst, ob der random place auch nicht mit einem anderen haus kollidiert ( alle häuser speichern in einer liste irgendwie )
und wenn es überlappen sollte, nochmal random und wieder überprüfen usw

geht auch noch eleganter. aber ich will ja nicht alles verraten

Delphi-Noobie 1. Dez 2004 20:52

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
aha und wie mach ich nochmal random? dann muss ja im constructor irgendwo stehen, wenn er sich überlappt, dann constructe nochmal? Und wie krieg ich generell raus, ob sich ein haus überschneidet? Muss ich da gucken ob der Pixel auf einem anderen liegt? kann man irgendwie Prüfen, ob ein Punkt in einer Fläche von einem Polygon liegt oder so?

Pr0g 1. Dez 2004 20:57

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
Du könntest ein Array anlegen, in welchem du für jedes Haus, wleches schon vorhanden ist, die Position und Maße speicherst (Stichwort: Record). Nun machst du eine bspw. eine While Schleife und wiederholst das Erstellen der Zufallszahl, Überprüfen der Fläche und ggf. Zeichen der Häuser bis alles voll ist. Musst nur gucken, dass die Schleife nicht endlos läuft.

MfG Pr0g

Delphi-Noobie 2. Dez 2004 17:44

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
ok ich würde die Positionen im Array speichern aber wie kann ich nen extrem großes Array machen, da er bei dem hier immer abstürzt
Code:
procedure TForm1.Button1Click(Sender: TObject);
var a:array[0..1024,0..1024] of integer;
begin
a[0,0] := 1;
end;
Dann kommt Stackoverflow. gibt es größere arrays?

supermuckl 2. Dez 2004 17:48

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
ich glaube da must du ein dynamisches array nehmen und das zur laufzeit so groß Setten.

Delphi-Noobie 2. Dez 2004 18:16

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
hmm klappt irgendwie net :(
Code:
procedure TForm1.Button1Click(Sender: TObject);
var a:array of array of integer;
begin
setlength(a,1024*1024);
a[0,0]:=2;
end;
Kommt ne Fehlermeldung. Aber was is da falsch?

supermuckl 2. Dez 2004 18:23

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
Du hast Setlength falsch benutzt.

Da du ein 2 dimensionales Array nicht mit einem einzigen Befehl setzen kannst, musst du jedes der 1024 "spalten" mit wiederum 1024 "zeilen" setten.

Also mit einer Schleife.
In der DP findest du genug Threads wo sowas schoneinmal gemacht wurde.

Delphi-Noobie 2. Dez 2004 19:40

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
oki das klappt jetzt aber das sie sich nicht überscheieden immer noch nicht :(
Code:
constructor Thaus.create(a:Tform;zx,zy,zbreite:integer);
var g,n,m,o,p,s:integer;
begin
q[t]:=zx;
w[t]:=zy;
e[t]:=zbreite;

for s:=0 to 1024 do begin
  SetLength(b,s+1);
  SetLength(b[s],1025);
end;

for n:=zx to zx + zbreite do begin
for m:=zy - zbreite-(zbreite div 2) to zy do begin // wenn irgendein Pixel belegt, dann abbrechen
if b[n,m] = 1 then
exit;
end;
end;

for o:=zx to zx+zbreite do begin
for p:=zy- zbreite-(zbreite div 2) to zy do begin // soll alle Pixel die belegt sind durchlaufen und              
                                                  // den arraywert 1 setzen
b[o,p] := 1;
end;
end;
inc(t);
end;
Der Code klappt aber nicht :( er createt fröhlich überall hin wo er will, woran liegt das?

Ultimator 2. Dez 2004 19:46

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
 
Du könntest schrittweise die Breite des 2. Hauses verkleinern, wenn es sich mit einem zweiten überschneidet, bis es das nicht mehr tut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.
Seite 1 von 2  1 2      

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