AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein 2 Vektoren und 1 Punkt, wo näher drann?
Thema durchsuchen
Ansicht
Themen-Optionen

2 Vektoren und 1 Punkt, wo näher drann?

Ein Thema von Jonas Shinaniganz · begonnen am 5. Apr 2012 · letzter Beitrag vom 12. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2      
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.404 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 15:37

Immoment Berechne Ich die beiden Roten Vektoren und schaue welcher kürzer ist. Ich will aber den Betrag der Grauen Linien berechnen und die länge vergleichen...
also gehts dir um den senkrechten Abstand zum Vektor (der im übrigend nicht der kürzeste Abstand sein muss) - das ist einfach: Zieh eine weitere Rote Linie zu dem Polygonpunkt in der Mitte (das Rote X). Damit kannst Du alle Längen in dem Dreieck bestimmen, über die Längen die Winkel und mit den Winkeln in einem der rechtwinkligen Dreiecke in denen der Abstand eine Kathete ist, diese berechnen. So würde ich das Problem lösen, weiß nicht ob es da verktortechnisch andere Vorgehensweisen gibt...

Grüße
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 16:00
Den senkrechten Abstand zu einer Strecke kannst du im zweidimensionalen Raum über das Kreuzprodukt berechnen (s. Anhang).
[edit]
Sorry, habe wohl zu lange mit dreidimensionalen Vektoren hantiert... Das „Kreuzprodukt“ ist ja für den zweidimensionalen Raum nicht wirklich definiert. Was ich damit meinte ist:
Delphi-Quellcode:
function „Kreuzprodukt“ (A, B: TVec2): Single;
begin
  Result := A.X*B.Y - A.Y*B.X;
end;
Es kommt, wie du siehst, auch kein Vektor heraus, sondern ein Skalar, aber mehr brauchen wir hier ja auch gar nicht
[/edit]

Btw, darf man fragen, was du programmierst? Deine Skizze erinnert mich nämlich extrem an den kleinen Sonic-Klon (* nicht wirklich ein Klon, aber die Engine nachprogrammiert), den ich letztes Jahr geschrieben habe
Angehängte Grafiken
Dateityp: png scr5158_20120405.png (37,7 KB, 23x aufgerufen)

