Mal wieder ein kleines Logigproblem

  • Nehmen wir an, ich hab in einem Koordinatensystem 2 Punkte, z.b. P1(5/10) P2(10/15).
    Die Differenz zu diesen 2 Punken auszurechnen ist ja kein großes Problem.

    So hinzu kommt jetzt ein 3 Punkt hinzu, wie berechne ich am einfachsten ob dieser P3 auf der gerade von P1 und P2 liegt.
    Wenn er nicht direkt drauf liegt, sollte ich herausfinden, wie weit er von dieser Geraden entfernt ist.

    ich hoffe man versteht was ich meine und ihr könnt mir helfen :)

    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.

  • ich glaube du musst mal als erstesdie funktionsgleichung herausfinden also mal ganz einfach
    m*x+c

    so m ist ja das gleiche wie (y2-y1) / (x2-x1)

    [autoit]


    Global $P1[2] = [5,10]
    Global $P2[2] = [10,15]

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

    $m = ($P2[1]-$P1[1]) / ($P2[0]-$P1[0])

    [/autoit]


    um c herauszufinden musst du nach c auflösen

    das wäre bei y=m*x+c
    y-m*x=c

    [autoit]


    $c=$P1[1]-$m*$P1[0]

    [/autoit]


    so nun hast du die funktionsgleichung

    so jetzt hast du die steigung nun brauchst du c


    so jetzt hast du also die funktionsgleichgung
    y=m*x+c
    nun musst du testen ob zb p3(13|20) daraufliegt

    [autoit]


    Global $P3[2]=[13,20]
    If $P3[1] = $m*$P3[0]+$c Then
    Msgbox(0,"Der punkt liegt auf der geraden", "Der punkt P3 liegt auf der geraden durch p1 und p2")

    [/autoit]


    dann hättest du

    [autoit]

    $m2=(-1)/$m)

    [/autoit]


    als steigung
    und dann halt wieder

    [autoit]


    $c2=$P3[1]-$m2*$P3[0]

    [/autoit]

    so jetzt hast du die orthogonale


    und jetzt wirds knifflig
    denn jetzt musst du den schnittpunkt von y1 und y2 berechnen also gleichsetzen und ab hier hab ich keinen plan wie ich das machen könnte

    m*x+c=m2*x+c2

    [autoit]


    Global $S[2]
    $S[0] = ($c-$c2)/($m2-$m1)

    [/autoit]


    glaube ich

    und jetzt mal wieder einsetzen

    [autoit]


    $S[1]=m*$[2]+$c

    [/autoit]

    4 Mal editiert, zuletzt von alexanderschill (6. Dezember 2010 um 18:37)

  • Naja, du kannst anhand von 2 Punkten ein geradenGleichung aufstellen: y = m*x+b, (m = (y2-y1)/(x2-x1)), dann bekannten Punkt einsetzen und b berechnen, und wenn du dann den dritten Punkt in diese Gleichung einsetzt, muss die Gleichung stimmen.
    Zu der strecke. Da fällt mir nur ein sehr komplizierter weg ein. ?(
    Geradengleichung finden, dessen Steigung die andere Gerade mit 90° schneidet (y2 = -(1/m)*x+b2), dann b2 anhand P3 ausrechnen, und Gleichungen gleichsetzen, um den Schnittpunkt zu erhalten.
    Dann mit Satz des Pythagoras den Abstand von P3 und dem errechneten Schnittpunkt ausrechnen

  • thx erstmal für die Antworten.

    Ich meine, ich habe eine Punkt P3, dieser liegt aber nicht auf der geraden von P1 und P2, jetzt will ich wissen,wie groß der abstand von Punkt 3 zu der geraden in einem rechten Winkel ist

    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.

  • ich bin grad dabei dir ein script zu schreiben

    also hier ist dein Script

    Spoiler anzeigen
    [autoit]


    Global $P1 = StringSplit(InputBox("Bitte Punkt 1 Eingeben", "Bitte Punkt 1 in diesem Format eingeben" & @CRLF & "x|y"),"|")
    Global $P2 = StringSplit(InputBox("Bitte Punkt 2 Eingeben", "Bitte Punkt 2 in diesem Format eingeben" & @CRLF & "x|y"),"|")
    Global $P3 = StringSplit(InputBox("Bitte Punkt 3 Eingeben", "Bitte Punkt 3 in diesem Format eingeben" & @CRLF & "x|y"),"|")
    Global $S_Y1_Y2[2]

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

    $M1 = ($P2[2]-$P1[2]) / ($P2[1]-$P1[1])
    $C1 = $P1[2]-$M1*$P1[1]

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

    If $P3[2] = $M1*$P3[1]+$C1 Then
    Msgbox(0,"Ergebnis: Auf der Geraden", "Der Punkt P3(" & $P3[0] & "|" & $P3[1] & ") Liegt auf der Geraden durch P1(" & $P1[0] & "|" & $P1[1] & "); P2(" & $P2[0] & "|" & $P2[1] & ")" & @CRLF & "Y=" & $M1 & " * X + " & $C1)
    Else
    $M2 = (-1)/$M1
    $C2 = $P3[2]-$M2*$P3[1]
    $S_Y1_Y2[0] = ($C1-$C2)/($M2-$M1)
    $S_Y1_Y2[1]=$M2*$S_Y1_Y2[0]+$C2

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

    $Strecke= Sqrt(($P2[2]-$P1[2])^2 + ($P2[1]-$P1[1])^2)

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

    Msgbox(0,"Ergebnis: Nicht auf der Geraden", "Der Punkt P3(" & $P3[0] & "|" & $P3[1] & ") Liegt nicht auf der Geraden durch P1(" & $P1[0] & "|" & $P1[1] & "); P2(" & $P2[0] & "|" & $P2[1] & ")" & @CRLF & "Der abstand beträgt: " & $Strecke)
    EndIf

    [/autoit]

    hoffe es stimmt so

    2 Mal editiert, zuletzt von alexanderschill (6. Dezember 2010 um 18:50)

  • du hast mit allen 3 punkten 3 seiten eines dreiecks und du suchst die Höhe auf c also gilt:
    beta = acos((b * b - c * c - a * a) / (-2 * c * a))
    hc = a * sin(beta) = Abstand zur Geraden

    MfG

    Einmal editiert, zuletzt von Milla (6. Dezember 2010 um 21:53)

  • naja, die 3 Punkte ergeben nicht zwangsläufig ein Rechtwinkliges dreieck oder hab ich deinen Post falsch verstanden?

    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.

  • Hi,
    Milla hat geschrieben:

    du hast mit allen 3 punkten 3 seiten eines rechtwinkligen dreiecks und du suchst die Höhe auf c

    ..das ist im Prinzip richtig, aber drei Punkte in einer Ebene legen ein allgemeines Dreieck fest.
    (Deshalb ist es auch richtig, den Cosinus-Satz zu benutzen..)
    Im Spezialfall des allgemeinen Dreiecks(und das ist ein rechtwinkliges Dreieck) gilt der aber auch^^
    Siehe auch hier..
    Gruß
    ytwinky

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

    Einmal editiert, zuletzt von ytwinky (6. Dezember 2010 um 19:49)

  • Sorry dass das Dreieck rechtwicklig ist ist hier nicht richtig, es kann rechtwinklig sein ^^ habs nur irgendwie aus geistiger Abwesenheit geschrieben aber nichts desto trotz gelten die formeln um an die höhe c zu kommen welche die Entfernung von c zu AB angibt

    Einmal editiert, zuletzt von Milla (6. Dezember 2010 um 21:56)

  • Hm Also @alexanderschill,
    ich glaube nicht dass deine Lösung hinkommt...
    habe das auch mal gemacht, nur für den Rechenweg, ist natürlich noch verbuggt (Teilen durch 0 usw), aber im Endeffekt wie alexanderschill's Lösung:

    Spoiler anzeigen
    [autoit]

    Dim $p1[2]
    Dim $p2[2]
    Dim $p3[2]
    $p1[0] = inputbox("X-Koordinate des ersten Punktes", "Die X-Koordinate von P1")
    $p1[1] = inputbox("Y-Koordinate des ersten Punktes", "Die Y-Koordinate von P1")
    $p2[0] = inputbox("X-Koordinate des zweiten Punktes", "Die X-Koordinate von P2")
    $p2[1] = inputbox("Y-Koordinate des zweiten Punktes", "Die Y-Koordinate von P2")
    $p3[0] = inputbox("X-Koordinate des dritten Punktes", "Die X-Koordinate von P3")
    $p3[1] = inputbox("Y-Koordinate des dritten Punktes", "Die Y-Koordinate von P3")
    $m = ($p2[1]-$p1[1])/($p2[0]-$p1[0])
    $c = $p1[1]-$m*$p1[0]

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

    if $p3[1] = $m*$p3[0]+$c Then
    MsgBox(0, "Punkt auf Strecke", "Der Punkt liegt auf der Strecke")
    Else
    $m2 = -(1/$m)
    $c2 = $p3[1]-$m2*$p3[0]
    $xtref = ($c-$c2)/($m2-$m)
    $ytref = $m2*$xtref+$c2
    $strecke = sqrt(($p3[1]-$ytref)^2+($p3[0]-$xtref)^2)
    MsgBox(0, "test", $strecke)
    EndIf

    [/autoit]
  • Hi,
    versuchs mal so

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <Constants.au3>;Hier sind $IDYes usw. deklariert..
    ;<AutoItScript>
    Opt('MustDeclareVars', 0) ;0=ohne, 1=erfordert Variablen-Deklaration
    Const $ScriptType='GUI' ; Steht hier Console oder nur c erkennt Msg() daß es ein CUI.Programm ist..
    ;+----------------------------------------------------------------------------+
    ;| Header: Bestimmen der Übergabeparameter |
    ;| ( Alles Strings(!!!), bis auf $ArgC ) |
    ;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
    Const $Autor='hhfp.au3 ©2010 by ytwinky, MD'; |
    ;| EMail: [email='PIII1kSystem-AutoIt3Forum@yahoo.de'][/email] |
    ;| AutoIt3-Version: 3.3.6.1, Beta: -.-.-.- |
    ;| Editor: SciTE 1.79d, feste Schriftart |
    ;| Zweck : Schablone für den Anfang, nach Bedarf anpassen |
    ;| Tab auf 2 setzen wg. Lesbarkeit |
    ;+----------------------------------------------------------------------------+
    Const $Bewertung[2]=['bilden ein Dreieck', 'liegen auf einer Geraden']
    Dim $ar=60, $ah=10, $br=10, $bh=10, $cr=35, $ch=35, $p, $q, $h, $hp, $s, $Epsilon=0.001
    ;h=hp=25, p=q=25
    ;Rechnen wir's doch nach..
    $h=HHFP($ar, $ah, $br, $bh, $cr, $ch, $p, $q, $hp)
    $s=StringFormat('ARechts=%7.3f\tAHoch=%7.3f\nBRechts=%7.3f\tBHoch=%7.3f\nCRechts=%7.3f\tCHoch=%7.3f\n', $ar, $ah, $br, $bh, $cr, $ch)
    $s&=StringFormat('h=%7.3f\nh''=%7.3f\np=%7.3f\nq=%7.3f\n', $h, $hp, $p, $q)
    $s&='Die Punkte ' &$Bewertung[$h<$Epsilon] &'..'
    Msg($s)
    ;<AutoItFunctions>

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

    Func HHFP($ARechts, $AHoch, $BRechts, $BHoch, $CRechts, $CHoch, byRef $p, byRef $q, byRef $hp)
    Local $ab=Sqrt(($ARechts-$BRechts)^2+($AHoch-$BHoch)^2), $ac=Sqrt(($ARechts-$CRechts)^2+($AHoch-$CHoch)^2)
    Local $bc=Sqrt(($BRechts-$CRechts)^2+($BHoch-$CHoch)^2)
    $p=($ab*$ab+$bc*$bc-$ac*$ac)/(2*$ab)
    $q=$ab-$p
    $h=Sqrt($bc*$bc-$q*$q)
    $hp=($ac*$ac-$p*$p)/$h ;Berechnung nicht zwingend erforderlich..
    Return $h
    EndFunc

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

    Func Msg($What, $Title=$Autor, $Icons=0, $ErrLevel=0)
    Local $RetWert
    Switch StringLower($ScriptType)
    Case 'c', 'console', 'cui'
    ConsoleWrite($Title &@CrLf &$What)
    $RetWert=0
    Case Else
    $RetWert=MsgBox($Icons, $Title, $What)
    EndSwitch
    If $ErrLevel Then Exit $ErrLevel
    Return $RetWert
    EndFunc

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

    ;</AutoItScript>

    [/autoit]


    Ich habe [m]ein Pascal-Programm nach FreeBASIC portiert und dann nach AutoIt, also sollte es funktionieren..
    Gruß
    ytwinky

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

  • Hi,

    Wozu denn extra die Funktion Msg? Da reicht doch ne stinknormale MsgBox aus.

    Msg kann viel mehr als die Msgbox..
    ..z.B. bei Übergabe eines Parameters<>0 das Programm mit eben diesem ErrorLevel beenden :)
    Außerdem reicht ein Msg($s) aus, um Debug-Meldungen auszugeben(Programmierer sind eben faul..)
    Außerdem kann Msg in GUI- sowie in CUI-Programmen benutzt werden und last but not least:
    Es ist meine Lieblings-Ausgabefunktion 8)
    Reicht das?
    Gruß
    ytwinky

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

  • Da ich auch faul bin nutzt ich die Abbrevs ;).
    Schreib einfach mbox und drück die Leertaste, dann kommt MsgBox(0, "", |) und setzt den Cursor beim | hin.
    Ist einfacher als extra dafür noch Code zu haben, genau wie ConsoleWrite(@CRLF & |), das heißt cwrite.

  • Ich bin noch viel fauler, ich habe ein Standardskript für neue Programme

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <Constants.au3>;Hier sind $IDYes usw. deklariert..
    ;<AutoItScript>
    Opt('MustDeclareVars', 1) ;0=ohne, 1=erfordert Variablen-Deklaration
    Const $ScriptType='GUI' ; Steht hier Console oder nur c erkennt Msg() daß es ein CUI.Programm ist..
    ;+----------------------------------------------------------------------------+
    ;| Header: Bestimmen der Übergabeparameter |
    ;| ( Alles Strings(!!!), bis auf $ArgC ) |
    ;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
    Const $Autor='_neu.au3 ©2010 by ytwinky, MD'; |
    ;| EMail: [email='PIII1kSystem-AutoIt3Forum@yahoo.de'][/email] |
    ;| AutoIt3-Version: 3.3.6.1, Beta: -.-.-.- |
    ;| Editor: SciTE 1.79d, feste Schriftart |
    ;| Zweck : Schablone für den Anfang, nach Bedarf anpassen |
    ;| Tab auf 2 setzen wg. Lesbarkeit |
    ;+----------------------------------------------------------------------------+
    Const $ArgC=$CmdLine[0]
    Global $s='Das ist doch nur eine Schablone..'
    Msg($s)

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

    ;<AutoItFunctions>

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

    Func Msg($What, $Title=$Autor, $Icons=0, $ErrLevel=0)
    Local $RetWert
    Switch StringLower($ScriptType)
    Case 'c', 'console', 'cui'
    ConsoleWrite($Title &@CrLf &$What)
    $RetWert=0
    Case Else
    $RetWert=MsgBox($Icons, $Title, $What)
    EndSwitch
    If $ErrLevel Then Exit $ErrLevel
    Return $RetWert
    EndFunc

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

    ;</AutoItScript>

    [/autoit]

    Gruß
    ytwinky

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