Что вы ищете - это проективный масштаб. Самый простой способ сделать это вычислительно - использовать однородные координаты, взять прямоугольник (как на первом рисунке ниже), на котором V «бесконечно далеко вправо» и найти проективное преобразование, которое отображает этот прямоугольник в трапецию в вторая картина. Вершинами прямоугольника являются (0 | 0), (0 | d1), (b5 | d1), (b5 | 0) и соответствующие вершины трапеции: (0 | 0), (0 | d1), (b5 | d5), (b5 | 0).
Поскольку эти четыре точки которых не три не коллинеарны, мы можем найти уникальную матрицу (до масштабирования) M для этой трансформации. После некоторой математики, оказывается, что эта матрица:
[d1*b5,0,0]
[0,b5*d5,0]
[d1-d5,0,b5*d5]
Если вы хотите, чтобы найти координаты b3 и d3, например, вы можете умножить эту матрицу с однородными координатами точки в середине строки , т. е. вектор (0,5 * b5, d1,1)^T и вы получите однородные координаты точки (b3 | d3), которые можно преобразовать в евклидовы координаты путем дегомогенизации, т. е. делить первые две компоненты на третью.
В общем случае, если у вас есть две точки (b1 | d1) и (bn | dn) и вы хотите знать координаты n-2 равноотстоящих точек между ними в таком проективном масштабе, вы можете вычислить координаты bi и ди, как, как это (в вашем случае, п будет 5, конечно):
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
Как вы видите, это простой алгоритм для вычисления координат этих проективно равноудаленных точек, и это обобщающее красиво произвольных количество точек.
Если вы хотели бы иметь замкнутую формулу, можно вычислить би и ди непосредственно как:
let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1)
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1)
Это может быть http://math.stackexchange.com, что вы хотите. +1 для изображения в любом случае. – Popnoodles
Первый - этот вопрос потрясающий. Второй - @popnoodles, вероятно, правильный. В-третьих, вы ищете значения длины для каждого сегмента линии? –
@popnoodles: спасибо, я отправлю туда сейчас – razzak