Point hermite(const double t,
              const Point& p0,
              const Point& m0,
              const Point& p1,
              const Point& m1) {
  return add(
      add(multScalar(hermiteBasis00(t), p0), multScalar(hermiteBasis10(t), m0)),
      add(multScalar(hermiteBasis01(t), p1),
          multScalar(hermiteBasis11(t), m1)));
}
/* Three point diff */
struct pt *midpointDiff(const struct pt *a, const struct pt *b, const struct pt *c) {
	// Define the offset to use
	const double offset = ((double) 3) / 2;

	// Since this equation is rather large, we are splitting it up into smaller components
	// Define the first and second term
	struct pt *term1 = multScalar(offset, minusPt(c, b));
	struct pt *term2 = multScalar(offset, minusPt(b, a));

	// Define the result value
  return add(term1, term2);
}
struct pt *hermite(const double t, const struct pt *p0, const struct pt *m0, const struct pt *p1, const struct pt *m1) {
	return add(add(multScalar(hermiteBasis00(t), p0), multScalar(hermiteBasis10(t), m0)), add(multScalar(hermiteBasis01(t), p1), multScalar(hermiteBasis11(t), m1)));
}
/* One sided diff */
struct pt *forwardDiff(const struct pt *a, const struct pt *b)
{
	struct pt *tmp = minusPt(b, a);
	return multScalar(3, tmp);
}
/* One sided diff */
Point forwardDiff(const Point& a, const Point& b) {
  Point tmp = minusPoint(b, a);
  return multScalar(3, tmp);
}