![]() |
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:
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 :(
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; |
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 |
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?
|
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 |
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:
Dann kommt Stackoverflow. gibt es größere arrays?
procedure TForm1.Button1Click(Sender: TObject);
var a:array[0..1024,0..1024] of integer; begin a[0,0] := 1; end; |
Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
ich glaube da must du ein dynamisches array nehmen und das zur laufzeit so groß Setten.
|
Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
hmm klappt irgendwie net :(
Code:
Kommt ne Fehlermeldung. Aber was is da falsch?
procedure TForm1.Button1Click(Sender: TObject);
var a:array of array of integer; begin setlength(a,1024*1024); a[0,0]:=2; end; |
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. |
Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch
oki das klappt jetzt aber das sie sich nicht überscheieden immer noch nicht :(
Code:
Der Code klappt aber nicht :( er createt fröhlich überall hin wo er will, woran liegt das?
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; |
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 02:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz