Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.03.2011, 08:37

Kürzesten Abstand zwischen Punkt und Geraden ermitteln

Hi,

ich habe hier ein Problem, bei dem mich leider meine Mathekenntnisse verlassen. Ich habe eine Gerade (2D reicht erstmal, 3D wäre aber schön) und einen Punkt und möchte jetzt den kürzesten Abstand zwischen beiden ermitteln.

Die Lösung gibt es im Prinzip unter http://www.rither.de/a/mathematik/linear…d-punkt-gerade/ nur leider kann ich mit den Formeln und Symbolen dort so gar nix anfangen. Demzufolge schaffe ich es natürlich auch nicht, die in Code umzusetzen.

Kann mir jemand helfen? Gibt es eventuell irgend wo fertige Lösungen? Oder wie mache ich mir aus diesen Formeln den entsprechenden C-Code?

Danke schon mal!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.03.2011, 11:59

In 2D ist das ganz einfach. Eine Gerade ist in 2D gegeben durch
§ ax + by + c = 0 §
Für jeden Punkt (x,y) der Gerade ist diese Gleichung erfüllt. Eine nette Eigenschaft dieser Gleichung ist dass sie, wenn du einen Punkt der nicht auf der Gerade liegt einsetzt, einen Wert liefert der dem Abstand des Punktes von der Gerade proportional ist.

3

04.03.2011, 12:37

Klingt ja mal gut, aber wofür stehen in der Gleichung a,b und c?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

04.03.2011, 12:41

Das ist die Koordinatenform. Hier nachzulesen. Das wären also die Vektorwerte x, y und z.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

04.03.2011, 13:02

Hm, ich fürchte nur, damit sind wir wieder bei meinem Problem: genau damit kann ich nämlich leider nix anfangen :-(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

04.03.2011, 13:10

a, b und c sind die Koeffizienten die die Gerade bestimmen. a und b entsprechen im Prinzip den Koordinaten des Normalvektors der Gerade und c der Verschiebung aus dem Ursprung entlang dieser Normale. wenn du zwei Punkte §\mathrm{\mathbf p}§ und §\mathrm{\mathbf q}§ der Gerade hast kannst du die Koeffizienten folgendermaßen berechnen:

§\mathrm{\mathbf n}_x = \mathrm{\mathbf p}_y - \mathrm{\mathbf q}_y \\ \mathrm{\mathbf n}_y = \mathrm{\mathbf q}_x - \mathrm{\mathbf p}_x \\ l = \sqrt{\mathrm{\mathbf n}_x^2 + \mathrm{\mathbf n}_y^2} \\ a = \frac{\mathrm{\mathbf n}_x}{l} \\ b = \frac{\mathrm{\mathbf n}_y}{l} \\ c = -(a \cdot \mathrm{\mathbf p}_x + b \cdot \mathrm{\mathbf p}_y)§

Wenn du die Koeffizienten so berechnest (Normalvektor normalisiert) dann liefert dir §a \cdot x + b \cdot y + c§ den Abstand des Punktes (x, y) von der Geraden (wobei das Vorzeichen anzeigt auf welcher Seite der Punkt liegt, wenn du nur den Abstand willst musst du den Betrag davon nehmen).

Ich würde dir allerdings sehr empfehlen dich auf jeden Fall mit den Grundlagen der Vektorrechnung zu beschäftigten da das sehr, sehr, sehr wichtig für die Spieleprogrammierung ist (und es ist auch nicht wirklich schwer).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (04.03.2011, 13:16)


7

04.03.2011, 13:19

Ich würde dir allerdings sehr empfehlen dich auf jeden Fall mit den Grundlagen der Vektorrechnung zu beschäftigten da das sehr, sehr, sehr wichtig für die Spieleprogrammierung ist (und es ist auch nicht wirklich schwer).



Naja, meine Schulzeit (und damit meine nötigen Grundlagen) ist jetzt fast 40 Jahre her und ich brauche die Geschichte jetzt auch nur für einen Anwendungsfall (und nicht gleich für eine komplette 3D-Engine), aber ich versuche mal, aus deinen Informationen was gebaut zu bekommen!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

04.03.2011, 13:30

Naja, meine Schulzeit (und damit meine nötigen Grundlagen) ist jetzt fast 40 Jahre her und ich brauche die Geschichte jetzt auch nur für einen Anwendungsfall (und nicht gleich für eine komplette 3D-Engine), aber ich versuche mal, aus deinen Informationen was gebaut zu bekommen!

Ok, wenn es nur um einen Anwendungsfall geht dann nimm einfach die Formeln die ich oben hingeschrieben hab (die sollten sich praktisch 1:1 in Code gießen lassen), im Prinzip hab ich dir einfach nur ausgeschrieben was man sonst mit Vektoren ausdrücken würde. Die Vektorschreibweise ist einfach nur ein Weg um solche Dinge kompakt zu notieren. Ich vermute mal dass du Probleme mit Ausdrücken dieser Art hattest:

§ \mathrm{\mathbf g}(t) = \begin{pmatrix} x_1 \\ y_1 \\ z_1 \end{pmatrix} + t \cdot \begin{pmatrix} x_2 \\ y_2 \\ z_2 \end{pmatrix} §

Im Prinzip ist das nur ein Weg um folgendes aufzuschreiben:

§ \mathrm{\mathbf g}_x(t) = x_1 + t \cdot x_2 \\ \mathrm{\mathbf g}_y(t) = y_1 + t \cdot y_2 \\ \mathrm{\mathbf g}_z(t) = z_1 + t \cdot z_2 §

Es zahlt sich auf jeden Fall aus mit den Grundlagen der Vektorrechnung vertraut zu werden, nicht nur für die Spieleprogrammierung bzw. alles was mit Grafik zu tun hat (dort ist es nur auf jeden Fall wesentliche Grundlage, spätestens 3D wäre anders eine unglaubliche Qual). Wenn du dir z.B. eine Klasse für Vektoren schreibst die entsprechende überladene Operatoren bereitstellt kannst du nämlich direkt im Code mit Vektornotation arbeiten. Das spart nicht nur viel Arbeit sondern macht den Code auch sehr viel lesbarer und damit weniger anfällig für fast unsichtbare Tippfehler...aber ich schweife vom Thema ab ;)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (04.03.2011, 13:41)


Werbeanzeige

Ähnliche Themen