Почему при задании для addArcWithCenter startAngle, равного 0 градусам, он начинается с 90 градусов?

Я создаю CAShapeLayer для использования в качестве маски для слоя UIView. Я использую UIBezierPath для рисования слоя формы. Он работает нормально, за исключением того, что я получаю странные результаты, когда рисую. Геометрия ведет себя не так, как ожидалось. Я пытаюсь нарисовать простой «кусочек пирога» в правом верхнем углу:

#define degreesToRadians(x) ((x) * M_PI / 180.0)

...

// "layer" refer's to the UIView's root layer

CAShapeLayer *maskLayer = [CAShapeLayer layer];

maskLayer.frame =
    layer.presentationLayer ? 
    ((CAGradientLayer *)layer.presentationLayer).bounds : layer.bounds;
maskLayer.fillRule = kCAFillRuleEvenOdd;
maskLayer.needsDisplayOnBoundsChange = YES;

CGFloat maskLayerWidth = maskLayer.bounds.size.width;
CGFloat maskLayerHeight = maskLayer.bounds.size.height;
CGPoint maskLayerCenter = 
    CGPointMake(maskLayerWidth/2,maskLayerHeight/2);

UIBezierPath *path = [UIBezierPath bezierPath];

[path moveToPoint:maskLayerCenter];

[path addArcWithCenter:maskLayerCenter radius:(maskLayerWidth/2)
startAngle:degreesToRadians(0) endAngle:degreesToRadians(90) clockwise:YES];

[path closePath];


maskLayer.path = path.CGPath;

layer.mask = maskLayer;

Конечным результатом является то, что в правом нижнем углу рисуется сектор пирога. Первая точка дуги рисуется под углом 90 градусов, затем вниз до 180 градусов. Почему это происходит, хотя я использую углы 0 и 90 градусов?


person zakdances    schedule 24.04.2013    source источник


Ответы (2)


Это изображение получено прямо из документация.

изображение

И есть обсуждение того, как это работает (учитывая систему координат по умолчанию)

Обсуждение
Этот метод добавляет указанную дугу, начинающуюся в текущей точке. Созданная дуга лежит на периметре указанной окружности. При рисовании в системе координат по умолчанию начальный и конечный углы основаны на единичной окружности, показанной на Рис. 1. Например, указание начального угла в 0 радиан, конечного угла в π радиан и установка параметра по часовой стрелке на YES рисует нижнюю половину круга. Однако, если указать одинаковые начальный и конечный углы, но установить для параметра clockwise значение NO, будет нарисована верхняя половина круга.

Вот как работают углы для addArcWithCenter:radius:startAngle:endAngle:clockwise:. Если это не то, что вы видите, то вы неправильно рассчитываете свои углы.

person David Rönnqvist    schedule 24.04.2013

Взгляните на Рисунок 1 в bezierPathWithArcCenter:radius:startAngle:endAngle:по часовой стрелке:: для «среза пирога» в в правом верхнем углу вы должны использовать параметры

startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES

(Причина в том, что система координат по умолчанию в iOS имеет ось x, указывающую вправо, и ось y, указывающую вниз.)

person Martin R    schedule 24.04.2013