Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 18.03.2005, 22:05 Titel: Abstand eines Punktes von einer Geraden - wie berechnen? |
|
|
Hat jemand Lust, für die QB-MonsterFAQ die folgende Frage mit der Lösungs-Herleitung einem kleinen Programmbeispiel zu beantworten?
Wie berechne ich den (kürzesten) Abstand eines Punktes von einer Geraden?
- Der Punkt hat die Koordinaten P1(x1|y1)
- Die Gerade wird durch ihre Gleichung in der Normalform y = mx + t beschrieben
. m = Steigung = Tangens des Steigungswinkels
. t = Y-Achsen-Abschnitt _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 18.03.2005, 23:41 Titel: |
|
|
ach nur 2D-Koords.. na dann veruch ichs mal:
der kürzeste Abstand eines Punktes zu einer Geraden ist senkrecht zur Gerade gemessen. Also bestimmt man zunächst die senkrechte Gerade.
Die Steigung dieser Geraden ist:
Mit der Steigung und dem Punkt (x1|y1) kann man den Achsenabschnitt t berechnen:
Die Gleichung der senkrechten heißt also:
y = m2 * x + t2
Jetzt sucht man den Schnittpunkt der beiden Geraden, die x-Koordinate erhält man duch gleichsetzen der Ausgangsgeraden mit der senkrechten Geraden:
m2 * x + t2 = m * x + t <=> m * x - m2 * x = t - t2 <=> x (m - m2) = t2 - t
Code: | x2 = (t2 - t) / (m - m2) |
Die y-Koordinate ist dann einfach x eingesetzt:
Und so ergibt sich für den Abstand:
Code: | d = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2) |
Das vollständige Programm sieht also so aus:
Code: | 'Gegeben sind m, x1 und y1.
m2 = -1/m
t2 = y1 - m * x1
x2 = (t2 - t) / (m - m2)
y2 = m2 * x2 + t2
d = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
PRINT "Der Abstand ist"; d |
Ok so?  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 18.03.2005, 23:48 Titel: |
|
|
Hier erst mal die Berechnungs Funktion:
Code: | FUNCTION Abstand (x1, y1, m, t)
IF m <> 0 THEN
m2 = -1 / m
t2 = y1 - m2 * x1
x2 = (t2 - t) / (m - m2)
y2 = m * x2 + t
Abstand = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
ELSE
Abstand = ABS(y1 - t)
END IF
END FUNCTION |
Und dann noch die Erklärung:
Erst mal muß die Gleichung für eine Gerade aufgestellt werden, die Senkrecht zur gegeben Gerade steht:
y = m2 * x + t2
wobei m2 = -1 / m
Den Y-Achsen Abschnit dieser Gerade kann man durch einsetzen des Punktes P1 ermitteln:
t2 = y1 - m2 * x1
Dort wo die beiden Geraden sich schneiden ist der Punkt P2(x2|y2). P2 ist der Punkt, auf der Ursprünglichen Geraden, welcher dem Punkt P1 am nächsten liegt:
y2 = y2
m * x2 + t = m2 * x2 + t2
x2 = (t2 - t) / (m - m2)
y2 = m * x2 + t
Jetzt muß nur noch der Abstand zwischen den Punkten P1 und P2 mit Pythagoras berechnet werden:
Abstand = SQR(dx² + dy²)
Abstand = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
Sonderfall:
Wenn die Steigung m gleich Null ist, dann ist der Abstand anders zu berechnen. Dann wird die Differenz zwischen y1 und dem y-Achsen-Abschnitt t der Gerden ermittelt:
Abstand = ABS(y1 - t) |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 19.03.2005, 03:06 Titel: |
|
|
Hm, welches nehmen wir jetzt?
Meine Erklärung um deinen Sonderfall ergänzt? _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 19.03.2005, 11:14 Titel: |
|
|
Was heißt hier ergänzt. Ich habe doch extra das Rechnen angefangen und habe das ganz nur etwas später abgeschickt. Ich würde einfach die beiden Beiträge zu einem kombinieren. Sie sind ja fast identisch. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 19.03.2005, 17:02 Titel: |
|
|
ja, sieben Minuten
Ich denk, Thomas schafft das (oder?)  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 19.03.2005, 19:42 Titel: Mein Entwurf für die QB-MonsterFAQ lautet.... |
|
|
Mein Entwurf für die QB-MonsterFAQ lautet wie folgt:
---------------------------------------------------------------------------------
Frage deutsch
~~~~~~~~~~~~~~~~
Wie berechne ich den Abstand eines Punktes von einer Geraden?
Question English
~~~~~~~~~~~~~~~~
How to figure out the distance of a point to a straight line?
Antwort
~~~~~~~~~~~~~~~~
[ von stef und MisterD im QB-Forum, .2005 ]
Der kürzeste Abstand eines Punktes P1 von einer Geraden g ergibt sich, wenn man
das Lot von dem Punkt P1 auf die Gerade fällt (die "Lot-Gerade" steht senkrecht
auf der geraden g und geht durch den Punkt P1). Das Lot hat auf der Geraden g
den "Fußpunkt" P2. Die Strecke P1-P2 ist dann die kürzeste Verbindung des
Punktes P1 mit der Geraden.
Für die folgenden Betrachtungen werden einige Abkürzungen definiert
- Der Punkt hat die Koordinaten P1(x1|y1)
- Die Gerade g wird durch ihre Gleichung in der Normalform y = mx + t
beschrieben
. m = Steigung = Tangens des Steigungswinkels
. t = Y-Achsen-Abschnitt
- Der Punkt P2(x2|y2) ist der Fußpunkt des Lotes vom Punkt P1 auf die Gerade g
Und hier die Ableitung des Lösungsweges:
Die Ursprungsgerade hat die Gleichung
(1) y = my + t
Zunächst stellen wir die Gleichung für die "Lot-Gerade" auf, die auf der
gegebenen Geraden g senkrecht steht:
(2) y = m2 * x + t2, wobei
(3) m2 = -1 / m gilt
Den y-Achsen Abschnitt t2 dieser Lot-Geraden ermittelt man durch Einsetzen des
Punktes P1(x1|y1) in die Gleichung (2):
(4) t2 = y1 - m2 * x1
Die beiden Geraden schneiden sich im "Lotfußpunkt" P2(x2|y2). P2 ist der
Punkt, auf der ursprünglichen Geraden g, welcher dem Punkt P1 am nächsten liegt
Die Koordinaten x2 und y2 von P2 berechnen wir, indem wir die Gleichungen
und (1) und (2) gleichsetzen:
(5) m * x2 + t = m2 * x2 + t2
hieraus folgt:
(6) x2 = (t2 - t) / (m - m2)
(7) y2 = m * x2 + t
Zur Erinnerung: t2 und m2 hatten wir ja in (3) und (4) ermitelt.
Jetzt muß nur noch der Abstand zwischen den Punkten P1 und P2 mit dem Satz des
Pythagoras berechnet werden:
(8) Abstand = SQR(dx² + dy²)
(9) Abstand = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
Sonderfall:
Wenn die Steigung m gleich Null ist, dann ist der Abstand anders zu berechnen:
Der gesuchte Abstand ergibt sich in diesem Falle aus der Differenz zwischen y1
und dem y-Achsen-Abschnitt t der Geraden.
Das folgende QBasic-Programm setzt die geschilderte Rechenvorschrift
programmtechnisch um:
Code: |
'*******************************************************************
' PUNGERAD.BAS = Abstand eines Punktes von einer Geraden berechnen
' ============
' Dieses Q(uick)Basic-Programm berechnet den Abstand eines Punktes
' P1(x1|y1) von der Geraden y = mx + t (m ist die Steigung und t
' der Y-Achsenabschnitt)
'
' (c) stef und MisterD, 18.3.2005
'*******************************************************************
DECLARE FUNCTION Abstand (x1, y1, m, t)
DO
CLS
PRINT "Punkt P1(x1y1) eingeben"
PRINT
INPUT " Gib die x-Koordinate des Punktes ein:.....x1 = ", x1
INPUT " Gib die y-Koordinate des Punktes ein:.....y1 = ", y1
PRINT
PRINT
PRINT "Gerade y=mx+t eingeben"
PRINT
INPUT " Gib die Steigung m ein:...................m = ", m
INPUT " Gib den y-Achsenabschnitt t ein:..........t = ", t
PRINT
PRINT
PRINT "Der Abstand des Punktes P1 von der Geraden g betraegt a =";
PRINT Abstand(x1, y1, m, t)
PRINT
PRINT
PRINT "Neue Berechnung...[Beliebige Taste] ______ Beenden...[Esc] "
DO: Taste$ = INKEY$: LOOP UNTIL Taste$ <> "" 'Warten auf Tastendruck
IF Taste$ = CHR$(27) THEN END
LOOP
'
FUNCTION Abstand (x1, y1, m, t)
'*******************************************************************
'Abstandes des Punktes P1(x1|y) von der Geraden g (y=mx+t) berechnen
IF m <> 0 THEN
m2 = -1 / m 'Steigung der "Lotgeraden" von P1 auf g
t2 = y1 - m2 * x1 'y-Achsenabschnitt der Lotgeraden
x2 = (t2 - t) / (m - m2) 'x- und y-Koordinaten des...
y2 = m * x2 + t '...Lotfusspunktes
Abstand = SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
ELSE 'Sonderfall: g ist eine Parallele zur x-Achse
Abstand = ABS(y1 - t)
END IF
END FUNCTION
|
--------------------------------------------------------------------------------- _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 21.03.2005, 22:27 Titel: |
|
|
Im Rahmen meines MiniCAD-Projekts hatte ich bereits früher einmal dieses Problem gelöst:
http://beilagen.dreael.ch/QB/LOT_ABST.BAS
Wichtig: Der Code entstand ursprünglich auf einem Commodore Amiga mit AmigaBASIC => daher noch ein SCREEN 12 am Anfang ergänzen.
Wichtige Differenz mit den anderen hier dargestellten Lösungen: Die Gerade wird als Linie mit zwei Endpunkten (LINE-Befehl) anstelle einer Gleichung dargestellt.
Wenn man den Abstand immer positiv haben möchte, muss man noch ein ABS() einbauen, ansonsten gibt einem das Vorzeichen an, ob von (x1,y1) aus Richtung (x2,y2) betrachtet sich der Punkt links oder rechts befindet. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|