void FunctionConfig::reload() {
	_size = 0;

	if (_points.size())
		qStableSort(_points.begin(), _points.end(), sortFn);

	if (_data)
        delete[] _data;
	_data = NULL;
	if (_points.size()) {
        _data = new float[_size = MEMOIZE_PRECISION * _points[_points.size() - 1].x()];

        for (int i = 0; i < _size; i++)
                _data[i] = -1e6;

		for (int k = 0; k < _points[0].x() * MEMOIZE_PRECISION; k++) {
            if (k < _size)
                _data[k] = _points[0].y() * k / (_points[0].x() * MEMOIZE_PRECISION);
        }

       for (int i = 0; i < _points.size(); i++) {
            QPointF p0 = ensureInBounds(_points, i - 1);
            QPointF p1 = ensureInBounds(_points, i);
            QPointF p2 = ensureInBounds(_points, i + 1);
            QPointF p3 = ensureInBounds(_points, i + 2);

            int end = p2.x() * MEMOIZE_PRECISION;
            int start = p1.x() * MEMOIZE_PRECISION;

            for (int j = start; j < end && j < _size; j++) {
                double t = (j - start) / (double) (end - start);
                double t2 = t*t;
                double t3 = t*t*t;

                int x = .5 * ((2. * p1.x()) +
                              (-p0.x() + p2.x()) * t +
                              (2. * p0.x() - 5. * p1.x() + 4. * p2.x() - p3.x()) * t2 +
                              (-p0.x() + 3. * p1.x() - 3. * p2.x() + p3.x()) * t3)
                        * MEMOIZE_PRECISION;

                float y = .5 * ((2. * p1.y()) +
                                 (-p0.y() + p2.y()) * t +
                                 (2. * p0.y() - 5. * p1.y() + 4. * p2.y() - p3.y()) * t2 +
                                 (-p0.y() + 3. * p1.y() - 3. * p2.y() + p3.y()) * t3);

                if (x >= 0 && x < _size)
                    _data[x] = y;
            }
		}

       float last = 0;

       for (int i = 0; i < _size; i++)
       {
           if (_data[i] == -1e6)
               _data[i] = last;
           last = _data[i];
       }
	}
}
void FunctionConfig::reload() {
	double i;
	int j, k;

	_size = 0;

	if (_points.size())
		qStableSort(_points.begin(), _points.end(), sortFn);

	if (_data)
		delete _data;
	_data = NULL;
	if (_points.size()) {
		_data = new double[_size = MEMOIZE_PRECISION * (((int) (_points[_points.size() - 1]).x()) + 1)];

		for (k = 0; k < (int) (_points[0].x() * MEMOIZE_PRECISION); k++) {
			_data[k] = _points[0].y() * k / (int) (_points[0].x() * MEMOIZE_PRECISION);
		}

		j = 1;

		for (i = _points[0].x(), k = (int) (_points[0].x() * MEMOIZE_PRECISION);
			 k < _size;
			 k++, i += (1.0f / MEMOIZE_PRECISION))
		{
			while (j < _points.size() && _points[j].x() <= i)
				j++;
			QPointF a_ = ensureInBounds(_points, j - 2);
			QPointF b_ = ensureInBounds(_points, j - 1);
			QPointF c_ = ensureInBounds(_points, j);
			QPointF d_ = ensureInBounds(_points, j + 1);
			double a = a_.y();
			double b = b_.y();
			double c = c_.y();
			double d = d_.y();
			double t = (c_.x() - b_.x()) == 0 ? 0 : (i - b_.x()) / (c_.x() - b_.x());
			double val = a * ((-t + 2) * t - 1) * t * 0.5 +
				b * (((3 * t - 5) * t) * t + 2) * 0.5 +
				c * ((-3 * t + 4) * t + 1) * t * 0.5 +
				d * ((t - 1) * t * t) * 0.5;
			_data[k] = val;
		}
	}
}