AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi selbsterstellte Canvas-Objecte sollen sich nicht überschneid
Thema durchsuchen
Ansicht
Themen-Optionen

selbsterstellte Canvas-Objecte sollen sich nicht überschneid

Ein Thema von Delphi-Noobie · begonnen am 1. Dez 2004 · letzter Beitrag vom 2. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
Delphi-Noobie

Registriert seit: 28. Nov 2003
102 Beiträge
 
#1

selbsterstellte Canvas-Objecte sollen sich nicht überschneid

  Alt 1. Dez 2004, 20:15
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
Wieviel Lösungen hat die Gleichung x^13=1? .... 13!
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#2

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 1. Dez 2004, 20:26
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Delphi-Noobie

Registriert seit: 28. Nov 2003
102 Beiträge
 
#3

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 1. Dez 2004, 20:52
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?
Wieviel Lösungen hat die Gleichung x^13=1? .... 13!
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#4

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 1. Dez 2004, 20:57
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
  Mit Zitat antworten Zitat
Delphi-Noobie

Registriert seit: 28. Nov 2003
102 Beiträge
 
#5

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 2. Dez 2004, 17:44
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?
Wieviel Lösungen hat die Gleichung x^13=1? .... 13!
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#6

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 2. Dez 2004, 17:48
ich glaube da must du ein dynamisches array nehmen und das zur laufzeit so groß Setten.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Delphi-Noobie

Registriert seit: 28. Nov 2003
102 Beiträge
 
#7

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 2. Dez 2004, 18:16
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?
Wieviel Lösungen hat die Gleichung x^13=1? .... 13!
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#8

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 2. Dez 2004, 18:23
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.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Delphi-Noobie

Registriert seit: 28. Nov 2003
102 Beiträge
 
#9

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 2. Dez 2004, 19:40
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?
Wieviel Lösungen hat die Gleichung x^13=1? .... 13!
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#10

Re: selbsterstellte Canvas-Objecte sollen sich nicht übersch

  Alt 2. Dez 2004, 19:46
Du könntest schrittweise die Breite des 2. Hauses verkleinern, wenn es sich mit einem zweiten überschneidet, bis es das nicht mehr tut.
Julian J. Pracht
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15: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