Warum geht das Nicht - Hat Autoit fehler?

  • Hallo,
    ich habe in diesem script einen fehler, der ziemlcih komisch ist. Das script müsste so wie ich die funktion konfiguriet habe bis 3 bzw 4 zählen und dann wieder bis 0 und so weiter aber es klappt nicht weil die variabln plötzlich extrem komische Wert annehmen

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Misc.au3>

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

    Global $animator_array

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

    animator_add(0, 0, 0, 3, 4, 0, 2,True)

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

    While True
    zeichne_particle()
    ; MouseMove($animator_array[0][9],$animator_array[0][10],100)
    Sleep(500)
    If _IsPressed(01) Then _ArrayDisplay($animator_array)
    If _IsPressed(02) Then Exit
    ToolTip($animator_array[0][9] & @LF & $animator_array[0][10] & @LF & $animator_array[0][11])
    WEnd

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

    Exit

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

    Func animator_add($x, $y, $z, $tx, $ty, $tz, $speed, $circle)

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

    Local $ubound = UBound($animator_array)

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

    If IsArray($animator_array) Then
    ReDim $animator_array[$ubound + 1][13]
    Else
    Dim $animator_array[$ubound + 1][13]
    EndIf

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

    $animator_array[$ubound][0] = $x ; X Startpunkt
    $animator_array[$ubound][1] = $y ; Y Startpunkt
    $animator_array[$ubound][2] = $z ; Z Startpunkt
    $animator_array[$ubound][3] = $tx ; X Zielpunkt
    $animator_array[$ubound][4] = $ty ; Y Zielpunkt
    $animator_array[$ubound][5] = $tz ; Z Zielpunkt
    Local $distanz = Sqrt(($tx-$x)*($tx-$x) + ($ty-$y)*($ty-$y) + ($tz-$z)*($tz-$z)) ; Distanz
    $animator_array[$ubound][6] = ($tx - $x) / $distanz ;X Vector
    $animator_array[$ubound][7] = ($ty - $y) / $distanz ;Y Vector
    $animator_array[$ubound][8] = ($tz - $z) / $distanz ;Z Vector
    $animator_array[$ubound][9] = $x ; X Position
    $animator_array[$ubound][10] = $y ; Y Position
    $animator_array[$ubound][11] = $z ; Z Position
    $animator_array[$ubound][12] = $circle

    Return $ubound

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

    EndFunc

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

    Func zeichne_particle()

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

    For $i = 0 To UBound($animator_array) - 1 Step 1

    $animator_array[$i][9] += $animator_array[$i][6] ; X Bewegung
    $animator_array[$i][10] += $animator_array[$i][7] ; Y Bewegung
    $animator_array[$i][11] += $animator_array[$i][8] ; Z Bewegung
    If ($animator_array[$i][0] = $animator_array[$i][9]) Or ($animator_array[$i][3] = $animator_array[$i][9]) Then ; Wenn Start- oder Zielpunkt erreicht wurden.
    If $animator_array[$i][12] = False Then
    MsgBox(0,"","")
    particle_delete_effect($i)
    $i -= 1
    Else
    MsgBox(0,"","")
    $animator_array[$i][6] = -$animator_array[$i][6]
    $animator_array[$i][7] = -$animator_array[$i][7]
    $animator_array[$i][8] = -$animator_array[$i][8]
    EndIf
    EndIf

    Next

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

    EndFunc

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

    Func particle_delete_effect($num)
    _ArrayDelete($animator_array, $num)
    EndFunc

    [/autoit]
  • Also verstehen tu ichs auch nicht.
    Workaround:

    [autoit]


    Func zeichne_particle()

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

    For $i = 0 To UBound($animator_array) - 1

    $animator_array[$i][9] += ($animator_array[$i][6]) ; X Bewegung
    $animator_array[$i][10] += $animator_array[$i][7] ; Y Bewegung
    $animator_array[$i][11] += $animator_array[$i][8] ; Z Bewegung
    If ($animator_array[$i][0] =Round($animator_array[$i][9],1)) Or ($animator_array[$i][3] = $animator_array[$i][9]) Then ; Wenn Start- oder Zielpunkt erreicht wurden.
    _ArrayDisplay($animator_array)
    If $animator_array[$i][12] = False Then
    MsgBox(0,"","")
    particle_delete_effect($i)
    $i -= 1
    Else
    $animator_array[$i][6] = -1*$animator_array[$i][6]
    $animator_array[$i][7] = -1*$animator_array[$i][7]
    $animator_array[$i][8] = -1*$animator_array[$i][8]
    EndIf
    EndIf

    Next
    EndFunc

    [/autoit]

    Edit \ Gibt das eine grafische Bewegungsdarstellung?
    Weil diese If ... Then Bedingung erzeugt dann ein Ruckeln (imho bin auch GDI+ Anfänger).
    Vielleicht besser gleich auf eine Sin / Cos Funktion ausweichen?

    Einmal editiert, zuletzt von nuts (25. November 2009 um 00:22)

  • habs mal mit Ausgabe jeder Zeile durchlaufen lassen.....und bin dann drauf gekommen, daß deine Abfrage

    [autoit]

    If ($animator_array[$i][0] = $animator_array[$i][9]) Or ($animator_array[$i][3] = $animator_array[$i][9]) Then ; Wenn Start- oder Zielpunkt erreicht wurden.

    [/autoit]

    nur für pythagoräische Dreiecke (ganze Zahlen als Distanz) gilt. Um auch mal andere Vektoren zu testen, habe ich = durch >= und <= ersetzt.....und nun läuft es! Der "Fehler" wird zwar falsch angezeigt, aber schon im nächsten Schleifendurchgang "neutralisiert". Schaut es euch an.....

    [autoit]

    #include <Array.au3>
    #include <Misc.au3>

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

    Global $animator_array

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

    animator_add(0, 0, 0, 3, 4, 0, 2,True)
    ;animator_add(0, 0, 0, 12, 5, 0, 2,True) ;ersatzweise testen, distanz = 13
    ;animator_add(0, 0, 0, 5, 6, 0, 2,True) ;funktioniert auch......

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

    While True
    zeichne_particle()
    ; MouseMove($animator_array[0][9],$animator_array[0][10],100)
    Sleep(500)
    If _IsPressed(01) Then _ArrayDisplay($animator_array)
    If _IsPressed(02) Then Exit
    ToolTip($animator_array[0][9] & @LF & $animator_array[0][10] & @LF & $animator_array[0][11])
    WEnd

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

    Exit

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

    Func animator_add($x, $y, $z, $tx, $ty, $tz, $speed, $circle)

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

    Local $ubound = UBound($animator_array)

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

    If IsArray($animator_array) Then
    ReDim $animator_array[$ubound + 1][13]
    Else
    Dim $animator_array[$ubound + 1][13]
    EndIf

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

    $animator_array[$ubound][0] = $x ; X Startpunkt
    $animator_array[$ubound][1] = $y ; Y Startpunkt
    $animator_array[$ubound][2] = $z ; Z Startpunkt
    $animator_array[$ubound][3] = $tx ; X Zielpunkt
    $animator_array[$ubound][4] = $ty ; Y Zielpunkt
    $animator_array[$ubound][5] = $tz ; Z Zielpunkt
    Local $distanz = Sqrt(($tx-$x)*($tx-$x) + ($ty-$y)*($ty-$y) + ($tz-$z)*($tz-$z)) ; Distanz
    $animator_array[$ubound][6] = ($tx - $x) / $distanz ;X Vector
    $animator_array[$ubound][7] = ($ty - $y) / $distanz ;Y Vector
    $animator_array[$ubound][8] = ($tz - $z) / $distanz ;Z Vector
    $animator_array[$ubound][9] = $x ; X Position
    $animator_array[$ubound][10] = $y ; Y Position
    $animator_array[$ubound][11] = $z ; Z Position
    $animator_array[$ubound][12] = $circle

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

    Return $ubound

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

    EndFunc

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

    Func zeichne_particle()

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

    For $i = 0 To UBound($animator_array) - 1 Step 1

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

    $animator_array[$i][9] += $animator_array[$i][6] ; X Bewegung
    $animator_array[$i][10] += $animator_array[$i][7] ; Y Bewegung
    $animator_array[$i][11] += $animator_array[$i][8] ; Z Bewegung
    If ($animator_array[$i][0] >= $animator_array[$i][9]) Or ($animator_array[$i][3] <= $animator_array[$i][9]) Then ; Wenn Start- oder Zielpunkt erreicht wurden.
    If $animator_array[$i][12] = False Then
    MsgBox(0,"","")
    particle_delete_effect($i)
    $i -= 1
    Else
    MsgBox(0,"","")
    $animator_array[$i][6] = -$animator_array[$i][6]
    $animator_array[$i][7] = -$animator_array[$i][7]
    $animator_array[$i][8] = -$animator_array[$i][8]
    EndIf
    EndIf

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

    Next

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

    EndFunc

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

    Func particle_delete_effect($num)
    _ArrayDelete($animator_array, $num)
    EndFunc

    [/autoit]
  • Könntest du das nochmal langsam erklären? :wacko:
    Die Bewegung wird doch in Zeile 38-40 berechnet. Wieso sollte man sich zwischen Start und Zielpunkt nur in ganzen Zahlen bewegen dürfen?

    edit \ Also am Array liegts schonmal nicht. Der Rechenfehler tritt auch bei einfachen Variablen auf.

    Mal das Problem vereinfacht - bei nicht ganzzahliger Bewegung kommt es zum Fehler -> Nur warum?

    Spoiler anzeigen
    [autoit]


    global $X = 0
    Global $Y = 9 ;Bei 10 funktionierts, da $Step ganzzahlig wird
    global $step = ($y-$x)/5
    global $pos = $x

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

    Hotkeyset("{ESC}", "_Exit")
    func _exit()
    Exit
    endfunc

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

    while 1
    _Calc()
    Sleep(150)
    wend

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

    Func _Calc()
    $pos += $step
    if $pos = $x or $pos = $y then $step = -$step
    ConsoleWrite($pos & @CRLF)
    EndFunc

    [/autoit]

    4 Mal editiert, zuletzt von nuts (25. November 2009 um 11:16)

  • Ja mit größer- und kleinergleich klappt es aber auch nur wenn die 1.Postion keine negativen werte enthält. Das Script ist teil meine projektes und dient dazu ein Objekt in Raum hin un her zu bewegen. Mein Problem bleibt jedoch weiterhin bestehend - Wo kommen die komischen Werte her, normaler weise müsste das script bei 0 wieder rauf zählen.

    Sind die Vektoren richtig berechnet???

  • Hi,
    das wird an einem Rundungsfehler liegen.
    Ich hab mal das Beispiel von nuts genommen und fang den Fehler ab.

    Spoiler anzeigen
    [autoit]

    global $X = 0
    Global $Y = 9
    global $step = ($y-$x)/5
    global $pos = $x

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

    Hotkeyset("{ESC}", "_Exit")
    func _exit()
    Exit
    endfunc

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

    while 1
    _Calc()
    Sleep(1000)
    wend

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

    Func _Calc()
    $pos += $step
    if $pos < (-1 * $step) then $pos = 0 ; Abfangen des Rundungsfehlers
    if $pos = $x or $pos = $y then $step = -$step
    ConsoleWrite($pos & @CRLF)
    EndFunc

    [/autoit]

    MFG. RAPTOR-ONE


  • Das Script ist teil meine projektes und dient dazu ein Objekt in Raum hin un her zu bewegen.


    Ohne dein Skript genau zukennen, aber wäre eine Sin / Cos Funktion ohne die Umkehr nicht besser?
    Mit If ... then braucht die ganze Funktion länger, ist zwar nur minimal, könnte aber zum Ruckeln führen.

    Das Problem bleibt trotzdem, eine Erklärung wäre interessant.

  • Mal ein Bsp. mit Sinus für den Wertebereich 0-3:

    [autoit]


    Global Const $pi = 4 * ATan(1)
    global $calc
    for $i = 1 to 20 ; für $i gegen +/- unendlich bewegt sich $calc immer zwischen 0 und 3
    $calc = 1.5*sin($i*$pi/2)+1.5 ;die Amplitude (Distanz bei dir) wäre innerhalb der Sinusfunktion zu beeinflussen.
    ConsoleWrite($calc & @CRLF)
    next

    [/autoit]