This commit is contained in:
167
PatternChecker.cpp
Normal file
167
PatternChecker.cpp
Normal file
@@ -0,0 +1,167 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user