Beispiel #1
0
// virtual
int Spline2f::insertControlPoint( const Vector2f& p )
{
    float t;
    closestPointOnSpline( p, &t );

    int controlPointIndex;

    if( t >= ( 1.f - delta() ) )
    {
        controlPointIndex = numControlPoints();
    }
    else if( t <= delta() )
    {
        controlPointIndex = 0;
    }
    else
    {
        controlPointIndex = libcgt::core::math::roundToInt( t * numControlPoints() );
    }

    controlPointIndex = libcgt::core::math::clampToRangeExclusive(
        controlPointIndex, 0, numControlPoints());

    m_xSpline.insertControlPoint( controlPointIndex, p.x );
    m_ySpline.insertControlPoint( controlPointIndex, p.y );

    m_bCacheIsDirty = true;

    return controlPointIndex;
}
Beispiel #2
0
// virtual
int Spline2f::insertControlPoint( const Vector2f& p )
{
	float t;
	closestPointOnSpline( p, &t );
	
	int controlPointIndex;

	if( t >= ( 1.f - delta() ) )
	{
		controlPointIndex = numControlPoints();
	}
	else if( t <= delta() )
	{
		controlPointIndex = 0;		
	}
	else
	{
		controlPointIndex = Arithmetic::roundToInt( t * numControlPoints() );
	}

	controlPointIndex = MathUtils::clampToRangeInt( controlPointIndex, 0, numControlPoints() );

	printf( "closest t = %f, controlPointIndex = %d\n", t, controlPointIndex );

	m_xSpline.insertControlPoint( controlPointIndex, p.x );
	m_ySpline.insertControlPoint( controlPointIndex, p.y );
	
	m_bCacheIsDirty = true;

	return controlPointIndex;
}
Beispiel #3
0
float Spline2f::computeHalfSpace( const Vector2f& p, float* closestT, float* closestDistance )
{
    float t;
    Vector2f closestPoint = closestPointOnSpline( p, &t, closestDistance );

    Vector2f tangent = derivativeAt( t );
    Vector2f pointToClosestPoint = p - closestPoint;

    if( closestT != NULL )
    {
        *closestT = t;
    }

    return Vector2f::cross( tangent, pointToClosestPoint ).z;
}