All Projects → soffes → SAMCubicSpline

soffes / SAMCubicSpline

Licence: MIT License
Cubic splines made easy.

Programming Languages

objective c
16641 projects - #2 most used programming language
ruby
36898 projects - #4 most used programming language

SAMCubicSpline

I found this math somewhere and tweaked it some to work the way I needed it. A cubic spline is great for drawing the curve in a tone curve filter.

Installation

Simply add the following to your Podfile:

pod 'SAMCubicSpline'

If you're not using CocoaPods, simply add the source files in the SAMCubicSpline directory to your project. There are no dependencies and it works on Mac and iOS.

Example

A quick sample to draw a spline into an already setup CGContextRef and assumes you'll finish drawing the line at the end.

#import "SAMCubicSpline.h"

// Setup a spline with some control points
#if TARGET_OS_IOS
SAMCubicSpline *spline = [[SAMCubicSpline alloc] initWithPoints:@[
  [NSValue valueWithCGPoint:CGPointMake(0.0f, 0.039f)],
  [NSValue valueWithCGPoint:CGPointMake(0.588f, 0.525f)],
  [NSValue valueWithCGPoint:CGPointMake(1.0f, 1.0f)],
]];
#else
SAMCubicSpline *spline = [[SAMCubicSpline alloc] initWithPoints:@[
  [NSValue valueWithPoint:CGPointMake(0.0f, 0.039f)],
  [NSValue valueWithPoint:CGPointMake(0.588f, 0.525f)],
  [NSValue valueWithPoint:CGPointMake(1.0f, 1.0f)],
]];
#endif

// Iterate over the X values in the area we want to draw
CGSize graphSize = CGSizeMake(100.0f, 100.0f);
for (CGFloat x = 0.0f; x < size.width; x++) {
  // Get the Y value of our point
  CGFloat y = [spline interpolate:x / size.width] * size.height;

  // Add the point to the context's path
  if (x == 0.0f) {
    CGContextMoveToPoint(context, x, y);
  } else {
    CGContextAddLineToPoint(context, x, y);
  }
}

Thanks

This was abstracted from Footage. Thanks to Drew Wilson for allowing me to open source this!

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].