Как нарисовать идеальный полукруг между двумя произвольными точками в Core Graphics? - PullRequest
0 голосов
/ 19 мая 2018

Я хочу нарисовать полукруг между любыми двумя произвольными CGPoint с в Core Graphics, используя Swift. Я хочу использовать Core Graphics и , а не слои. Нам понадобится флаг, чтобы решить, в каком из двух возможных направлений идти.

Например, учитывая CGPoint(x: 8, y: 92) и CGPoint(x: 28, y: 66), и зная, что мы хотим нарисовать полукруг по часовой стрелке и что это идеальный полукруг, что я могу подключить к addArc, чтобы выполнить это?

Gist

Я создал для этого gist , основываясь на ответе Роба Майоффа, приведенного ниже.

1 Ответ

0 голосов
/ 19 мая 2018

Назовите ваши заданные точки p0 и p1.

Вы хотите позвонить graphicsContext.addArc(center: center, radius: radius, startAngle: radians0, endAngle: radians1, clockwise: clockwise) и сделать так, чтобы он нарисовал полукруг с конечными точками p0 и p1.Давайте выясним, какими должны быть аргументы.

  • Чтобы сделать полукруг, заканчивающийся на p0 и p1, center должна быть средней точкой между p0 и p1: CGPoint(x: 0.5 * (p0.x + p1.x), y: 0.5 * (p0.y + p1.y)).

  • Чтобы конец дуги находился в p0 и p1, radius должно быть расстоянием от center до p0 (или p1), что равняется половине расстояния между p0 и p1: 0.5 * hypot(p1.x - p0.x, p1.y - p0.y).

  • radians0 должно быть углом от center до p0,который равен углу от p1 до p0 (потому что center, p0 и p1 коллинеарны): atan2(p1.y - p0.y, p1.x - p0.x).

  • Чтобы сделать полукруг, radians1 должно равняться radians0 + .pi.

  • clockwise - это ваш «флаг, который решает, в каком из двух возможных направлений идти».

...