Quello che stai cercando è una scala proiettiva. Il modo più semplice per farlo computazionalmente è usare le coordinate omogenee, prendere un rettangolo (come quello nella prima immagine sotto) su cui V è "infinitamente lontano a destra" e trovare una trasformazione proiettiva che mappa questo rettangolo al trapezio in la seconda immagine. I vertici del rettangolo sono (0 | 0), (0 | d1), (b5 | d1), (b5 | 0) e i corrispondenti vertici del trapezio sono (0 | 0), (0 | d1), (b5 | d5), (b5 | 0).
Poiché questi sono quattro punti di cui non allineati, possiamo trovare una matrice unica (fino a scalare) M per questa trasformazione. Dopo alcuni matematica, si scopre che questa matrice è:
[d1*b5,0,0]
[0,b5*d5,0]
[d1-d5,0,b5*d5]
Se si desidera trovare le coordinate B3 e D3, per esempio, è possibile moltiplicare questa matrice con le coordinate omogenee del punto al centro della linea , cioè il vettore (0,5 * b5, d1,1)^T e ottieni le coordinate omogenee del punto (b3 | d3), che può essere convertito in coordinate euclidee mediante la deomogenazione, ovvero dividendo le prime due componenti per il terzo.
In generale, se si hanno due punti (b1 | d1) e (bn | dn) e si vogliono conoscere le coordinate di n-2 punti equidistanti tra loro su una scala proiettiva come questa, è possibile calcolare le coordinate bi e di come in questo modo (nel tuo caso, n sarebbe 5, ovviamente):
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
come si vede, si tratta di un semplice algoritmo per calcolare le coordinate di questi punti proiettivamente equidistanti, e generalizza ben arbitrariamente numeri di punti.
Se si preferisce avere una formula chiusa, si può calcolare la bi e di direttamente come:
let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1)
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1)
Potrebbe essere http://math.stackexchange.com che si desidera. +1 per l'immagine comunque. – Popnoodles
Primo: questa domanda è fantastica. Secondo: @popnoodles è probabilmente corretto. Terzo: stai cercando i valori di lunghezza per ogni segmento di linea? –
@popnoodles: grazie pubblico qui ora – razzak