Koordinatensytem Wegeberechnung

  • Hey.

    Ich bin mir nicht sicher, ob es der Titel auf edn Punkt bringt aber naja, mir ist kein besserer eingefallen xD

    Im prinzip habe ich begehbaren Weg (blaue Fläche) und NICHT begebahren Weg (rote Fläche).
    Nun habe ich dort zwei Punkte, P1(dort stehe ich) und P2(dort will ich hin).

    Nun will ich über den kürzesten Weg zu P2, ohne dass ich dabei die Rote fläche überquere.

    Sagen wir ich bewege mich mit einer Konstanten geschwindigkeit ( $iSpeed = 100px / Sekunde).

    Irgendwer nen Ansatz für mich ?

    [Blockierte Grafik: http://s7.directupload.net/file/d/2460/flia8ib6_png.htm]

    Dateien

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (15. März 2011 um 12:45)

  • Danke, schau cih mir auf jeden fall mal an.
    ich bin der Meinung, dass sich jeder Algorithmus genauso wie in autoit umsetzten lässt, sicherlich ist der Syntaxt etwas anders, auch die geschwindigkeiten können sich unterscheiden aber sonst

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • A* ist wesentlich komplexer als Dijkstra und für diesen Fall nicht nötig.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,
    in der prospeed.dll ist Wegefindung auch in komplizierten Labyrinthen integriert.

  • Hi,
    in der prospeed.dll ist Wegefindung auch in komplizierten Labyrinthen integriert.

    Hmm ok, gibt es dazu auch eine Dokumentaion ?

    EDIT: Ok hab, sogar hier im Forum was gefunden.
    Da es sogar ein bsp. von dir ist, könntest du mir dies etwas erklären ?
    [ offen ] Probleme mit Prospeed.dll

    EDITEDIT:

    Ok, wenn ich es richtig verstanden habe, kann ich mit
    Sprite()
    gegenstände einfügen richtig?
    Findpath()
    rechnet mir dann den Weg aus und umbeght diese Genstände?

    Sowie ich das gesehen habe, liefert mit Findpath() nichts zurück, in welcher weiße könnte ich dass dann verwenden?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    2 Mal editiert, zuletzt von Darter (12. März 2011 um 05:41)

  • Hey.

    Also die Dokumentation in der Prospeed.au3 ist wirklich nicht die beste, das hier ist der header der funktion Findpath :

    Code
    ;###################################################################################################################################
    ;    Findpath
    ;    syntax : Findpath($Pic_array, $P_PixelWidth, $S_StartX, $S_StartY, $S_EndpointX, $S_EndpointY)
    ;    Note :  $Pic_array = mask picture loaded with function LoadImage() last parameter must be 0
    ;			example ; $Pic = LoadImage("mask5.bmp", 0, 0, 600, 400, 0)
    ;            $P_PixelWidth = how width is the path (pixel)
    ;			$S_StartX and $S_StartY = startpoint x and y axis
    ;			$S_EndpointX and $S_EndpointY = endpoint x and y axis
    ;	example ; Findpath("mask_pic", 6, 10, 10, 585, 10)
    ;###################################################################################################################################

    Dsa bsp ist absolut nicht verständlich, vorallem da es die funktion LoadImage() in der UDF nirgends gibt.


    Wenn es so funktioniert, wie ich es mit vorstelle, wäre das nicht schlecht. Zeichnen wollte ich vorerst trozdem weiter mit GD+.
    Dennoch ware die Pathfinder funktion, wo ich Objekte setzt und er mir den Weg von a Nach B ausrechnet und die Punkte in einem Array zurückliefert nicht schlecht, hjedoch verstehe ich die bsp. da nicht

    EDIT: gibt es denn nirgends eine ordenliche Dokumentation dazu ?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    2 Mal editiert, zuletzt von Darter (12. März 2011 um 17:04)

  • hast du dir die gesamte prospeed-software runtergeladen? Da ist Hilfedatei und Demo usw dabei..

  • Ok, danke, diese Dokumentation ist schonal um einiges besser, jedoch verstehe ich trzdem einiges noch nicht.

    Verstanden habe dich :

    Ich muss der funktion FindPath() ein bmp übergeheben mir weißen flächen(begehbarer weg ) und schwarzen flächen(nicht begebar).
    Start- und Enpunkt, auch die width sind klar.

    Was ich noch nicht verstehe, sind BA und B, wie ich diese übergeben, soll über ein bsp von dir, wenn du dich damit auskennst und Zeit hast würde ich mich freuen,

    mfg Darter

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Selbst solch ein einfaches script stürz immer ab !
    Auserdem stimmt die DOkumentation nicht mit der UDF überein


    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include 'Includes/prospeed30.au3'

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

    $hImage = LoadFileImage(@ScriptDir & "\Images\test.png")
    $BA = InitFX($hImage)
    FindPath($BA,10,450,450,10,10)

    [/autoit]

    wer hat denn diese UDF geschrieben, dass hier macht doch gar keinen sinn, der rückgabewert wird durch 4 geteilt, aber ein return hat diese FUnktion überhaupt nicht:

    Spoiler anzeigen
    [autoit]

    Func Findpath($Pic_array, $P_PixelWidth, $S_StartX, $S_StartY, $S_EndpointX, $S_EndpointY)
    $S_Struct_data = DllStructCreate("short[200000]")
    $S_Rz = DllCall($S_DLL, "long", "FindPath", _
    "long", DllStructGetPtr($S_Struct_data), _
    "long", $Pic_array, _
    "long", $P_pixelWidth, _
    "long", $S_StartX, _
    "long", $S_StartY, _
    "long", $S_EndpointX, _
    "long", $S_EndpointY, _
    "long", 0)
    DllCall($S_DLL, "long", "SmoothPath", _
    "long", DllStructGetPtr($S_Struct_data), _
    "long", $S_Rz[0], _
    "long", 2)
    Dim $S_Rz = $S_Rz[0]/4
    EndFunc

    [/autoit]

    EDIT:

    Ok habs jetzt wenigstens mal zum laufen gebracht, jedoch gefällt mir das Ergebniss gar nicht.

    Hier mal der Code :

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <GDIPlus.au3>

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

    $S_DLL = DllOpen(@ScriptDir & "\Includes\ProSpeed.dll")

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

    $hImage = LoadFileImage(@ScriptDir & "\Images\test3.png")
    $BA = InitFX($hImage)
    $aPoints = _FindPathToArray($BA,20,440,40,1900,100)
    _ArrayDisplay($aPoints)

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\test3.png")
    $hContext = _GDIPlus_ImageGetGraphicsContext($hImage)
    For $i = 0 To UBound($aPoints)-1
    _GDIPlus_GraphicsFillRect($hContext, $aPoints[$i][0], $aPoints[$i][1], 5, 5)
    Next
    _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Images\loesung3.png")

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

    Func _FindPathToArray($Pic_array, $P_PixelWidth, $S_StartX, $S_StartY, $S_EndpointX, $S_EndpointY)
    Local $S_Struct_data = DllStructCreate("short[200000]")
    $S_Rz = DllCall($S_DLL, "long", "FindPath", _
    "long", DllStructGetPtr($S_Struct_data), _
    "long", $Pic_array, _
    "long", $P_pixelWidth, _
    "long", $S_StartX, _
    "long", $S_StartY, _
    "long", $S_EndpointX, _
    "long", $S_EndpointY, _
    "long", 0)
    If Not IsArray($S_Rz) Then Return SetError(-1,'', -1)
    Local $a__Array[1][2], $sData
    For $i = 2 To $S_Rz[0] Step 2
    $sDataY = DllStructGetData($S_Struct_data, 1, $i)
    $sDataX = DllStructGetData($S_Struct_data, 1, $i - 1)
    If $i = 2 Then
    $a__Array[0][0] = $sDataX
    $a__Array[0][1] = $sDataY
    Else
    ReDim $a__Array[UBound($a__Array)+1][2]
    $a__Array[UBound($a__Array)-1][0] = $sDataX
    $a__Array[UBound($a__Array)-1][1] = $sDataY
    EndIf
    If Abs($S_EndpointX - $sDataX) < $P_PixelWidth And Abs($S_EndpointY - $sDataY) < $P_PixelWidth Then ExitLoop
    Next
    Return $a__Array
    EndFunc

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

    ;###################################################################################################################################
    ; LoadFileImage
    ; syntax : $pic = LoadFileImage("c:\photo.jpg")
    ; Note ; load picture to memmory
    ; returns Handle for imagedata
    ;###################################################################################################################################
    Func LoadFileImage($S_File)
    $S_Image = DllCall($S_DLL, "long", "LoadFileImage", _
    "str", $S_File)
    Return $S_Image[0]
    EndFunc

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

    ;###################################################################################################################################
    ; InitFX
    ; syntax : $FX = InitFX($bitmap1)
    ; Note ; creates a byte array from a bitmap for Special fx functions
    ; returns pointer for fx effect
    ;###################################################################################################################################
    Func InitFX($C_Source)
    $S_ImageFX = DllCall($S_DLL, "long", "InitFX", _
    "long", $C_Source)
    Return $S_ImageFX[0]
    EndFunc

    [/autoit]

    Das Bild und das Ergebniss hänge ich mal an.
    Kann mir jemand erklären, warum da eine solch uneinleuchtende Lösung dabei raus kommt ?

  • Hi, der Tip mit der prospeed.dll kam ja von mir, ich habe mich jetzt schon einige Zeit mit deinem Problem rumgeschlagen. Ich hatte mal eine funktionierende Lösung, allerdings weiss ich nicht mehr, ob das in AutoIt war ?(
    Ich bleib am Ball und suche weiter....

  • Ja mein Problem ist ja, eig. hab ich nach der beschreibung in der hilfedatei alles so gemacht wie es sein soll, deshalb fällt mir eben nichts mehr ein was ich testen könnte, und das frustet mich etwas.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • OK, hat sonst vllt jemand schon einen fertigen Algorythmus ?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (14. März 2011 um 18:24)

  • Das ist echt ein geiles Script das da gefunden hast Sprenger120.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • OK danke, der Alog dunktioniert recht gut (Warum hat mir Google das wohl nicht angezeigt -> Google hasst mich xD)
    Naja, ist nicht der schnellste Algo aber bei meinem Raster und für meinen Verwendungszweck reicht es aus.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Das ist nicht der Algorithmus sondern Autoit das schlicht so langsam ist.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.