title: Calculate controlPoints while drawing in iOS
body: <p>I am working on a drawing app, where user can draw/write with his finger or stylus. For this I have referred code from <code>https://github.com/yusenhan/Smooth-Line-View</code>, in my application.</p>
  
  <p>The problem which I am facing is that, the writing sometimes when you write very closely is not very smooth.</p>
  
  <p>So I think, I am making some mistake in getting the control point.</p>
  
  <p>Below is my code</p>
  
  <p>//Find the midpoint</p>
  
  <pre><code>CGPoint midPoint(CGPoint p1, CGPoint p2)
  {
      return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5);
  }
  
  #pragma mark Gesture handle
  -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  {
  
      UITouch *touch = [touches anyObject];
      //LocationInView returns the current location of the reciever in coordinate system of the given View.
      m_previousPoint1 = [touch locationInView:self];
      m_previousPoint2 = [touch locationInView:self];
      m_currentPoint   = [touch locationInView:self];    
  
      [self touchesMoved:touches withEvent:event];}
  
  -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  {          
      //AnyObject:- Returns one of the objects in the set, or nil if the set contains no objects.
      UITouch *touch  = [touches anyObject];
  
      m_previousPoint2  = m_previousPoint1;
      m_previousPoint1  = m_currentPoint;
      m_currentPoint    = [touch locationInView:self];
  
      if(m_drawStep != ERASE)
      {
          m_drawStep = DRAW;
          m_drawing  = TRUE;        
      }    
  }
  
  -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  {
      UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);//creates a graphics context suitable for use as an image(size of the image,opquae,scale, if scale = 0.0, means platform will take care of scaling)
      [self.layer renderInContext:UIGraphicsGetCurrentContext()];
      m_curImage = UIGraphicsGetImageFromCurrentImageContext();// to turn the context into a UIImage    
      UIGraphicsEndImageContext();
  
   }
  
  - (void)drawRect:(CGRect)rect
  {
     CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2);
     CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);            
  
     [m_curImage drawAtPoint:CGPointMake(0, 0)];
  
     CGContextRef context = UIGraphicsGetCurrentContext();//Get a reference to current context(The context to draw)
     [self.layer renderInContext:context];
     //Simply keep referring to this context in below functions with proper arguments.
     CGContextMoveToPoint(context, mid1.x, mid1.y);//Position the current point
     CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y);     
     CGContextSetLineCap(context, kCGLineCapRound);
     CGContextSetBlendMode(context, kCGBlendModeNormal);
     CGContextSetLineJoin(context, kCGLineJoinRound);
     CGContextSetLineWidth(context, self.lineWidth);
     CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
     CGContextSetShouldAntialias(context, YES);
     CGContextSetAllowsAntialiasing(context, YES);
     CGContextSetAlpha(context, self.lineAlpha);           
     CGContextSetFlatness(context, 0.6);
     CGContextStrokePath(context);//paints(fills) the line along the current path.            
  }
  </code></pre>
  
  <p>According  to me, the points which I am passing in the <code>CGContextAddQuadCurveToPoint</code> can be tweaked, but how to tweak that, I am not getting. I read docs to find control points for <code>Bezier Curve</code>, but I am not understanding.</p>
  
  <p>So friends, please help me out understanding where I am going wrong.</p>