2010-08-05 11 views
1

Ce qui suit est un extrait de code où j'essaie de dessiner un cercle, mais ma valeur x imprime comme une valeur constante. C'est très probablement quelque chose de très très simple. Merci d'avance pour votre aide.Aide cercle de dessin dans l'iPhone

int sides = 100; 
int radius = 200; 
int centerX = 100; 
int centerY = 100; 
CGFloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f}; 
CGContextSetStrokeColor(context, red); 
CGContextBeginPath(context); 


CGContextMoveToPoint(context, 0, 0); 
int i = 0; 
for(i = 0; i <= sides; i++) 
{ 

    CGFloat pointRatio = i/sides; 
    CGFloat xSteps = cos(pointRatio * 2 * M_PI); 
    CGFloat ySteps = sin(pointRatio * 2 * M_PI); 
    CGFloat pointX = centerX + xSteps * radius; 
    CGFloat pointY = centerY + ySteps * radius; 
    NSLog(@"%i", pointX); 

    CGContextAddLineToPoint(context, pointX, pointY); 
} 
CGContextStrokePath(context); 

Répondre

8
CGFloat pointRatio = i/sides; 

Lorsque vous divisez 2 entiers, le résultat sera également entier - 0 dans votre cas. Vous devez vous assurer que la division en virgule flottante sera réalisée:

CGFloat pointRatio = 1.0f*i/sides; 
// Or even better 
CGFloat pointRatio = i/(CGFloat)sides; 

D'ailleurs pourquoi ne voulez-vous pas dessiner cercle en utilisant la fonction intégrée:

CGPathAddEllipseInRect(path, NULL, 
      CGRectMake(centerX - radius, centerY - radius, 2*radius, 2*radius)); 
+0

Vous pouvez également convertir un côté de la division ou l'autre en un type à virgule flottante; par exemple, 'i/(CGFloat) côtés'. Mais oui, 'CGPathAddEllipseInRect' est la bonne façon de le faire; tracer un hecatogon vous-même est difficile. –

+0

@Peter, y a-t-il une différence entre ces deux façons de diviser? Ou le compilateur leur fait finalement les mêmes instructions? – Vladimir

+0

Le vôtre est une multiplication et une division; le mien est une division seule. Le compilateur pourrait très bien optimiser la multiplication, mais je préférerais ne pas écrire le code en premier lieu. –

0

Réponse précédente est correcte. En outre, utilisez cosf() et sinf(), pas cos() et sin() - vous travaillez avec une précision flottante.

+2

"Réponse précédente" ne dit pas grand-chose quand ils sont tous "répondu 05 août 10". Vous devriez vous référer à la réponse par son nom d'auteur. –

+0

Matthew merci, assez intéressant sin() et cos() me donner assez de résolution dans le dessin final ... cela signifierait que je devrais juste utiliser ceux-ci? Ou aurai-je des problèmes plus tard à le faire. – Skawful

5

Vous n'avez besoin que de 2 lignes de code pour dessiner un vrai cercle rond. Mon exemple de code:

CGContextAddArc(contextRef,centerX,centerY,radius,0,2*3.1415926535898,1); 
CGContextDrawPath(contextRef,kCGPathStroke);