Geändert von Namenloser ( 5. Apr 2012 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 16:31
Ach noch etwas:
Delphi-Quellcode:
// das hier
  OrtsVektorPrevPoint : array [0..1] of Double;
sieht nicht schön aus.

Lieber soetwas:
Delphi-Quellcode:
type
  TVector2d = record
  case Boolean of
    False: (X: Double; Y: Double);
    True: (Values: Array[0..1] of Double);
  end;

(...)
var
  P: TVector2d;
Damit kannste nämlich direkt per P.X und P.Y oder P.Values[0] und P.Values[1] auf die X & Y Koordinaten zugreifen

Praktisch sind dann noch folgende Erweiterungen:
Delphi-Quellcode:
  TVector2d = record
    procedure Assign(const newX, newY: Double);
    function Length: Double;
  case Boolean of
    False: (X: Double; Y: Double);
    True: (Values: Array[0..1] of Double);
  end;
    

procedure TVector2d.Assign(const newX, newY: Double);
begin
  X := newX;
  Y := newY;
end;

function TVector2d.Length: Double;
begin
  Result := SQRT(X*X + Y*Y);
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 5. Apr 2012 um 16:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 16:43
Den senkrechten Abstand zu einer Strecke kannst du im zweidimensionalen Raum über das Kreuzprodukt berechnen (s. Anhang).
[edit]
Sorry, habe wohl zu lange mit dreidimensionalen Vektoren hantiert... Das „Kreuzprodukt“ ist ja für den zweidimensionalen Raum nicht wirklich definiert. Was ich damit meinte ist:
Delphi-Quellcode:
function „Kreuzprodukt“ (A, B: TVec2): Single;
begin
  Result := A.X*B.Y - A.Y*B.X;
end;
Es kommt, wie du siehst, auch kein Vektor heraus, sondern ein Skalar, aber mehr brauchen wir hier ja auch gar nicht
[/edit]
Richtig wäre es so (Skalarprodukt):
A.X * B.X + A.Y * B.Y

=P

Edit: Soweit ich das richtig in Erinnerung, haben wir bei der Formel cos(Winkel) = (a x b) / (|a| * |b|) beim "x" das Skalarprodukt berechnet (im 2D Raum)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 16:44
Richtig wäre es so (Skalarprodukt):
A.X * B.X + A.Y * B.Y

=P
Ich meine aber nicht das  Skalarprodukt


Mein „Kreuzprodukt“ ist im Grunde das Skalarprodukt mit einem Vektor orthogonal zu Vektor B. Du kannst im zweidimensionalen Raum ja leicht einen orthogonalen Vektor bilden, indem du die Koordinaten wie folgt vertauschst: (X, Y) → (Y, -X). Wenn du das dann in das Skalarprodukt einsetzt, kommst du auf meine Formel.

Geändert von Namenloser ( 5. Apr 2012 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 16:45
Hmm... Siehe Edit
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 16:59
Edit: Soweit ich das richtig in Erinnerung, haben wir bei der Formel cos(Winkel) = (a x b) / (|a| * |b|) beim "x" das Skalarprodukt berechnet (im 2D Raum)
Es gibt zwei sehr ähnliche Formeln, einmal für den Sinus bzw. das Kreuzprodukt und einmal für den Kosinus bzw. das Skalarprodukt:
  1. |a × b| = |a| * |b| * sin(φ)
  2. a * b = |a| * |b| * cos(φ)
Ich nehme an, du hast die beiden Formeln verwechselt...
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 5. Apr 2012, 17:18
Danke, ja ich habe #2 gemeint. Da scheint das kein "x" zu sein, sondern einfach ein "*"..
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 6. Apr 2012, 01:09
also gehts dir um den senkrechten Abstand zum Vektor (der im übrigend nicht der kürzeste Abstand sein muss)
Doch, muss er. Bei Strecken (im Gegensatz zu Geraden) kommt allerdings noch hinzu, dass man ggf. gar keinen orthogonalen Abstand zu einem Punkt bilden kann - in dem Fall ist der Abstand zu einem der beiden streckenbegrenzenden Punkten der gesuchte. Glaub mir, darauf basierte ein größerer Teil meiner Bachelorarbeit (Die übrigens nichts mit Spielen zu tun hatte. Man kann das ganze auch total "seriös" anwenden )
Bei Kurven gilt das übrigens nicht mehr, was auch bei mir der Grund war meine Splines in eine Serie von Strecken aufzulösen bevor ich die Abstände berechnet habe. (So ähnlich schaut das beim TE auch aus.) Das ging flotter als Schnitte mit Funktionen 3. Grades (plus Normalenberechnung auf einer kontinuierlichen Funktion), selbst bei Subpixelauflösung. Fazit: So lange alles linear bleibt, ist der orthogonale Abstand auch der kleinste (bzw. kleinst-mögliche).

\\Edit: Lösung:
Berechne die Normale zu deinen "Vektoren" (aka Strecken, aka begrenzten Geraden) nach der von NamenLozer genannten Weise. Bilde mit diesen Normalen eine Gerade, die auf deinem "grünen Punkt" fußt, und berechne die Schnittpunkte zwischen diesen und den von deinen "Vektoren" gebildeten Geraden. Dabei bekommst du jeweils zwei skalare Parameter, einer, der sagt um wie viel der Länge deiner "Vektoren" verschoben der Schnittpunkt liegt (so lange du diese nicht vorher noch umherskalierst). Ist dieser innerhalb (0, 1), dann ist der Abstand zwischen dem Schnittpunkt und deinem grünen Punkt einer der beiden Kandidaten. Dann einfach den Abstand zwischen den 2 Schnittpunkten und deinem grünen berechnen, und der kleinere ist es. (Mit etwas Geschick kann dafür auch der 2. Parameter verwendet werden, aber da in der Regel eh skaliert/normalisiert werden müsste, ist es in der Praxis nahezu gleich schnell einfach die Abstände "naiv" zu berechnen).
Sollte einer/beide der Parameter ausserhalb (0, 1) liegen, musst du den Abstand vom grünen Punkt zu den zwei Randpunkten der betroffenen Strecke(n) bilden, und der kleinere ist dann der Abstand zu der jeweiligen Strecke. Der abschließende Vergleich bleibt natürlich gleich.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 6. Apr 2012 um 02:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#10

AW: 2 Vektoren und 1 Punkt, wo näher drann?

  Alt 10. Apr 2012, 10:37
Hi, bin über Ostern zu nichts gekommen und wollte mich noch kurz für die vielen Hilfestellungen bedanken.

Bei mir geht es um einen Graphischen Editor in welchem User per Klick neue Punkte eintragen können und die Punkte sind fortlaufend sortiert. (Nicht Räumlich sonder in der zugefügten Reihenfolge) Zusätzlich sollen aber nun Punkte auch in den räumlichen Aspekt eingefügt werden können und dafür muss ich meine Reihe "aufbrechen" um die Punkte korrekt einzufügen und nicht anzuhängen.

ps.: hat garnichts mit spielen zu tun
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz