Próbuję ekstrapolować z segmentu linii, aby znaleźć punkt na linii, ale na trzecim miejscu „wstecz”, tj. Próbuję znaleźć punkt new
, podane punkty A
i B
poniżej:
Biorąc pod uwagę linię, mogę interpolować ją, aby uzyskać pozycję w dowolnym określonym procencie wzdłuż niej:
=# select st_line_interpolate_point(
st_makeline('0101000020E6100000300DC347C49418C03EE8D9ACFAA44A40',
'0101000020E6100000FB743C66A03218C0CDCCCCCCCC7C4A40'),
0.333);
0101000020E6100000ED45B41D537718C069C6A2E9EC984A40
Próbowałem wprowadzić liczbę ujemną, aby znaleźć punkt wzdłuż linii w przeciwnym kierunku, ale to się nie udaje, ponieważ argument interpolacji musi znajdować się w zakresie [0, 1]
Myślałem o pierwszym skalowaniu linii, ale to nie używa środka linii jako źródła, więc jest bezużyteczne dla moich celów.
źródło
Rozwiązałem to za pomocą:
Wyjaśnienie:
(2-d) Skaluj punkt początkowy współczynnik 1,3333, przyjmując punkt środkowy segmentu linii za początek skalowania.
Wyjmij papier milimetrowy!
http://en.wikipedia.org/wiki/Affine_transformation
źródło
Napisałem dla tego funkcję:
Stosowanie:
Zauważ, że daje to dłuższe oznaczenie linii, ale nie punkt końcowy.
Kod na GitHub Gist (jeśli głosujesz tutaj, doceniłbym tam również gwiazdę)
Opis parametrów (w przypadku ich pominięcia w komentarzu funkcji sql):
źródło
original_length * head_rate + head_constant
. Jeśli chcesz, żeby się podwoiła, to częstotliwość podnoszenia wynosi 2, stała wynosi 0. Na Węgrzech zwykle używamy projekcji EOV, która jest oparta na metrach. Więc jeśli chcę dodać 2 metry na końcu linii, ustawiam tail: rate na 1, a tail_constant na 2.