在setLineDash中更改模式:count:phase:到ios核心图形中的弧

时间:2013-06-08 16:41:00

标签: ios core-graphics uibezierpath

我画了一个椭圆

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

我希望把它变成一个震动的椭圆(见图)。为了寻找最好的方法,我想知道是否有办法使用

setLineDash:count:phase:

并传递弧/曲线作为模式而不是线?或者有更好的方法吗?

更新 我按照Wain的建议尝试了以下内容:

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);

我可以看到一些不规则的图画,但没有任何东西在视觉上有意义。 enter image description here

1 个答案:

答案 0 :(得分:1)

你没有'传递一条线'作为破折号。破折号描述了如何绘制线条。

你需要创建一个跟踪'jarred ellipse'形状的路径(而不是椭圆)(使用CGContextAddArcToPoint),然后绘制它。

这些点全部位于椭圆的边缘,您可以使用here描述的计算找到它们。我没试过,但我猜第一个切点可能是椭圆的中心点......