Как создать CGPoint-Array из UIBezierPath (чтобы прикоснуться к объекту по заданному пути)
У меня есть UIBezierPath (изогнутый как '8', с только 4 точками в нем), и мне нужно сделать из него какой-нибудь массив CGPoint-Array. Есть идеи? спасибо!
редактировать:
У меня есть такой Безье
-(void) initBezier
{
theBezierPath = [UIBezierPath bezierPath];
[theBezierPath moveToPoint:P(211.00, 31.00)];
[theBezierPath addCurveToPoint:P(870.00, 191.00) controlPoint1:P(432.00, -11.00) controlPoint2:P(593.00, 209.00)];
[theBezierPath addCurveToPoint:P(731.00, 28.00) controlPoint1:P(1061.95, 178.53) controlPoint2:P(944.69, 5.78)];
[theBezierPath addCurveToPoint:P(189.00, 190.00) controlPoint1:P(529.00, 49.00) controlPoint2:P(450.00, 189.00)];
[theBezierPath addCurveToPoint:P(211.00, 31.00) controlPoint1:P(-33.01, 190.85) controlPoint2:P(71.00, 37.00)];
}
и я оживляю объект на нем
anim = [CAKeyframeAnimation animationWithKeyPath:@"emitterPosition"];
anim.path = theBezierPath.CGPath;
anim.calculationMode = kCAAnimationCubicPaced;
anim.repeatCount = HUGE_VALF;
anim.duration = tme;
Я хочу анимировать объект на пути пиксель за пикселем (через позицию касания). Я хочу, чтобы объект "привязал" заданную координату касания к ближайшей точке кривой, чтобы он скользил по объекту вдоль траектории.
2 ответа
Использовать CGPathApply()
функция для перебора всех элементов в пути. В качестве одного из аргументов вы должны указать указатель на функцию, которая затем будет вызываться для каждого элемента пути. Структура данных элемента пути (типа CGPathElement
) затем содержит точку (ы), которые описывают это.
использование NSValue
в качестве оболочки, чтобы добавить точки к NSMutableArray
,
Ни UIBezierPath
ни CGPath
предоставить способ оценки точек на произвольном пути Безье или способ найти ближайшую точку на пути. Вам придется написать этот код самостоятельно.
К счастью, это очень хорошо изученная тема. Этот урок содержит много полезной информации, с чего можно начать. Вы заинтересованы в кривых Безье "кубического" или "третьего порядка".