2014-02-18 6 views
1

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

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

enter image description here

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

CGPoint MyPoint = [myLine pointAtdistance: 53,21]

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

спасибо.

+0

Если вы имеете в виду расстояние от точки старта, то результат вы ищете не может быть на самом деле уникальный – mathematician1975

+0

я имею в виду расстояние от начальной точки вдоль линии. Я отредактирую свой вопрос :) – Legisey

+0

У вас есть сегменты кривой на вашем пути? Какое типичное использование - один путь и многие запросы на расстояние? – MBo

ответ

3

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

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. 

Простого пример: enter image description here

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) 
+0

Спасибо за ваш ответ. Я реализовал его, и он отлично работает. Для любого заинтересованного, если точка находится между P2 и P3: t = (dist.req - P2.dist)/(P3.dist - P2.dist), в этом случае: t = (5-3)/(8- 3) = 0,4 – Legisey

+0

Да, вы правы, и (P3.dist - P2.dist) = Длина 2, нет необходимости вычислять – MBo

+0

В вашем ответе только небольшой тип ответа: 'Y = P [2] .Y * (1- t) + P [3] .X * t' должно быть 'Y = P [2] .Y * (1-t) + P [3] .Y * t' ..., но большое спасибо за ваш большой ответ! – Georg

Смежные вопросы