For..Each-Schleife in For..Each-Schleife ...? (Selber Type)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Tennisball

Betreff: For..Each-Schleife in For..Each-Schleife ...? (Selber Type)

BeitragMo, Nov 02, 2009 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich habe, sagen wir, 500 Objekte des selben Types.
Nun möchte ich für jedes prüfen, ob es mit einem der anderen 499 kollidiert ist.

(Wie) geht das? (mir gehts nur um die Sache mit den Schleifen etc.)

mfg,
Tennisball
 

DjDETE

BeitragMo, Nov 02, 2009 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;type deklarieren
Type test
Field test

;500 objekte erstellen
for i=0 to 499
 t.test=new test
 t\test=createsphere()
next

for t1.test=each type
 for t2.test=each type
  if t1\test=t2\test then nothing=0
 next
next


Das Beispiel vergleicht nur die Werte Test und überprüft keine Kollision. Die Sache mit den Schleifen sollte aber klar sein. Smile

MfG DeTe

Edit: Tut mir leid, mein (dummer) Fehler
Aktuelles Projekt: XXX |XXX | 3% der v1b fertig
www.emu-soft.de.vu Für die Homepage suche ich noch Linktauschpartner, bei Interesse einfach melden.
  • Zuletzt bearbeitet von DjDETE am Mo, Nov 02, 2009 22:14, insgesamt einmal bearbeitet

PSY

BeitragMo, Nov 02, 2009 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type blubb
   Field eigenschaft%   
End Type

Global b.blubb, b2.blubb

For i= 1 To 500
   b.blubb = New blubb
   b\eigenschaft  = Rand(999)
Next

Repeat
   
   For b.blubb = Each blubb
      For b2.blubb = Each blubb
         If b <> b2
            ;check for collision
         EndIf
      Next
   Next
   
Until KeyHit(1)
End


L8er,
PSY

(edit)
@DjDETE
Zitat:
for t1.type=each type
for t2.type=each type


statt type muss es test lauten Smile

edit2 ok hast es vor mir gemerkt lol Wink
 

E. Urbach

ehemals "Basicprogger"

BeitragMo, Nov 02, 2009 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu den beiden Vorpostern möchte ich anmerken, dass bei den genannten Codes die Kollision zwischen 2 Objekten doppelt geprüft wird, was vollkommen unnötig ist und bei 500 Objekten sogar ein ernsthaftes Performanceproblem darstellen kann (500 * 500 = 250.000 Iterationen).

Ich würde den Index manuell verschieben oder gleich Arrays mit Index benutzen, die es noch performanter schaffen.
  • Zuletzt bearbeitet von E. Urbach am Mo, Nov 02, 2009 22:22, insgesamt einmal bearbeitet

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 02, 2009 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
bei dem Beispiel wird jeder mit jedem 1x geprüft, aber nicht mit sich selbst
Code: [AUSKLAPPEN]
    For a1.test = Each test
        a2.test = After a1
        While a2 <> Null
            If a1\test   =   a2\test Then ; <=> anpassen
             ;mach was
             ;
            End If
            a2 = After a2
        Wend
    Next
[BB2D | BB3D | BB+]

Silver_Knee

BeitragMo, Nov 02, 2009 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
also ideal ist wenn die innere Schleife aus While und After gebaut wird und nur immer bis zu dem objekt selbst kontrolliert und dann abbricht


Dann machst du aus:
Code: [AUSKLAPPEN]
  1 2 3
1 X X X
2 X X X
3 X X X


nur noch

Code: [AUSKLAPPEN]
  1 2 3
1 X
2 X X
3 X X X


Wenn du dann noch vor dem Objekt selbst abrichst

Code: [AUSKLAPPEN]
  1 2 3
1
2 X
3 X X


Für ein "dass es überhaupt funktioniert" sind allerdings die oberen schleifen ausreichend

EDIT:

Rallimen mach es genau anders herum:

Code: [AUSKLAPPEN]
  1 2 3
1   X X
2     X
3     

Tennisball

BeitragDi, Nov 03, 2009 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah danke, funktioniert prima. Smile

Danke!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group