Beispiel #1
0
void VCurve2DBase::CreateLookup(int iSampleCount, float *pArray, int iValueStride, float fScaling, float fBias)
{

  // lookup bezier points
  float x = 0.0f;                                       // X-Coordinate of Lookup
  float fdx = GetDuration()/(float)(iSampleCount-1);  // Step size of x

  // Iterate bezier curve and create PointList
  VMemoryTempBuffer<512*sizeof(VCurvePoint2D)> buffer(iSampleCount*sizeof(VCurvePoint2D));
  VCurvePoint2D *pPoints = (VCurvePoint2D *)buffer.GetBuffer();
  for (int i = 0; i < iSampleCount; i++, x += fdx)
    pPoints[i] = GetBezierPoint(x);

  // Fill lookup table
  x = 0.0f;
  for (int i = 0; i < iSampleCount; i++, x += fdx)
    pArray[i*iValueStride] = GetValue(pPoints, iSampleCount, x)*fScaling + fBias;
}
Beispiel #2
0
// ============================================================================
// Draw points and curves
// ============================================================================
void CBezierWnd::Draw()
{
    // Draw control point handles and labels
  for ( PointSetIt i = m_Points.begin(); i != m_Points.end(); ++i )
  {
    DrawHandle( *i );
    DrawLabel( *i );
  }

  if ( m_Points.size() < 3)
    return;

    // Draw curve
  PointList lPoints;
  for ( PointSetIt i = m_Points.begin(); i != m_Points.end(); ++i )
    lPoints.push_back( *i );

  CPoint2D p2DStart =  *m_Points.begin();
  float fStep = 1.f / ( 10.f * ( float ) lPoints.size() );
  for ( float i = 0.f; i <= 1.f; i+= fStep )
  {

    CPoint2D p2D = GetBezierPoint( lPoints, i );
    DrawLine( p2DStart, p2D );
    p2DStart = p2D;
  }
  DrawLine( p2DStart, lPoints.back() );

    // Draw control polygon
  if ( m_bDrawPoly )
  {
    PointSetIt i = m_Points.begin(), iPrev = i++;
    do {
      DrawLine( *iPrev, *i );
      iPrev = i++;
    } while ( i != m_Points.end() );
  }
}