2010-04-23 146 views
1

我正在iPhone上使用核心图形制作线图,而不是使用锯齿图表,我想将它平滑化老数学课。选择CGContextAddCurveToPoint的控制点的位置的公式是什么?如何在使用CGContextAddCurveToPoint创建曲线的线图时选择控制点

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

该代码几乎可以工作,但没有考虑到3分。

回答

2

最后我做这样的事情是行之有效:andMaxItem:inItems:等

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

你能否对prevItem2,项目,方法positionForItem细节解释一点?谢谢。 – 2011-06-22 10:35:26

+0

prevItemPosition2是循环中的前两个点,prevItemPosition1是循环中当前一个之前的1个点。 positionForItem:andMaxItem遍历有问题的对象列表,并返回一个CGPoint,其中x = width_of_graph/count(项目),y = height_of_graph/largest_y_value * y_value。它使得图形填充了分配给它的整个空间。 – 2011-06-22 14:24:18