您的位置:首页 > 产品设计 > UI/UE

计算UIBezierPath 路径内、路径上的点

2016-01-05 21:37 369 查看
背景:使用UIBezierPath 和 CAShapeLayer 画封闭图形

1.获得路径上的所有点

NSMutableArray *bezierPoints = [NSMutableArray array];
CGPathApply(path.CGPath, (__bridge void *)(bezierPoints), MyCGPathApplierFunc);

UIBezierPath *tessss = [[UIBezierPath alloc]init];

for (int i = 0 ;i<bezierPoints.count;i++) {
NSValue *pointValue = bezierPoints[i];
CGPoint point = [pointValue CGPointValue];
if (i==0) {
[tessss moveToPoint:point];
}else{
[tessss addLineToPoint:point];
}
XLogPoint1(point);
}
[tessss closePath];

self.penShapeView.shapeLayer.path = tessss.CGPath ;
*/

/*
void MyCGPathApplierFunc (void *info, const CGPathElement *element) {
NSMutableArray *bezierPoints = (__bridge NSMutableArray *)info;

CGPoint *points = element->points;
CGPathElementType type = element->type;

switch(type) {
case kCGPathElementMoveToPoint: // contains 1 point
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
break;

case kCGPathElementAddLineToPoint: // contains 1 point
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
break;

case kCGPathElementAddQuadCurveToPoint: // contains 2 points
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
[bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
break;

case kCGPathElementAddCurveToPoint: // contains 3 points
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
[bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
[bezierPoints addObject:[NSValue valueWithCGPoint:points[2]]];
break;

case kCGPathElementCloseSubpath: // contains no point
break;
}
}


2.计算封闭路径内像素点个数(面积)
int count = 0 ;
CGRect frame = self.lastPenBezierPath.bounds ;
for (int i = frame.origin.x ; i < frame.origin.x + frame.size.width; i++) {
for (int j = frame.origin.y ; j < frame.origin.y + frame.size.height; j++) {
CGPoint point = CGPointMake(i,j);
if ([self.lastPenBezierPath containsPoint:point]) {
count ++ ;
}
}
}
NSLog(@"count = %d",count);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: