2012-07-02 236 views
1

我想平滑我的手繪製貝塞爾曲線,但無法實現,它,我從我試圖實現的埃裏卡蘇丹寫的書中得到了平滑曲線的代碼,但是不知道爲什麼我不能夠產生平滑的曲線,下面是我的代碼,我要求所有的你,請通過它..平滑手繪貝塞爾曲線

- (void)drawRect:(CGRect)rect 
{  
    myPath.pathColor = [UIColor redColor];   

    for (BezeirPath *_path in m_pathArray) 
    { 
     [_path.pathColor setStroke]; 
     [_path.bezeirPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];   

    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 

    m_previousPoint1 = [mytouch previousLocationInView:self]; 
    m_previousPoint2 = [mytouch previousLocationInView:self]; 
    m_currentPoint = [mytouch locationInView:self]; 


    CGPoint controlPoint = CGPointMake(m_previousPoint1.x+(m_previousPoint1.x - m_previousPoint2.x), m_previousPoint1.y +(m_previousPoint1.y - m_previousPoint2.y)); 
    [myPath.bezeirPath addQuadCurveToPoint:m_currentPoint controlPoint:controlPoint];  
    self.previousPoint3 = controlPoint; 

    [myPath.bezeirPath smoothedPath:myPath.bezeirPath :40];//Called the smoothing function. 

    [self setNeedsDisplay]; 
} 

//平滑功能

-(UIBezierPath*)smoothedPath:(UIBezierPath*)bpath: (NSInteger) granularity 
{ 
    NSArray *points = pointsFromBezierPath(bpath); 
    if (points.count < 4) return bpath; 
    // This only copies lineWidth. You may want to copy more 
    UIBezierPath *smoothedPath = [UIBezierPath bezierPath]; 
    smoothedPath.lineWidth = bpath.lineWidth; 
    // Draw out the first 3 points (0..2) 
    [smoothedPath moveToPoint:POINT(0)]; 
    for (int index = 1; index < 3; index++) 
     [smoothedPath addLineToPoint:POINT(index)]; 
    // Points are interpolated between p1 and p2, 
    // starting with 2..3, and moving from there 
    for (int index = 4; index < points.count; index++) 
    { 
     CGPoint p0 = POINT(index - 3); 
     CGPoint p1 = POINT(index - 2); 
     CGPoint p2 = POINT(index - 1); 
     CGPoint p3 = POINT(index); 
     // now add n points starting at p1 + dx/dy up until p2 
     // using Catmull-Rom splines 
     for (int i = 1; i < granularity; i++) 
     { 
      float t = (float) i * (1.0f/(float) granularity); 
      float tt = t * t; 
      float ttt = tt * t; 
      CGPoint pi; // intermediate point 
      pi.x = 0.5 * (2*p1.x+(p2.x-p0.x)*t + 
          (2*p0.x-5*p1.x+4*p2.x-p3.x)*tt + 
          (3*p1.x-p0.x-3*p2.x+p3.x)*ttt); 
      pi.y = 0.5 * (2*p1.y+(p2.y-p0.y)*t + 
          (2*p0.y-5*p1.y+4*p2.y-p3.y)*tt + 
          (3*p1.y-p0.y-3*p2.y+p3.y)*ttt); 
      [smoothedPath addLineToPoint:pi]; 
     } 

     [smoothedPath addLineToPoint:p2]; 
    } 
    // finish by adding the last point 
    [smoothedPath addLineToPoint:POINT(points.count - 1)]; 
    return smoothedPath; 
} 
+0

不,我必須將bezeirPath的對象傳遞給此函數。糾正我,如果我錯了。 – Ranjit

+0

你好朋友,可以有人建議我在這方面 – Ranjit

回答

0

我建議從WWDC 2012中觀看「構建高級手勢識別器」。您可以跳過開始 - 您最喜歡的部分意思是在38:23。

+0

嘿謝謝@Lenny K回覆,我跳過了我的方法使用BezeirPaths因爲性能問題?你有什麼要說我的決定?請回復 – Ranjit

+0

你決定使用什麼? – futurevilla216

+0

我正在使用CgContex及其相關函數和Cglayer來緩存繪圖 – Ranjit