示例#1
0
void CubicBezierInterpolator::updateControlPoints(BezierPoint& point, BezierPoint* prevPoint, BezierPoint* nextPoint)
{
	if (prevPoint)
	{
		if (nextPoint)
		{
			auto t = timeAtX(point.pos()->getX(), *prevPoint, *nextPoint);
			*prevPoint->cp2() *= t;
			*nextPoint->cp1() *= (1.f - t);
		}
		else
		{
			auto x = prevPoint->cp2()->getX();
			auto maxx = (point.pos()->getX() - prevPoint->pos()->getX());
			// Don't allow the previous point's control point go beyond the new point
			if (x > 0 && x > maxx)
			{
				*prevPoint->cp2() *= (maxx / x);
			}
			else if (x < 0)
			{
				prevPoint->cp2()->setX(maxx * 0.5f);
				prevPoint->cp2()->setY(0.0f);
			}
		}
	}
	else if (nextPoint)
	{
		auto x = nextPoint->cp1()->getX();
		auto minx = (point.pos()->getX() - nextPoint->pos()->getX());
		// Don't allow the next point's control point to precede the new point
		if (x < 0 && x < minx)
		{
			*nextPoint->cp1() *= (minx / x);
		}
		else if (x > 0)
		{
			prevPoint->cp2()->setX(minx * 0.5f);
			prevPoint->cp2()->setY(0.0f);
		}
	}
}
void CubicBezierInterpolator::updateControlPoints(BezierPoint& point, BezierPoint* prevPoint, BezierPoint* nextPoint)
{
	if(prevPoint)
	{
		if(nextPoint)
		{
			auto t = timeAtX(point.pos->getX(), *prevPoint, *nextPoint);
			*prevPoint->cp2.get() *= t;
			*nextPoint->cp1.get() *= ( 1.f - t );
		}
		else
		{
			prevPoint->cp2->setX(( point.pos->getX() - prevPoint->pos->getX() ) / 2.f);
			prevPoint->cp2->setY(0.f);
		}
	}
	else if(nextPoint)
	{
		nextPoint->cp1->setX(( point.pos->getX() - nextPoint->pos->getX() ) / 2.f);
		nextPoint->cp1->setY(0);
	}
}