Изменение шаблона в setLineDash:count:phase: на дугу в базовой графике ios

я рисую эллипс

CGRect paperRect = self.bounds;
CGRect strokeRect = CGRectInset(paperRect, 5.0, 5.0);
CGContextAddEllipseInRect(context, strokeRect);
CGContextStrokePath(context);

Я надеялся изменить это на искривленный эллипс (см. рис.). В поисках лучшего способа сделать это мне было интересно, есть ли способ использовать

setLineDash:count:phase:

и передать дугу/кривую как шаблон вместо линии? Или есть лучший способ сделать это?

ОБНОВЛЕНИЕ Я попробовал следующее, предложенное Уэйном:

float a = strokeRect.size.width/2;
float b = strokeRect.size.height/2;

float x1,y1,x2,y2,k;
x1=CGRectGetMinX(strokeRect);
y1=CGRectGetMinY(strokeRect);
int maxAngle = 360;

CGContextBeginPath(context);
CGContextMoveToPoint(context, x1, y1); 
for(int i=0;i<maxAngle;i+=30){

    float cX=cos(DEGREES_TO_RADIANS(i));
    float sX=sin(DEGREES_TO_RADIANS(i));
    k=1/(sqrt(pow((b*cX),2) + pow(a*sX,2)));
    x2=k*a*b*cos(DEGREES_TO_RADIANS(i));
    y2=k*a*b*sin(DEGREES_TO_RADIANS(i));

   CGContextAddArcToPoint(context, x1, y1, x2, y2, 20);
    x1=x2; // make x2 the new x1
    y1=y2;

}

CGContextClosePath(context);
CGContextStrokePath(context);

Я вижу некоторые неправильные рисунки, но ничего, что имело бы визуальный смысл. введите здесь описание изображения


person aVC    schedule 08.06.2013    source источник


Ответы (1)


Вы не «передаете линию» как тире. Тире — это описание того, как рисуется линия.

Вам нужно создать путь (вместо эллипса), который отслеживает форму «перекошенного эллипса» (используя CGContextAddArcToPoint), а затем нарисовать его.

Все точки находятся на краю эллипса, их можно найти с помощью вычислений, описанных здесь. Я не пробовал, но думаю, что первая точка касания может быть центральной точкой эллипса...

person Wain    schedule 08.06.2013
comment
это не всегда круг, а скорее эллипс. Я исследовал поиск точек на эллипсе и добавление дуг, и это привело к решению квадратных уравнений для итерации углов. Я надеялся на более простое решение, если оно было. :) - person aVC; 08.06.2013
comment
@aVC: ничего, связанного с setLineDash:count:phase:. - person Peter Hosey; 09.06.2013