Schleife in der Schleife

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

C64-Flo

Betreff: Schleife in der Schleife

BeitragMi, Okt 31, 2007 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, Ich bins mal wieder! Wink

Folgendes....

Ich habe eine dynamische anzahl von TYPES, die eine FOR..EACH -Schleife ihre Entfernung zu allen anderen dieser TYPES ermitteln sollen (um, wenn sie nahe genug sind beeinflusst zu werden).

Also praktisch so ungefähr:
(nur dass es eben so nicht geht Wink)

Code: [AUSKLAPPEN]

for pol=each polle
            xrangemax=pol\xpos+100
            xrangemin=pol\xpos-100

            for pol=each polle
                        if xrangemin<pol\xpos<xrangemax then
                                                                               ;Bedingung erfüllt
                       endif
            next
next


Das Problem ist klar..?
ich kann nicht alle TYPES in einer Schleife, welche alle TYPES abfrägt abfragen....

..kennt jemand eine elegante Lösung für dieses Dilemma? Question
"Die Situation ist aussichtslos - aber nicht kritisch!"
(S.Effenberg.)

Eingeproggt

BeitragMi, Okt 31, 2007 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte dich jetzt ein bisschen nerven von wegen "suche" oder "tutorials" aber damit das Prob vom Tisch ist:

Code: [AUSKLAPPEN]
for pol=each polle
            xrangemax=pol\xpos+100
            xrangemin=pol\xpos-100

            for pol2.polle=each polle
                        if xrangemin<pol2\xpos<xrangemax then
                                                                               ;Bedingung erfüllt
                       endif
            next
next


viel Spass noch!

EDIT: Deine Abfrage wird so nicht ganz funzen.... wie wärs mit
Code: [AUSKLAPPEN]
if xrangemin<pol2\xpos And pol2\xpos<xrangemax then
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Mi, Okt 31, 2007 22:49, insgesamt einmal bearbeitet

flona

BeitragMi, Okt 31, 2007 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuchs mal so:
Code: [AUSKLAPPEN]
For pol=Each polle
   xrangemax=pol\xpos+100
   xrangemin=pol\xpos-100
   wert=Handle(pol)
   For pol=Each polle
      If xrangemin<pol\xpos<xrangemax Then
      ;Bedingung erfüllt
      EndIf
   Next
   pol=Object.polle(wert)
Next

Ist zwar vll nicht die beste Lösung, aba was besseres fällt mir nich ein. Wink
*edit*
Zu langsam mal wieder
Hätte ich auch drauf kommen können
www.Dreier-Florian.kilu.de
Intel Core 2 Quad Q9400 | Zotac 9800GT | 4GB RAM | 1TB HDD | Windows 7 Professional 32bit
 

Marek

BeitragMi, Okt 31, 2007 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@flona damit ist gar nix besser. Das Problem ist das 2x die Variable pol deklariert wird.
Das pol bei der 2. For-Schleife muss ganz einfch zu einem pol2 umbenannt werden.
Wer lesen kann ist klar im Vorteil...

flona

BeitragDo, Nov 01, 2007 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab doch im edit schon gesagt ähh... geschrieben, dass die andere Version besser ist. Rolling Eyes
Ich hätte auch gemeint, dass man pol in pol2 umbenennen muss, aba hab nicht daran gedacht dass ich dann .polle dahinterschreiben muss.
www.Dreier-Florian.kilu.de
Intel Core 2 Quad Q9400 | Zotac 9800GT | 4GB RAM | 1TB HDD | Windows 7 Professional 32bit

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Nov 01, 2007 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Um mit 2 verschachtelten Schleifen zu arbeiten gibt es paar Sachen die man beachten muss....

1. die Zeiger variablen müssen unterschiedliche Namen haben
Code: [AUSKLAPPEN]
For pol1=Each polle
    For pol2=Each polle
    ;machwas
    Next
Next

2. beim ersten Durchgang sind Pol1 und Pol2 identisch, bzw der gleiche erste Eintrag. Das bedeutet das man verhindern muss das sich der selbe Eintrag nicht mit sich selbst prüft
Code: [AUSKLAPPEN]
For pol1=Each polle
    For pol2=Each polle
        If Pol1 <> Pol2 Then ; nur unterschiedliche prüfen
        ;machwas
        End If
    Next
Next

3. diese Art mit 2 For Schleifen prüft immer doppelt und eignet sich normal nicht dazu!
bei 3 Type Einträgen z.B. werden geprüft
Zitat:
1 mit 1 ; überflüssig
1 mit 2
1 mit 3
2 mit 1 ; überflüssig
2 mit 2 ; überflüssig
2 mit 3
3 mit 1 ; überflüssig
3 mit 2 ; überflüssig
3 mit 3 ; überflüssig

also 9 mal.... wobei 6 überflussig sind da doppelt oder mit sich selbst abgefragt wird

Um das zu umgehen sollte man die innere Schleife ändern

Code: [AUSKLAPPEN]
For pol1.polle = Each polle
    pol2.polle = After pol1
   
    While pol2 <> Null
   
         ;prüfe was   

    pol2 = After pol2
    Wend
Next

Diese Schleife prüft bei 3 Einträgen

Zitat:

1 mit 2
1 mit 3
2 mit 3

also keine überflüssigen dabei

Um den Abstand auf der X achse zu berechnen braucht man aber nicht mit +100 oder -100 die werte zwischenspeichern, sondern man kann das direkt ohne Umwege realisieren in dem die Werte der 2 einfach subtrahiert. Dabei kommt es allerdings auch zu negativen Zahlen. Mit Abs() kann man die Vorzeichen löschen
Die Abfrage sieht dann so aus..

Code: [AUSKLAPPEN]
Pixelabstand = Abs(pol1\x -pol2\x)
If Pixelabstand < 100 then ; mach was


alles zusammen sieht dann etwa so aus

Code: [AUSKLAPPEN]
For pol1.polle = Each polle
    pol2.polle = After pol1
   
    While pol2 <> Null
   
        Pixelabstand = Abs(pol1\x -pol2\x)
       
        If Pixelabstand < 100 Then
         ;mach was   
        End If
       
        pol2 = After pol2
    Wend
Next

Sehe gerade das es ein wenig mehr geworden ist, aber vielleicht hat es ja was gebracht
Wink
[BB2D | BB3D | BB+]

C64-Flo

BeitragFr, Nov 02, 2007 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja! Super!

..mensch ich stand die ganze Zeit auf sowas von nem riesen Schlauch! Very Happy


For pol1=Each polle
For pol2=Each polle ....

Jau, dass man einfach verschiedene Variablen nimmt, klar Wink
(wie war das mit dem Wald und den Bäumen?)

und thx rallimen für die sehr erschöpfende Auskunft, da bleibt keine Frage offen! Wink
"Die Situation ist aussichtslos - aber nicht kritisch!"
(S.Effenberg.)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group