Координаты точки на заданном расстоянии на UIBezierPath

У меня есть линия UIBezierPath, и я хотел бы получить координаты точки, которая находится на этой линии на заданном расстоянии от начала этой линии. Под расстоянием я подразумеваю расстояние Вдоль линии.

На следующем рисунке я ищу x и y.

введите здесь описание изображения

Идеальным решением был бы метод, который принимает в качестве аргумента расстояние и возвращает координаты.

CGPoint myPoint = [myLine pointAtdistance:53.21]

Существует ли нечто подобное? Я думал, что это будет распространенная проблема, но не смог найти соответствующей информации в Интернете. Может я не то ищу?

Спасибо.


person Legisey    schedule 18.02.2014    source источник
comment
Если вы имеете в виду расстояние от начальной точки, то результат, который вы ищете, может быть не уникальным.   -  person mathematician1975    schedule 18.02.2014
comment
Я имею в виду расстояние от начальной точки вдоль линии. Я отредактирую свой вопрос :)   -  person Legisey    schedule 18.02.2014
comment
У вас есть кривые сегменты на вашем пути? Каково типичное использование - один путь и много запросов расстояния?   -  person MBo    schedule 18.02.2014
comment
Сегмент не имеет кривой. Типичное использование - один путь с большим количеством запросов расстояния (обычно по одному).   -  person Legisey    schedule 18.02.2014


Ответы (1)


Если путь не содержит сегментов кривых, а только линейные, и запросов по расстоянию для одного пути много, то можно использовать некоторую предобработку (1-й пункт):

1. Calculate length of every segment, and cumulative path length till this segment's end

2. With distance request, find proper segment by binary search 
   (or linear search, if the number of segments is small)
3. Find parameter (0..1) of relative position  of point in this segment
4. Calculate coordinates as linear combination of segment end points.

Простой пример: введите здесь описание изображения

Points (0,0), (1,0), (1,2), (4,-2), (6,-2)
Lengths [1, 2, 5, 2]
Path cumul. lengths: [0, 1, 3, 8, 10]

Distance req.: 5
Binary search finds 3rd segment  (5 is between 3 and 8)
3*(1-t)+8*t=5  (equation to find a parameter)
t = 0.4
X = P[2].X * (1-t) + P[3].X * t
Y = P[2].Y * (1-t) + P[3].Y * t
use (1,2) and (4,-2) coordinates
(X,Y)= (2.2, 0.4)
person MBo    schedule 19.02.2014
comment
Спасибо за Ваш ответ. Я реализовал его, и он отлично работает. Кому интересно, если точка находится между P2 и P3: t = (dist.req - P2.dist) / (P3.dist - P2.dist), в этом случае: t = (5-3) / (8- 3) = 0,4 - person Legisey; 20.02.2014
comment
Да, вы правы, и (P3.dist - P2.dist) = Lengths2, вычислять не надо - person MBo; 20.02.2014
comment
Просто напечатайте свой ответ небольшим шрифтом: Y = P[2].Y *(1-t)+P[3].X *t должно быть Y = P[2].Y *(1-t)+P[3].Y *t ... но большое спасибо за отличный ответ! - person Georg; 22.12.2016