2016-09-19 6 views
1

Я использую CoreGraphics для рисования округленного прямоугольника, я знаком с CG API, готовым рисовать округленный прямоугольник, но я не хочу его использовать, потому что прямоугольник не является полностью равномерным округленным прямоугольник, часть его будет закругленным прямоугольником, остальные части будут набором подключенных путей, например, верхний левый и верхний правые будут закругленными краями прямоугольника, однако нижние края представляют собой группу подключенных Безье.Расчет контрольных точек addCurveToPoint

Мой вопрос: если я хочу нарисовать всю форму как путь Безье, как мне рассчитать контрольные точки в addCurveToPoint для углов? Я знаю радиус и координаты точек (на основе радиуса тоже).

(ОБНОВЛЕНИЕ)

I have a sample code, I am trying to understand the math behind it: 

UIBezierPath * rectangle = [UIBezierPath bezierPath]; 
[rectangle moveToPoint:CGPointMake(0, 8)]; 
[rectangle addCurveToPoint:CGPointMake(8.01, 0) controlPoint1:CGPointMake(0, 3.58) controlPoint2:CGPointMake(3.59, 0)]; 
[rectangle addLineToPoint:CGPointMake(208, 0)]; 
[rectangle addCurveToPoint:CGPointMake(224, 16.01) controlPoint1:CGPointMake(216.84, 0) controlPoint2:CGPointMake(224, 7.16)]; 
[rectangle addLineToPoint:CGPointMake(224, 175)]; 
[rectangle addCurveToPoint:CGPointMake(192, 207) controlPoint1:CGPointMake(224, 192.67) controlPoint2:CGPointMake(209.67, 207)]; 
[rectangle addLineToPoint:CGPointMake(64, 207)]; 
[rectangle addCurveToPoint:CGPointMake(0, 142.99) controlPoint1:CGPointMake(28.65, 207) controlPoint2:CGPointMake(0, 178.35)]; 
[rectangle addLineToPoint:CGPointMake(0, 8)]; 
[rectangle closePath]; 

Радиус углы 8, 16, 32 и 64 для левого верхнего угла, верхний правый, нижний правый и нижний левый

Благодаря

ответ

1

Я предполагаю, что вы хотите добавить дугу на 90 градусов для закругленного угла. Используйте addArc вместо addCurveToPoint.

В Swift 3:

var path = UIBezierPath() 

... 

let center = CGPoint(x: topLeft.x + width - radius, y: topLeft.y) 
path.addArc(withCenter: center, radius: radius, startAngle: CGFloat.pi, endAngle: CGFloat.pi * CGFloat(1.5), clockwise: true) 

Конечно, ваши параметры будут меняться.

Update

на основе кода, он должен выглядеть следующим образом:

UIBezierPath * rectangle = [UIBezierPath bezierPath]; 
[rectangle moveToPoint:CGPointMake(0, 8)]; 
[rectangle addArcWithCenter:CGPointMake(8, 8) radius:8 startAngle:M_PI endAngle:M_PI*1.5 clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(208, 0)]; 
[rectangle addArcWithCenter:CGPointMake(208, 16) radius:16 startAngle:M_PI*1.5 endAngle:0 clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(224, 175)]; 
[rectangle addArcWithCenter:CGPointMake(208, 175) radius:32 startAngle:0 endAngle:M_PI*0.5 clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(64, 207)]; 
[rectangle addArcWithCenter:CGPointMake(64, 175) radius:64 startAngle:M_PI*0.5 endAngle:M_PI clockwise:YES]; 
[rectangle closePath]; 
+0

Спасибо, уже есть пример кода, который я хочу, но я не могу понять математику за этим: – Nader

+0

@Nader Смотрите мое обновление выше ... 'center' - это центр дуги, то есть он смещен от угла прямоугольника по радиусу. Если вам интересно, как дуга аппроксимируется кривой безье, см. [Приближение круговой дуги с кубическим безьевым путём] (http://hansmuller-flex.blogspot.ch/2011/04/approximating-circular-arc- с-cubic.html). – Codo

+0

Спасибо! Это действительно сработало, но мне пришлось немного его изменить :) – Nader

0

основе @Codo ответа, это окончательное решение:

UIBezierPath * rectangle = [UIBezierPath bezierPath]; 
[rectangle moveToPoint:CGPointMake(0, 8)]; 
[rectangle addArcWithCenter:CGPointMake(8, 8) radius:8 startAngle:M_PI endAngle:M_PI*1.5 clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(208, 0)]; 
[rectangle addArcWithCenter:CGPointMake(208, 16) radius:16 startAngle:M_PI*1.5 endAngle:0 clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(224, 175)]; 
[rectangle addArcWithCenter:CGPointMake(192, 175) radius:32 startAngle:0 endAngle:M_PI*0.5 clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(64, 207)]; 
[rectangle addArcWithCenter:CGPointMake(64, 143) radius:64 startAngle:M_PI*0.5 endAngle:M_PI clockwise:YES]; 
[rectangle addLineToPoint:CGPointMake(0, 8)]; 
[rectangle closePath]; 
+0

Я еще не заметил разницу между вашим и моим кодом. Вы можете мне помочь? – Codo

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

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