[GELÖST] Abstand Punkt -> Gerade

  • Hi,
    hat jemand eine Formel um den Abstand von einem Punkt zu einer Geraden berechnen ?

    Folgende Situation:
    Wir haben eine Gerade von 50;100 -> 50;200 und einen Punkt mit den Koordinaten 100;150.
    Dieser Punkt wird bei jedem Rendervorgang 10 Pixel nach links (X-=10) und 4 Pixel nach unten (Y+=4) gesetzt und nun brauche ich den Abstand von dem Punkt zu der Geraden (Rote Linie).

    autoit.de/wcf/attachment/13005/
    (Bild entspricht nicht den den wirklichen Angaben)

    Ich hoffe ich habs halbwegs Verständlich ausgedrückt und schon mal Danke im Vorraus :)

  • Nun ja, das kann man ja mit Phytagoras lösen:

    Du weisst, der punkt verschiebt sich jedes mal um 10 Pixel nach links und 4 Pixel nach oben.

    so kannst du ja ein rechtwinkliges Dreieck bilden und die Länge der Diagonale (der Abstand) berechnen:

    [Blockierte Grafik: http://img163.imageshack.us/img163/1830/unbenanntxhn.png]

    Formel:

    x² = a² + b² => a = √a² + b² =  √10² + 4² = 10.77

    Also der punkt verschiebt sich immer um eine Länge von 10.77 Pixel.
    Jetzt musst du nur noch die anfangsposition des Punktes oder die anzahl Rendervorgänge wissen, dann kannst du die Position immer bestimmen...

    Gruss David

  • Hi,
    danke für den Denkanstoß :thumbup: . Da hätte ich eigentlich selber drauf kommen können aber eine alte Lebensweisheit sagt: "Auf die leichtesten Dinge kommt mann immer zum Schluss". Die länge von der 10 Px Kathete zu bekommen ist kein Problem aber wie komme ich an die der 4Px ? Mann könnte mit einer Schleife den Punkt immer weiter setzen und dann gucken ob sich Punkt und Gerade berühren aber das würde den Speed zu sehr mindern. Kennt wer ne andere Lösung ?

  • Hi,
    danke für den Denkanstoß :thumbup: . Da hätte ich eigentlich selber drauf kommen können aber eine alte Lebensweisheit sagt: "Auf die leichtesten Dinge kommt mann immer zum Schluss". Die länge von der 10 Px Kathete zu bekommen ist kein Problem aber wie komme ich an die der 4Px ? Mann könnte mit einer Schleife den Punkt immer weiter setzen und dann gucken ob sich Punkt und Gerade berühren aber das würde den Speed zu sehr mindern. Kennt wer ne andere Lösung ?

    Na legst du Y nicht irgendwie in dem Rendervorgang selbst fest?
    Alternativ könnte man das mit Winkelfunktionen lösen, dazu bräuchtest du aber den Winkel...

  • hi,
    das läßt sich mit 'Berechnung von Höhe und Höhenfußpunkt' leicht lösen:
    http://www.freebasic-portal.de/code-beispiele…ade-ab-191.html
    (das ist zwar ein FreeBasic-Programm, aber von jedem Programmierer leicht umsetzbar..)
    Bei Bedarf kann ich mich dransetzen und das Dings mal nach AutoIt portieren..
    [Edit]
    ..wäre dankbar für jede Hilfe zu Umsetzung der Records/UDTs nach AutoIt
    (Ich brauche keine Hilfe bei der Umsetzung der Types in Arrays, denn das kann ich^^)
    [/Edit]
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    2 Mal editiert, zuletzt von ytwinky (2. April 2011 um 13:14) aus folgendem Grund: wichtige Ergänzung..


  • //Edit: Warum hast du deinen Beitrag gelöscht chip ?

    Hatte ich schon vor deinem Post gelöscht gehabt Sprenger. Hatte das falsch Verstanden, dachte zu wolltest die Länge der roten Geraden wissen.

    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,
    so habs hinbekommen :)
    Danke @all für die Lösungen

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    _GDIPlus_Startup()

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

    $hGUI = GUICreate("", 500, 500)
    GUISetState(@SW_SHOW)
    $hGr = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    _GDIPlus_GraphicsClear($hGr, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawLine($hGr, 50, 100, 50, 200)

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

    $x = 200
    $y = 150
    $stepx = -500
    $stepy = -100

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

    $m = (($y + $stepy) - $y) / (($x + $stepx) - $x)
    $b = $y - $m * $x

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

    $hTimer = TimerInit()

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

    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    For $ix = $x To $x + $stepx Step -1
    $y = $m * $ix + $b
    If $ix = 50 And $y <= 200 And $y >= 100 Then
    ConsoleWrite("Linie berührt" & @CRLF)
    ConsoleWrite("berührt an:" & $ix & "|" & $y & @CRLF)
    $laenge = Sqrt(($ix - $x) ^ 2 + ($y + $stepy - $y) ^ 2)
    ConsoleWrite("abstand:" & $laenge & @CRLF)
    ExitLoop
    EndIf
    _GDIPlus_GraphicsfillRect($hGr, $ix, $y, 2, 2,$hBrush)
    Next

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

    While GUIGetMsg() <> -3
    WEnd
    _GDIPlus_GraphicsDispose($hGr)
    _GDIPlus_Shutdown()

    [/autoit]


    chip: genau das wollte ich doch ^^