Hay un poco Con la matemática simple detrás del cálculo de las posiciones, puede leer al respecto en cada artículo que analiza las curvas de Bézier, incluso en la wikipedia. De todos modos, puedo relacionarme con todos los que tienen problemas para implementarlo en código, así que escribí este ejemplo de UIView ya que probablemente sea la forma más fácil de comenzar.
#import "MBBezierView.h"
CGFloat bezierInterpolation(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d) {
CGFloat t2 = t * t;
CGFloat t3 = t2 * t;
return a + (-a * 3 + t * (3 * a - a * t)) * t
+ (3 * b + t * (-6 * b + b * 3 * t)) * t
+ (c * 3 - c * 3 * t) * t2
+ d * t3;
}
@implementation MBBezierView
- (void)drawRect:(CGRect)rect {
CGPoint p1, p2, p3, p4;
p1 = CGPointMake(30, rect.size.height * 0.33);
p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
p3 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
p4 = CGPointMake(-30 + CGRectGetMaxX(rect), rect.size.height * 0.66);
[[UIColor blackColor] set];
[[UIBezierPath bezierPathWithRect:rect] fill];
[[UIColor redColor] setStroke];
UIBezierPath *bezierPath = [[[UIBezierPath alloc] init] autorelease];
[bezierPath moveToPoint:p1];
[bezierPath addCurveToPoint:p4 controlPoint1:p2 controlPoint2:p3];
[bezierPath stroke];
[[UIColor brownColor] setStroke];
for (CGFloat t = 0.0; t <= 1.00001; t += 0.05) {
CGPoint point = CGPointMake(bezierInterpolation(t, p1.x, p2.x, p3.x, p4.x), bezierInterpolation(t, p1.y, p2.y, p3.y, p4.y));
UIBezierPath *pointPath = [UIBezierPath bezierPathWithArcCenter:point radius:5 startAngle:0 endAngle:2*M_PI clockwise:YES];
[pointPath stroke];
}
}
@end
Esto es lo que me sale:

¡math es divertido! +1! – slf
@Joe Blow: ¿esto es realmente lo que querías? Dijiste que querías un punto que sea una distancia D a lo largo de la curva. Michal, corrígeme si me equivoco, pero tu código solo evalúa la curva en diferentes valores de parámetros, que no es lo mismo que la longitud. Como puede ver, los puntos están más juntos en los picos y más separados en el medio de la curva. – CromTheDestroyer
Hola Crom: tienes toda la razón, están APROXIMADAMENTE equidistantes a lo largo de la curva.Aparentemente, no hay una manera realmente fácil matemáticamente de obtener espacios EXACTOS. Esta aproximación común funciona bien para motores de juegos y similares. Véase también 4089443. – Fattie