110 lines
1.8 KiB
C++
110 lines
1.8 KiB
C++
/*++
|
|
|
|
Copyright (C) 1996-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
stepper.cpp
|
|
|
|
Abstract:
|
|
|
|
Implements time keeping and display in the graph window.
|
|
|
|
--*/
|
|
|
|
#include "polyline.h"
|
|
|
|
CStepper::CStepper()
|
|
{
|
|
m_iPos = 0;
|
|
m_iStepNum = 0;
|
|
m_iStepCnt = 1;
|
|
}
|
|
|
|
void CStepper::Init(INT iLength, INT iStepCnt)
|
|
{
|
|
m_iStepCnt = iStepCnt ? iStepCnt : 1;
|
|
m_iStepSize = iLength / m_iStepCnt;
|
|
m_iRemainder = iLength - m_iStepCnt * m_iStepSize;
|
|
|
|
m_iState = m_iStepCnt;
|
|
m_iPos = 0;
|
|
m_iStepNum = 0;
|
|
}
|
|
|
|
void CStepper::Reset()
|
|
{
|
|
m_iPos = 0;
|
|
m_iStepNum = 0;
|
|
m_iState = m_iStepCnt;
|
|
}
|
|
|
|
INT CStepper::NextPosition()
|
|
{
|
|
m_iPos += m_iStepSize;
|
|
|
|
m_iState -= m_iRemainder;
|
|
|
|
if (m_iState <= 0)
|
|
{
|
|
m_iState += m_iStepCnt;
|
|
m_iPos++;
|
|
}
|
|
|
|
m_iStepNum++;
|
|
|
|
return m_iPos;
|
|
}
|
|
|
|
|
|
INT CStepper::PrevPosition()
|
|
{
|
|
m_iPos -= m_iStepSize;
|
|
|
|
m_iState += m_iRemainder;
|
|
|
|
if (m_iState > m_iStepCnt)
|
|
{
|
|
m_iState -= m_iStepCnt;
|
|
m_iPos--;
|
|
}
|
|
|
|
m_iStepNum--;
|
|
|
|
return m_iPos;
|
|
}
|
|
|
|
|
|
INT CStepper::StepTo(INT nSteps)
|
|
{
|
|
INT iDiff;
|
|
|
|
iDiff = (nSteps * m_iRemainder) / m_iStepCnt;
|
|
m_iState = (iDiff + 1) * m_iStepCnt - (nSteps * m_iRemainder);
|
|
|
|
m_iPos = (nSteps * m_iStepSize) + iDiff;
|
|
|
|
m_iStepNum = nSteps;
|
|
|
|
return m_iPos;
|
|
}
|
|
|
|
INT CStepper::PrevStepNum( INT iPosition )
|
|
{
|
|
INT iStepNum = -1;
|
|
INT iLength;
|
|
|
|
// Floating point conversion to integer truncates,
|
|
// so this method returns the step previous to the position.
|
|
|
|
iLength = m_iStepCnt * m_iStepSize + m_iRemainder;
|
|
|
|
if ( iPosition <= iLength ) {
|
|
// Calculation is (iPosition/iLength) * m_iStepCnt.
|
|
iStepNum = iPosition * m_iStepCnt;
|
|
iStepNum = iStepNum / iLength;
|
|
}
|
|
|
|
return iStepNum;
|
|
}
|