To, czego szukasz, to skala rzutowa. Najprościej zrobić to obliczeniowo, to użyć homogenicznych współrzędnych, wziąć prostokąt (jak ten na pierwszym obrazku poniżej), na którym V jest "nieskończenie daleko na prawo" i znaleźć transformację rzutową, która odwzorowuje ten prostokąt na trapez w drugie zdjęcie. Wierzchołki prostokąta to (0 | 0), (0 | d1), (b5 | d1), (b5 | 0), a odpowiednie wierzchołki trapezu to (0 | 0), (0 | d1), (b5 | d5), (b5 | 0).
Ponieważ są to cztery punkty, z których żadne trzy nie są współliniowe, możemy znaleźć unikalną matrycę (do skalowania) M dla tej transformacji. Po kilku matematyki, okazuje się, że ta matryca jest:
[d1*b5,0,0]
[0,b5*d5,0]
[d1-d5,0,b5*d5]
Jeśli chcesz znaleźć B3 koordynuje i D3, na przykład, można pomnożyć macierz jednorodnych współrzędnych punktu w środku linii tzn. wektor (0,5 * b5, d1,1)^T i otrzymujesz homogeniczne współrzędne punktu (b3 | d3), które można przekształcić na współrzędne euklidesowe przez dehomogenizację, tj. dzieląc pierwsze dwa składniki przez trzeci.
Ogólnie, jeśli masz dwa punkty (b1 | d1) i (bn | dn) i chcesz znać współrzędne n-2 w równych odległościach pomiędzy nimi na skali rzutowej takiej jak ta, możesz obliczyć współrzędne bi i di jako takiego (w przypadku, n byłoby 5, oczywiście):
let M := matrix [[d1*bn, 0, 0], [0, bn*dn, 0], [d1-dn, 0, bn*dn]]
let v := ((i-1)/(n-1)*bn, d1, 1)
let (x,y,z) := M*v
let bi := x/z and di := y/z
jak widać, jest to prosty algorytm do obliczania współrzędnych tych projectively równoodległych punktach, a to generalizowaniu ładnie arbitralny liczba punktów.
Jeśli wolisz mieć zamkniętą formułę, można obliczyć bi oraz di bezpośrednio jako:
let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1)
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1)
To może być http://math.stackexchange.com że chcesz. +1 dla zdjęcia mimo to. – Popnoodles
Po pierwsze - to pytanie jest niesamowite. Po drugie - @popnoodles jest prawdopodobnie poprawny. Po trzecie - czy szukasz wartości długości dla każdego segmentu linii? –
@popnoodles: dzięki, opublikuję tam teraz – razzak