Algorythmus für Flächenaddierung gesucht!

  • Hallo, da ich gerade an einem Spiel schreibe, und dort immer Laufflächen definiert werden, brauche ich einen Algorythmus, der mir die nebeneinander auf gleicher Höhe stehenden Flächen zusammenrechnet, und daraus eine Array macht. Somit muss meine For-Schleife nicht mehr so viel Collisionsabfragen durchführen.
    die Array heißt:

    [autoit]

    $Solid_Mask_up[x][0] = x-Position$Solid_Mask_up[x][1] = y-Position$Solid_Mask_up[x][2] = die Weite des Segmentes

    [/autoit]

    Beispiel:

    [autoit]


    $Solid_Mask_up[0][0] = 0
    $Solid_Mask_up[0][1] = 150
    $Solid_Mask_up[0][2] = 90

    [/autoit][autoit][/autoit][autoit]

    $Solid_Mask_up[1][0] = 90
    $Solid_Mask_up[1][1] = 150
    $Solid_Mask_up[1][2] = 90

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Solid_Mask_up[2][0] = 90
    $Solid_Mask_up[2][1] = 500
    $Solid_Mask_up[2][2] = 90

    [/autoit]

    Lösung:

    [autoit]


    $Solid_Mask_up[0][0] = 0
    $Solid_Mask_up[0][1] = 150
    $Solid_Mask_up[0][2] = 180

    [/autoit][autoit][/autoit][autoit]

    ;folgendes ist gleichgeblieben, da es ja kein Nebensegment besitzt.
    $Solid_Mask_up[1][0] = 90
    $Solid_Mask_up[1][1] = 500
    $Solid_Mask_up[1][2] = 90

    [/autoit]

    Im Anhang ist ein ArrayDisplay der Array, damit ihr wießt wie die Ausgangsarray so aussieht.
    Ich weiß, das ihr gern mal mein Scriptversuch sehen wollt, aber ich weiß nicht mal wie ich anfangen soll ?(
    Ob mit ArraySearch oder dll? ?(

  • So, etz hats mehr gereicht, nun schrieb ich eben die Funktion :rofl:
    Lösung und Beispiel:

    [autoit]

    #Include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    dim $Solid_Mask_up[5][3]
    $Solid_Mask_up[0][0] = 0
    $Solid_Mask_up[0][1] = 150
    $Solid_Mask_up[0][2] = 90

    [/autoit][autoit][/autoit][autoit]

    $Solid_Mask_up[1][0] = 90
    $Solid_Mask_up[1][1] = 150
    $Solid_Mask_up[1][2] = 90

    [/autoit][autoit][/autoit][autoit]

    $Solid_Mask_up[2][0] = 90
    $Solid_Mask_up[2][1] = 500
    $Solid_Mask_up[2][2] = 90

    [/autoit][autoit][/autoit][autoit]

    $Solid_Mask_up[3][0] = 180
    $Solid_Mask_up[3][1] = 500
    $Solid_Mask_up[3][2] = 90

    [/autoit][autoit][/autoit][autoit]

    $Solid_Mask_up[4][0] = 180
    $Solid_Mask_up[4][1] = 150
    $Solid_Mask_up[4][2] = 90

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($Solid_Mask_up,"Before")

    [/autoit][autoit][/autoit][autoit]

    ;Algoryhtmus:

    [/autoit][autoit][/autoit][autoit]

    ; - Sortierung der Array von GROß nach KLEIN:
    _ArraySort($Solid_Mask_up, 1, 0, 0, 0)
    ; - Schleife checkt jedes Objekt nach vorderes Anschlussobjekt:
    for $i = 0 to UBound($Solid_Mask_up) -1 step 1
    ; - geht jedes Objekt durch:
    for $l = 0 to UBound($Solid_Mask_up) -1 step 1
    ;Höhen-Check:
    If $Solid_Mask_up[$i][1] = $Solid_Mask_up[$l][1] Then
    ;Falls Anschluss Objekt:
    If $Solid_Mask_up[$i][0] + $Solid_Mask_up[$i][2] = $Solid_Mask_up[$l][0] Then
    ;dann Weitenübertragung:
    $Solid_Mask_up[$i][2] = $Solid_Mask_up[$i][2] + $Solid_Mask_up[$l][2]
    ;Anschlussobjekt löschen:
    $Solid_Mask_up[$l][0] = "non"
    $Solid_Mask_up[$l][1] = "non"
    $Solid_Mask_up[$l][2] = "non"
    ;ExitLoop
    ExitLoop
    EndIf
    EndIf
    Next
    next

    [/autoit][autoit][/autoit][autoit]

    $aiResult = _ArrayFindAll($Solid_Mask_up, "non",0,0,1)
    for $i = 0 to UBound($aiResult) -1 step 1
    _ArrayDelete($Solid_Mask_up, $aiResult[$i]-$i)
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($Solid_Mask_up,"After")

    [/autoit]