2010-04-23 7 views
1

Je crée un graphique linéaire sur l'iphone en utilisant des graphiques de base et au lieu d'avoir un graphique dentelé, je veux le lisser comme en bon ancienne classe de mathématiques. Quelle est la formule pour choisir où placer les points de contrôle pour CGContextAddCurveToPoint?Comment puis-je choisir le point de contrôle lorsque j'utilise CGContextAddCurveToPoint pour créer un graphique linéaire avec des courbes?

  CGFloat cp2x = (x + x + prevX); 
     CGFloat cp1y = (prevY + prevY + y); 

     CGFloat cp1x = (prevX + prevX + x); 
     CGFloat cp2y = (y + y + prevY); 

     CGContextAddCurveToPoint(context, cp1x, cp1y, cp2x, cp2y, x, y); 

Ce code fonctionne presque mais ne prend pas en compte 3 points.

Répondre

2

je fini par faire quelque chose comme ça qui a bien fonctionné:

CGPoint prevItemPosition2 = [self positionForItem: prevItem2 andMaxItem:maxItem inItems: items]; 
CGPoint prevItemPosition1 = [self positionForItem: prevItem1 andMaxItem:maxItem inItems: items]; 
CGFloat cpAngle = atan2f((prevItemPosition2.y - prevItemPosition1.y), 
          (prevItemPosition2.x - prevItemPosition1.x)); 
cpAngle += M_PI; 
CGFloat magnitude = sqrtf(powf(prevItemPosition1.x - itemPosition.x, 2) + 
          powf(prevItemPosition1.y - itemPosition.y, 2))/3; 
CGPoint angleComponents = CGPointMake(cos(cpAngle) * magnitude, 
             sin(cpAngle) * magnitude); 
CGPoint cp = CGPointMake(prevItemPosition1.x + angleComponents.x, 
          prevItemPosition1.y + angleComponents.y); 
CGContextAddQuadCurveToPoint(context, cp.x, cp.y, itemPosition.x, itemPosition.y); 
+0

Pouvez-vous expliquer un peu plus en détails sur le prevItem2, articles, la méthode positionForItem: andMaxItem: inItems: etc? Merci. –

+0

prevItemPosition2 est deux points précédent dans la boucle, prevItemPosition1 est 1 point précédent à celui en cours dans la boucle. positionForItem: andMaxItem boucle la liste des objets en question et renvoie un CGPoint où x = width_of_graph/count (items) et y = height_of_graph/greater_y_value * y_value. Cela fait que le graphe remplit tout l'espace qui lui est alloué. –

Questions connexes