Основная графика - мой треугольник / дуга слишком заостренный - PullRequest
4 голосов
/ 10 декабря 2011

Я рисую «кусочки» в пользовательской круговой диаграмме в Core Graphics, используя метод UIBezierPath и [path addArcWithCenter:radius:startAngle:endAngle:clockwise:].Моя проблема в том, что часто заостренный конец среза на самом деле выступает за центральной точкой, вторгаясь в пространство других срезов.

Есть ли способ «закруглить» этот край?


Вот код, который я использую для рисования пути

[path moveToPoint:center];
[path addArcWithCenter:center radius:radius startAngle:interiorAngle endAngle:totalAngle clockwise:YES];
[path addLineToPoint:center];
[path closePath];

Вот изображение проблемы:

The bottom left blue sector 'bleeds' into the larger blue sector near the middle

Белый заостренный конец синей фигуры в левом нижнем углу слегка проникает в большую синюю фигуру в верхнем правом углу.

Ответы [ 3 ]

5 голосов
/ 10 декабря 2011

Это не «мимо» центральной точки.Ваше заблуждение заключается в том, что вы прокладываете путь.Когда вы обводите путь, обводка располагается в центре пути, и поэтому половина обводки находится вне пути, а половина обводки находится внутри пути.Если вы хотите точный обвод, у вас есть два варианта:

  1. Заполните ваш путь цветом обводки, затем создайте другой путь, который будет вставлен в ваш первый, на желаемую ширину линии, а затемзаполните этот путь цветом заливки.Это будет имитировать "внутренний" ход, хотя он не будет использоваться, если ваши цвета обводки или заливки являются полупрозрачными.

  2. Прикрепите к траектории, удвойте ширину обводки и затем обведитедорожка.Отсечение заставит обводку рисовать только внутри траектории.Однако это может показаться не совсем «точным» в углах (не совсем точно), так как это удваивает ширину хода, а не вычисляет «желаемый» путь.

В качестве альтернативы, вы можете попробовать простоустановив lineJoinStyle в значение, отличное от kCGLineJoinMiter.При использовании стиля митры по умолчанию линии фактически вытягиваются настолько далеко, насколько это необходимо от угла, чтобы встретиться, что означает, что они могут проходить на 1/2 ширины линии.Если вы используете kCGLineJoinRound или kCGLineJoineBevel, они не могут пройти больше половины ширины линии.Это может быть не совсем точно, но может быть достаточно для того, что вы хотите.

1 голос
/ 10 декабря 2011

Я подозреваю, что проблема в ширине белой линии.Например, линия шириной 8 точек будет иметь 4 точки по обе стороны пути.

0 голосов
/ 10 декабря 2011

Я не вижу проблемы на этом изображении (какой фрагмент показывает его?), Но я могу предложить удалить сообщение addLineToPoint:.Это не обязательно;closePath вернется в центр, поскольку именно там вы начали.

...