Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Abstand eines Punktes von einer Geraden - wie berechnen?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 18.03.2005, 22:05    Titel: Abstand eines Punktes von einer Geraden - wie berechnen? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 18.03.2005, 23:41    Titel: Antworten mit Zitat

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:
Code:
m2 = -1/m

Mit der Steigung und dem Punkt (x1|y1) kann man den Achsenabschnitt t berechnen:
Code:
t2 = y1 - m * x1

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:
Code:
y2 = m2 * x2 + t2

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? happy
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 18.03.2005, 23:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 19.03.2005, 03:06    Titel: Antworten mit Zitat

Hm, welches nehmen wir jetzt? mit den Augen rollen

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
Benutzer-Profile anzeigen Private Nachricht senden
stef



Anmeldungsdatum: 13.01.2005
Beiträge: 102

BeitragVerfasst am: 19.03.2005, 11:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 19.03.2005, 17:02    Titel: Antworten mit Zitat

ja, sieben Minuten durchgeknallt

Ich denk, Thomas schafft das (oder?) zwinkern
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 19.03.2005, 19:42    Titel: Mein Entwurf für die QB-MonsterFAQ lautet.... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 21.03.2005, 22:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz