167 lines
3.6 KiB
C++
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);
|
|
} |