![]() |
Delphi-Version: 5
Determinante 3 Punkte Kreis
Hallo,
ich habe aus dem Internet folgendes Copy&Pasted / aus VB.NET übetragen:
Delphi-Quellcode:
Hier wird geprüft ob bei 3 Punkten der Punkt C links von AB liegt.
function isLeft(a, b, c: TPoint) : boolean;
begin Result := ((c.y - a.y)*(b.x - a.x) - (b.y - a.y)*(c.x - a.x)) < 0; end; Ich verstehe aber nicht warum das so ist, kann mir das einer erklären? Viele Dank. |
AW: Determinante 3 Punkte Kreis
|
AW: Determinante 3 Punkte Kreis
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Die von Sherlock verlinkte Erklärung ist gut, aber nicht besonders anschaulich, finde ich. Deine "isLeft"-Funktion sollte wohl eher "isRight" heißen, denn sie liefert False für den kleinen Test A(1|1), B(3|2), C(2|3), obwohl dieser Punkt C links von AB liegt. Es kommt darauf an, welche "Richtung" man der Geraden gibt. Interpretiert man sie als "von A nach B", dann liefert die Formel positive Werte wenn C links liegt, interpretiert man die Gerade aber als "von B nach A", dann liefert sie negative wenn C links liegt. Die Formel ist im Prinzip nichts anderes als ein zweidimensionals Kreuzprodukt ( ![]() Falls du das Kreuzprodukt nicht kennst und auch von Vektoren keine Ahnung hast, müsste ich viel zu weit ausholen... Aber wenn du Grundkenntnisse hast, lass es mich wissen und ich werde es erklären. Ansonsten hier eine Zerlegung des Codes von mir, die helfen könnte:
Delphi-Quellcode:
Und
function Kreuzprodukt2D(x0, y0, x1, y1: Single): Single; inline;
begin Result := x0 * y1 - x1 * y0; end; // PunktAufSeite: Bestimmt, auf welcher Seite einer Gerade ein Punkt ist. // Der zu testende Punkt P ist (px,py), die Gerade geht durch die Punkte A (ax,ay) und B (bx,by) // Rückgabewert: < 0 Punkt ist rechts, > 0 Punkt ist links, = 0 Punkt ist auf der Geraden function PunktAufSeite(ax, ay, bx, by, px, py: Single): Single; begin // 2D Kreuzprodukt der Vektoren von A nach B und von A nach P // = Kreuzprodukt(B-A, P-A) // = (bx-ax) * (py-ay) - (px-ax) * (by-ay) Result := Kreuzprodukt2D(bx - ax, by - ay, px - ax, py - ay); end; ![]() Da das aber etwas unübersichtlich ist und dein Problem nur 2D ist, habe ich schnell ein kleines ![]() ![]() |
AW: Determinante 3 Punkte Kreis
Also in dem Fall ist Determinante und Kreuzprodukt das gleiche. Man bildet aus 3 Vektoren 2 und nach Ausrechnung erhält man quasi:
Länge Vektor 1 * Länge Vektor 2 * sin vom Winkel zwischen denen. Ergebnis > 0 heißt: Winkel zwischen 0 und 180 (oder 0 und PI wenn man so will) Ergebnis < 0 heißt: Winkel zwischen 180 und 360 (oder PI und 2PI) Also wenn das Vorzeichen des Kreuzproduktes negativ ist, befindet sich C links von AB und wenn positiv rechts von AB. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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