代码之家  ›  专栏  ›  技术社区  ›  Matt Williamson

当使用cgContextAddCurvetoPoint制作带有曲线的曲线图时,如何选择控制点?

  •  1
  • Matt Williamson  · 技术社区  · 14 年前

    我在iPhone上用核心图形制作了一个折线图,而不是用锯齿形的图表,我想像在老数学课上一样把它弄光滑。为cgContextAddCurvetPoint选择控制点的位置的公式是什么?

                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点。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Matt Williamson    14 年前

    我最终做了这样的事情,效果很好:

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