2016-04-22 1 views
2

Я пытаюсь использовать шестиугольник, и у меня есть проблема на близком пути.ObjectiveC UIBezierPath path close issue

Вот мой шестиугольник, и близкий путь не является гладким. enter image description here

Вот мой рисунок код

CAShapeLayer* shapeLayer = [CAShapeLayer layer]; 
    UIBezierPath* path = [UIBezierPath bezierPath]; 
// [path setLineJoinStyle:kCGLineJoinRound]; 
// [path setLineJoinStyle:kCGLineJoinBevel]; 
    [path setLineJoinStyle:kCGLineJoinMiter]; 
// CGFloat dashes[] = {6, 2}; 
// [path setLineDash:dashes count:2 phase:0]; 
// [path stroke]; 

    CGFloat radians = 100.0; 
    NSInteger num = 6; 
    CGFloat interval = 2*M_PI/num; 

    NSInteger initX = radians*cosf(interval); 
    NSInteger initY = radians*sinf(interval); 

    [path moveToPoint:CGPointMake(location.x - semiWidth + initX, location.y - semiHeight + initY)]; 
    for(int i=1; i<=num; i++){ 
     CGFloat x = radians*cosf(i*interval); 
     CGFloat y = radians*sinf(i*interval); 
     [path addLineToPoint:CGPointMake(location.x - semiWidth + x, location.y - semiHeight + y)]; 
    } 
    [path closePath]; 
    shapeLayer.path = [path CGPath]; 
    shapeLayer.strokeColor = [[UIColor yellowColor] CGColor]; 
    shapeLayer.fillColor = [[UIColor brownColor] CGColor]; 
    shapeLayer.lineWidth = 4.0f; 

Также я стараюсь использовать различные варианты следующий без везения

[path setLineJoinStyle:kCGLineJoinRound]; 
[path setLineJoinStyle:kCGLineJoinBevel]; 
[path setLineJoinStyle:kCGLineJoinMiter]; 

ответ

4

Проблема заключается в том, что вы не делаете свою первую точку (точка, в которую вы переходите) так же, как вы делаете свои другие очки (точки, на которые вы переходите).

NSInteger initX = radians*cosf(interval); 
NSInteger initY = radians*sinf(interval); 
[path moveToPoint:CGPointMake(
    location.x - semiWidth + initX, location.y - semiHeight + initY)]; 

Вместо этого сделайте первый пункт совершенно параллельно с другими:

CGFloat x = radians*cosf(0*interval); 
CGFloat y = radians*sinf(0*interval); 
[path moveToPoint:CGPointMake(
    location.x - semiWidth + x, location.y - semiHeight + y)]; 

Это точно так же, как и то, что вы будете делать потом с i*interval, и подчеркнуть, что параллелизм, я написал 0 как 0*interval. Вот что я закончил с:

enter image description here

+1

Кроме того, вам нужно только 'addLineToPoint:' 5 баллов, а не 6. 'closePath' будет рисовать линию от вашей конечной точки к первой точке на кривой , – stevekohls

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

  • Нет связанных вопросов^_^