Files
PatternChecker/PatternChecker.cpp
2013-08-27 21:52:41 +00:00

167 lines
3.6 KiB
C++

#include "Define.h"
#include "PatternChecker.h"
#define HOR_GAP 4
#define _MAX_DATA (WINDOW_WIDTH/HOR_GAP)
#define _MAX_DELTA 10
#define SCALE_FACTOR_PLUS_X 0.5f
#define SCALE_FACTOR_PLUS_Y 0.1f
CPatternChecker::CPatternChecker()
{
m_iCamX = 0;
m_iCamY = 0;
m_fScaleFactorX = 1.0f;
m_fScaleFactorY = 1.0f;
}
CPatternChecker::~CPatternChecker()
{
}
void CPatternChecker::GenerateOne(void)
{
int iDelta = rand()%(_MAX_DELTA<<1);
iDelta -= _MAX_DELTA;
if(m_DataSet.size() == 0)
{
m_DataSet.push_back(iDelta);
}
else
{
int iNewData = m_DataSet[m_DataSet.size()-1] + iDelta;
m_DataSet.push_back(iNewData);
}
if(m_DataSet.size() > _MAX_DATA)
m_DataSet.erase(m_DataSet.begin());
}
void CPatternChecker::ScaleUp(const int iX, const int iY)
{
if(m_fScaleFactorX < 20.0f)
{
float fOrgX = m_iCamX + iX/m_fScaleFactorX;
m_iCamX = (int)(fOrgX - fOrgX/(m_fScaleFactorX+SCALE_FACTOR_PLUS_X) + 0.5f);
float fOrgY = m_iCamY + iY/m_fScaleFactorY;
m_iCamY = (int)(fOrgY - fOrgY/(m_fScaleFactorY+SCALE_FACTOR_PLUS_Y) + 0.5f);
m_fScaleFactorX += SCALE_FACTOR_PLUS_X;
m_fScaleFactorY += SCALE_FACTOR_PLUS_Y;
}
}
void CPatternChecker::ScaleDown(const int iX, const int iY)
{
if(m_fScaleFactorX > 1.0f)
{
float fOrgX = m_iCamX + iX/m_fScaleFactorX;
m_iCamX = (int)(fOrgX - fOrgX/(m_fScaleFactorX-SCALE_FACTOR_PLUS_X) + 0.5f);
float fOrgY = m_iCamY + iY/m_fScaleFactorY;
m_iCamY = (int)(fOrgY - fOrgY/(m_fScaleFactorY-SCALE_FACTOR_PLUS_Y) + 0.5f);
m_fScaleFactorX -= SCALE_FACTOR_PLUS_X;
m_fScaleFactorY -= SCALE_FACTOR_PLUS_Y;
}
}
void CPatternChecker::ResetScale(void)
{
m_iCamX = 0;
m_iCamY = 0;
m_fScaleFactorX = 1.0f;
m_fScaleFactorY = 1.0f;
}
void CPatternChecker::MoveScr(const int iX, const int iY)
{
const int iVirtualScrW = (int)(WINDOW_WIDTH/m_fScaleFactorX);
float fMove = iX/m_fScaleFactorX;
fMove = (fMove > 0.0f) ? (fMove+0.5f) : (fMove-0.5f);
m_iCamX -= (int)fMove;
if(m_iCamX < 0)
m_iCamX = 0;
else if(m_iCamX > WINDOW_WIDTH-iVirtualScrW)
m_iCamX = WINDOW_WIDTH-iVirtualScrW;
const int iVirtualScrH = (int)(WINDOW_HEIGHT/m_fScaleFactorY);
fMove = iY/m_fScaleFactorX;
fMove = (fMove > 0.0f) ? (fMove+0.5f) : (fMove-0.5f);
m_iCamY -= (int)fMove;
if(m_iCamY < 0)
m_iCamY = 0;
else if(m_iCamY > WINDOW_HEIGHT-iVirtualScrH)
m_iCamY = WINDOW_HEIGHT-iVirtualScrH;
}
void CPatternChecker::Reset(void)
{
m_DataSet.clear();
ResetScale();
}
void CPatternChecker::Draw(HDC hDC)
{
Rectangle(hDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
//char corrd[100] = {0, };
//sprintf_s(corrd, 100, "(%d, %d) ", m_iCamX, m_iCamY);
//TextOut(hDC, 0, 0, corrd, RGB(200, 0, 0));
int iHY = (WINDOW_HEIGHT>>1);
iHY -= m_iCamY;
iHY = (int)(iHY*m_fScaleFactorY);
MoveToEx(hDC, 0, iHY, NULL);
LineTo(hDC, WINDOW_WIDTH, iHY);
HPEN hRedPen = CreatePen(PS_SOLID, 1, RGB(200, 0, 0));
HPEN hOldPen = (HPEN)SelectObject(hDC, hRedPen);
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 200));
MoveToEx(hDC, 0, WINDOW_HEIGHT>>1, NULL);
int iPrevX=0;
int iX;
int iY;
RECT Stick;
for(unsigned int i=0; i<m_DataSet.size(); i++)
{
iX = i*HOR_GAP;
iX -= m_iCamX;
iX = (int)(iX*m_fScaleFactorX);
iY = (WINDOW_HEIGHT>>1)-m_DataSet[i];
iY -= m_iCamY;
iY = (int)(iY*m_fScaleFactorY);
Stick.left = iPrevX+1;
Stick.right = iX;
Stick.top = iY;
Stick.bottom = iHY;
FillRect(hDC, &Stick, hBrush);
//Rectangle(hDC, iPrevX, iY, iX, iHY);
LineTo(hDC, iX, iY);
iPrevX = iX;
}
SelectObject(hDC, hOldPen);
DeleteObject(hRedPen);
DeleteObject(hBrush);
}