#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>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); }