Ich versuche aus einem Liniensegment zu extrapolieren, um einen Punkt auf der Linie zu finden, aber ein Drittel des Rückwegs, dh, um einen Punkt zu finden new
, gegebene Punkte A
und B
darunter:
Bei einer gegebenen Linie kann ich sie interpolieren, um eine Position mit einem bestimmten Prozentsatz zu erhalten:
=# select st_line_interpolate_point(
st_makeline('0101000020E6100000300DC347C49418C03EE8D9ACFAA44A40',
'0101000020E6100000FB743C66A03218C0CDCCCCCCCC7C4A40'),
0.333);
0101000020E6100000ED45B41D537718C069C6A2E9EC984A40
Ich habe versucht, eine negative Zahl einzugeben, um einen Punkt entlang der Linie in die entgegengesetzte Richtung zu finden. Dies schlägt jedoch fehl, da das Interpolationsargument im Bereich [0, 1] liegen muss.
Ich habe darüber nachgedacht, zuerst die Linie zu skalieren, aber dabei wird die Mitte der Linie nicht als Ursprung verwendet. Daher ist dies für meine Zwecke nutzlos.
quelle
Habe es gelöst mit:
Erläuterung:
(2-d) Skalieren Sie den Startpunkt um den Faktor 1,3333, wobei Sie den Mittelpunkt des Liniensegments als Ausgangspunkt für die Skalierung verwenden.
Hol das Millimeterpapier raus!
http://en.wikipedia.org/wiki/Affine_transformation
quelle
Ich habe dazu eine Funktion geschrieben:
Verwendung:
Beachten Sie, dass dies die längere Linienfolge ergibt, jedoch nicht den Endpunkt.
Code auf GitHub Gist (wenn du hier upvotest, würde ich mich auch über einen Stern freuen)
Beschreibung der Parameter (falls Sie sie im Kommentar der SQL-Funktion verpasst haben):
quelle
original_length * head_rate + head_constant
. Wenn Sie möchten, dass es sich verdoppelt, ist die Kopffrequenz 2, die Konstante 0. In Ungarn wird normalerweise die EOV-Projektion verwendet, die auf einem Meter basiert. Wenn ich also 2 Meter zum Ende der Linie hinzufügen möchte, setze ich den Tail: rate auf 1 und die tail_constant auf 2.