AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Rechtecke überlagern sich beim zufälligen erstellen ?
Thema durchsuchen
Ansicht
Themen-Optionen

Rechtecke überlagern sich beim zufälligen erstellen ?

Ein Thema von mimi · begonnen am 29. Jan 2006 · letzter Beitrag vom 2. Feb 2006
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 29. Jan 2006, 14:53
Hallo,
ich habe es mit meinem eignen code nicht und mit einem code aus disem forum auch nicht hinbekommen.
Ich möchte gerne das meine bilder zufällig auf ein TBitMap verteielt werden und dabei ist zu berücksichtigen:
Es darf kein andres Objekt auf der Position sein
Und es darf nicht auserhalb des angeben Rechteckes sein.
ich habe hier die proceduren und funktionen die dafür verantwortlich sind rein kopiert:
Delphi-Quellcode:
// Diese hier habe ich aus dem forum
function RectIntersect(A, B: TRect; Offset: Integer): Boolean;
begin
  result := not((A.Right + Offset <= B.Left) or
                (A.Bottom + Offset <= B.Top) or
                (A.Top - Offset >= B.Bottom) or
                (A.Left - Offset >= B.Right));
end;
// -----------------------

function TForm1.Kollision(rect:TRect):Boolean;
var
  i:Integer;
  r1:TRect;
begin
  result:=False;
  for i := 0 to High(Items) do begin
    r1.Left:=Items[i].x; r1.Top:=Items[i].y;
    r1.Right:=Items[i].w; r1.Bottom:=Items[i].h;
    if RectIntersect(r1,rect, 100) then begin
      result:=True;
     // break;
    end;
  end;
end;
// hier kommt die anwendung
function TForm1.Zufall(px,py,w,h,index:Integer):TPoint;
var
  x,y,z:Integer;
  i,r:Boolean;
begin

  x:=px; y:=py; z:=0;
