- (float) bezierCurveLengthFromStartPoint: (CGPoint) start toEndPoint: (CGPoint) end withControlPoint: (CGPoint) control { const int kSubdivisions = 50; const float step = 1.0f/(float)kSubdivisions; float totalLength = 0.0f; CGPoint prevPoint = start; // starting from i = 1, since for i = 0 calulated point is equal to start point for (int i = 1; i <= kSubdivisions; i++) { float t = i*step; float x = (1.0 - t)*(1.0 - t)*start.x + 2.0*(1.0 - t)*t*control.x + t*t*end.x; float y = (1.0 - t)*(1.0 - t)*start.y + 2.0*(1.0 - t)*t*control.y + t*t*end.y; CGPoint diff = CGPointMake(x - prevPoint.x, y - prevPoint.y); totalLength += sqrtf(diff.x*diff.x + diff.y*diff.y); // Pythagorean prevPoint = CGPointMake(x, y); } return totalLength; }
- (void) testPath { UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointZero]; [path addQuadCurveToPoint:CGPointMake(1, 1) controlPoint:CGPointMake(-2, 2)]; CGPathRef p = path.CGPath; CGPathApply(p, nil, pathFunction); } void pathFunction(void *info, const CGPathElement *element) { if (element->type == kCGPathElementAddQuadCurveToPoint) { CGPoint p; p = element->points[0]; // control point NSLog(@"%lg %lg", p.x, p.y); p = element->points[1]; // end point NSLog(@"%lg %lg", p.x, p.y); } // check other cases as well! }
为了执行贝赛尔曲线动画(UIBezierPath)保持匀速计算曲线弧长
最新推荐文章于 2019-08-12 18:03:13 发布