Verkürzung von Code

  • Hallo Leute,

    hat vielleicht jemand eine Idee wie ich folgenden Code Kürzen kann? (Hauptsächlich die For Schleife)

    Mit dieser Funktion wird auf einem Raster abgefragt auf welche Raute geklickt wurde.

    [autoit]

    Func _ObjectClick($x, $y)
    Local $aRaute1[2], $aRaute2[2], $aRaute3[2], $aRaute4[2], $aMaus[2] = [$x, $y]
    Local $IsSelected = False
    For $k = 0 To $iFieldWidth - 1
    For $i = 0 To $iFieldHeight - 1
    $aRaute1[0] = (($i * 50 + $k * 50) + $iX)
    $aRaute1[1] = ((425 - 25 * $i + 25 * $k) + 75 + $iY)
    $aRaute2[0] = (($i * 50 + $k * 50) + 50 + $iX)
    $aRaute2[1] = ((425 - 25 * $i + 25 * $k) + 50 + $iY)
    $aRaute3[0] = (($i * 50 + $k * 50) + 100 + $iX)
    $aRaute3[1] = ((425 - 25 * $i + 25 * $k) + 75 + $iY)
    $aRaute4[0] = (($i * 50 + $k * 50) + 50 + $iX)
    $aRaute4[1] = ((425 - 25 * $i + 25 * $k) + 100 + $iY)
    If (PointToLine2D($aMaus, $aRaute1, $aRaute2) >= 0) And (PointToLine2D($aMaus, $aRaute2, $aRaute3) >= 0) And (PointToLine2D($aMaus, $aRaute3, $aRaute4) >= 0) And (PointToLine2D($aMaus, $aRaute1, $aRaute4) <= 0) Then
    $aSelectedBlock[0][1] = True
    $aSelectedBlock[1][0] = $i * 50 + $k * 50
    $aSelectedBlock[1][1] = 425 - 25 * $i + $k * 25 + 75
    $aSelectedBlock[2][0] = $i * 50 + $k * 50 + 50
    $aSelectedBlock[2][1] = 425 - 25 * $i + $k * 25 + 50
    $aSelectedBlock[3][0] = $i * 50 + $k * 50 + 100
    $aSelectedBlock[3][1] = 425 - 25 * $i + $k * 25 + 75
    $aSelectedBlock[4][0] = $i * 50 + $k * 50 + 50
    $aSelectedBlock[4][1] = 425 - 25 * $i + $k * 25 + 100
    $IsSelected = True
    ExitLoop 2
    EndIf
    Next
    Next
    If Not $IsSelected Then $aSelectedBlock[0][1] = False
    EndFunc

    [/autoit]
  • Hi,
    zu kürzen gibts nicht sonderlich viel, man könnte sicher auf weniger als die Hälfte der Zeilen kommen, hätte aber einen unleserlichen Code welcher keinen Deut schneller wäre!

    In AutoIt ist die Rechenzeit unabhängig von der Anzahl der Berechnungen fast konstant, bei kompilierenden Sprachen sollte man aber darauf achten, dieselben Berechnungen nicht immer wieder durchzuführen -> Hilfsvariablen

    Spoiler anzeigen
    [autoit]

    Func _ObjectClick($x, $y)
    Local $aRaute1[2], $aRaute2[2], $aRaute3[2], $aRaute4[2], $aMaus[2] = [$x, $y]
    Local $IsSelected = False
    For $k = 0 To $iFieldWidth - 1
    For $i = 0 To $iFieldHeight - 1
    $aRaute1[0] = ($i * 50 + $k * 50) + $iX
    $aRaute2[0] = $aRaute1[0] + 50
    $aRaute3[0] = $aRaute1[0] + 100
    $aRaute4[0] = $aRaute1[0] + 50

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

    $aRaute1[1] = ((425 - 25 * $i + 25 * $k) + 75 + $iY)
    $aRaute2[1] = $aRaute1[1] - 25
    $aRaute3[1] = $aRaute1[1]
    $aRaute4[1] = $aRaute1[1] + 25
    If (PointToLine2D($aMaus, $aRaute1, $aRaute2) >= 0) And (PointToLine2D($aMaus, $aRaute2, $aRaute3) >= 0) And (PointToLine2D($aMaus, $aRaute3, $aRaute4) >= 0) And (PointToLine2D($aMaus, $aRaute1, $aRaute4) <= 0) Then
    $aSelectedBlock[0][1] = True
    $aSelectedBlock[1][0] = $i * 50 + $k * 50
    $aSelectedBlock[1][1] = 425 - 25 * $i + $k * 25 + 75
    $aSelectedBlock[2][0] = $aSelectedBlock[1][0] + 50
    $aSelectedBlock[2][1] = $aSelectedBlock[1][1] - 25
    $aSelectedBlock[3][0] = $aSelectedBlock[1][0] + 100
    $aSelectedBlock[3][1] = $aSelectedBlock[1][1]
    $aSelectedBlock[4][0] = $aSelectedBlock[1][0] + 50
    $aSelectedBlock[4][1] = $aSelectedBlock[1][1] + 25
    $IsSelected = True
    ExitLoop 2
    EndIf
    Next
    Next
    If Not $IsSelected Then $aSelectedBlock[0][1] = False
    EndFunc ;==>_ObjectClick

    [/autoit]


    Dazu gehört, sämtliche Berechnungen, welche IN der Schleife sowieso ein Konstantes Ergebnis liefern, VOR die Schleife zu stellen

    Spoiler anzeigen
    [autoit]

    For $k = 0 To $iFieldWidth - 1
    $f = $k * 50 + $iX
    For $i = 0 To $iFieldHeight - 1
    $aRaute1[0] = $i * 50 + $f

    [/autoit]