// px:=px*w; py:=py*h;

  i:=CheckCollision(px,py,w,h,index);//CheckCollision(x*w,y*h,w,h,index);
  Label3.Caption:=BoolToStr(i,True);

  if (i = False) or (x < 0) or (y <0) or (x > 640) or (y >240) then begin
    repeat
      x:=random(640-w);
      y:=random(280-h);
      inc(z);
      r:=CheckCollision(x,y,w,h,index);
    until (r = False) or (z = 5);
  end;
  ListBox1.Items.Add(IntToStr(Index)+ '\'+ IntToStr(x) + '\' + IntToStr(y));
  result.X:=x;
  result.Y:=y;
end;
// und hier noch mal meine eigne:
function TForm1.GetItemIndex(px,py,pw,ph,Index:Integer):Integer;
var
  i:Integer;
  t:Integer;
  g:TRect;
begin
  ListBox2.items.Clear;
  t:=-1;
  Label1.Caption:='';
  for i:=0 to HIGH(Items) do begin
    with Items[i] do begin
         ListBox2.Items.Add(IntTostr(x) + '\' + IntToStr(y));

      if (typ <> 4) and (typ <> 1) and (PlayerIndex <> i) then begin
// if PtInRect(Rect(x,y,w,h),Point(px,py)) = True then begin
         if IntersectRect(g,rect(x,y,w,h),rect(px,py,pw,ph)) = True then begin
                 Label1.Caption:=InttoStr(x)+'\'+IntToStr(y) + '\'+ IntToStr(Random(4));
         // if (px >=x) and ( py>=y) and (px <=x+pw) and (py <=y+ph)then begin
// if (x >=px) and (y >=py) and (x <=px+pw) and (y <=py+ph) and (PlayerIndex <> i) then begin

          t:=i;
          break;
        end;
      end;
    end;
  end;
  result:=t;
end;
das problem dabei ist bei diesem code überlagen sich teilweise die Grafiken übereinander und ich weiß einfach nicht warum. Habe hier im forum gesucht letzte woche saß ich stunden vor diesem Problem, habe aber leider keine lösung gefunden !
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
marabu

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

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 29. Jan 2006, 20:29
Hallo Michael,

ich habe heute wohl schon zuviel Code gesehen, deshalb nur ein paar Anmerkungen:
  • Windows kennt bereits eine Funktion IntersectRect().
  • Soweit ich erkennen kann schmeißt du ein Bild auf die Fläche und wenn es eines der vorher dort drapierten Bilder überlappt, dann wirfst du nochmal. Nicht sehr effektiv. Jedes platzierte Bild bestimmt neue Freiflächen, die für ein kollisionsfreies Platzieren der restlichen Bilder geeignet oder ungeeignet sind.
    Ich würde anders vorgehen. Ich würde die Bilder so eng wie möglich aneinander schmiegen und zum Schluß jedes Bild auf einer radialen Achse um einen Zufallswert nach außen verschieben.
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 30. Jan 2006, 07:22
die Windows Funktion verwende ich bereits !
Deine Idee ist nicht schlecht. Nur ich weiß immer noch nicht warum sich die Rechecke überlappen
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
marabu

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

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 30. Jan 2006, 07:56
Das könnte daran liegen, dass du in deiner Methode Kollision() die Vergleichsrechtecke falsch initialisierst:

Delphi-Quellcode:
// ...
  for i := 0 to High(Items) do
  begin
    r1.Left := Items[i].x;
    r1.Top := Items[i].y;
    r1.Right := Pred(Items[i].w + r1.Left);
    r1.Bottom := Pred(Items[i].h + r1.Top);
// ...
marabu
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 30. Jan 2006, 08:06
Hallo mimi,

dein Code ist ein bisschen unübersichtlich und es fehlen Teile (z.B. die Funktion CheckCollision) als dass man eine gesicherte Aussage machen kann.
Aber ich denke ein Grund dafür könnte sein, dass deine repeat..until Schleife, in der du ja versuchst, einen passenden ("freien") Punkt zu finden, insgesamt nur fünf mal durchlaufen wird. Wenn du danach in x und y Werte stehen hast, die eigentlich zu einer Kollision führen, liefert dir die Methode Zufall dennoch diese Werte zurück.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 30. Jan 2006, 11:33
den wert 5 habe ich gewählt weil es egal ist wie oft die schleife ausgefürht wird.
Mache ich dies nicht hängt sich das Programm auf !
hier die funktion CheckCollision:
Delphi-Quellcode:
function TForm1.CheckCollision(px,py,w,h,Index:Integer):Boolean;
var
  o:Boolean;
  z:Boolean;
begin
  o:=False; z:=False;

  z:=Kollision(rect(px,py,w,h));//GetItemIndex(px,py,w,h,index);
 // Label1.Caption:=IntToStr(py);
  Label3.Caption:='';
  if (px > 0) and (px < 640-w) and (py >0) and ((Items[index].isPlayer = True) and (py < 480) or (Items[index].isPlayer = False) and (py < 280))then begin
    o:=True;
  end;
  if (z = True) then begin
    Label3.Caption:=IntToStr(px) + '\' + IntToStr(py);
    o:=True
  end
  else begin
// Label3.Caption:=intToStr(z) + '*';
    o:=False;
  end;

// else
//BoolToStr(o,True) + '\' + IntToStr(z) + '\' + InttoStr(Index)+'\'+ intToStr(high(Items))
  result:=o;
end;
Ich persönlich finde meinen Code nicht unübersichtlich. Da ich mich inzwischen mich an diesen QullcodeStyle gewöhnt habe *G*.
Nagut dies ist auch nur als "einfacher Test" gedacht gewesen für eine Grafik Lib. Normalerweise schreibe ich auch etwas übersichtlicher und mit weniger sinloser kometaren *G*....
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 30. Jan 2006, 11:53
Endlosschleife spricht ja sehr dafür, dass CheckCollision eine Tautologie (also immer wahr) ist. Der Grund dafür könnte in dieser Zeile liegen:
if ... and ((Items[index].isPlayer = True) and (py < 480) or (Items[index].isPlayer = False) and (py < 280)) Ich bin mir nicht sicher wie der Compiler die booleschen Operatoren abarbeitet. Konvention ist ja, dass das "Und" stärker bindet als das "Oder", aber ich meine mich erinnern zu können, dass Delphi die beiden gleichwertig behandelt ("wer zuerst kommt, mahlt zuerst). Probier mal eine andere Klammerung:
if ... and (((Items[index].isPlayer = True) and (py < 480)) or ((Items[index].isPlayer = False) and (py < 280))) Hilft das?

PS: Mit unübersichtlich meinte ich nicht so sehr den Code an sich, sondern eher die, ähm, minimalistische Variablenbenennung.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 30. Jan 2006, 14:58
habe ich geändert überlappen sich leider immer noch teielweise:
Delphi-Quellcode:
function TForm1.CheckCollision(px,py,w,h,Index:Integer):Boolean;
var
  o:Boolean;
  z:Boolean;
begin
  o:=False; z:=False;

  z:=Kollision(rect(px,py,w,h));//GetItemIndex(px,py,w,h,index);
 // Label1.Caption:=IntToStr(py);
  Label3.Caption:='';
  if (px > 0) and (px < 640-w) and (py >0) and (((Items[index].isPlayer = True) and (py < 480)) or ((Items[index].isPlayer = False) and (py < 280)))then begin
    o:=True;
  end;
  if (z = True) then begin
    Label3.Caption:=IntToStr(px) + '\' + IntToStr(py);
    o:=True
  end
  else begin
// Label3.Caption:=intToStr(z) + '*';
    o:=False;
  end;

// else
//BoolToStr(o,True) + '\' + IntToStr(z) + '\' + InttoStr(Index)+'\'+ intToStr(high(Items))
  result:=o;
end;
Ja die Variabeln bennung fällt mir irgenwie noch nach ca 6-8 Jahren delphi programmiren sehr schwer *G*. Weil ich finde meistens keine passenden Namen für die Funktion/Procedure/Variable/Klasse die kurtzt beschreibt wo für es da ist.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 2. Feb 2006, 12:04
es muss doch ein grund geben warum das nicht funktioniert, oder etwa nicht ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#10

Re: Rechtecke überlagern sich beim zufälligen erstellen ?

  Alt 2. Feb 2006, 13:23
Zur Codesache:

1. Kommentieren
2. Auch if-Verschachtelungen lassen sich besser darstellen (über mehrere Zeilen verteilt)
3. Ein System zur Variablenbenennung machen. Ich benutze z.B. immer ein Prefix für den Typ der Variable ('b' für Boolean, 'i' für Integer, ...) und setze danach - großgeschrieben - den Namen, der z.T. auch systematisch ist. Bei Booleans z.B. oft mit "Is" beginnend.
Bei mir wäre dein 'z' beispielhaft 'bIsCollisioned'

air
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  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:08 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