|
|
#include "stdafx.h"
|
|
|
#include "HTrackerHandleCalculator.h"
|
|
|
|
|
|
HTrackerHandleCalculator::HTrackerHandleCalculator()
|
|
|
:m_HandleSize(12)
|
|
|
{
|
|
|
memset(m_Points, 0, sizeof(m_Points));
|
|
|
}
|
|
|
|
|
|
//创建Tracker矩形的四个角点和中心点
|
|
|
void HTrackerHandleCalculator::Calculate(const CRect & boundRect)
|
|
|
{
|
|
|
//CRect rc(boundRect);
|
|
|
//rc.InflateRect(m_OuterMargin, m_OuterMargin);
|
|
|
|
|
|
m_Points[0].x = m_Points[3].x = boundRect.left;
|
|
|
m_Points[1].x = m_Points[2].x = boundRect.right;
|
|
|
m_Points[0].y = m_Points[1].y = boundRect.top;
|
|
|
m_Points[2].y = m_Points[3].y = boundRect.bottom;
|
|
|
|
|
|
m_Points[4] = boundRect.CenterPoint();
|
|
|
}
|
|
|
|
|
|
CRect HTrackerHandleCalculator::GetHandleRect(int iHandle)
|
|
|
{
|
|
|
//if (iHandle == HandleBody)
|
|
|
//return m_StartRect;
|
|
|
|
|
|
CRect rc;
|
|
|
rc.SetRectEmpty();
|
|
|
rc.OffsetRect(GetHandlePoint(m_Points, iHandle));
|
|
|
int d = m_HandleSize / 2;
|
|
|
rc.InflateRect(d, d);
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
CPoint HTrackerHandleCalculator::GetHandlePoint(int iHandle)
|
|
|
{
|
|
|
return GetHandlePoint(m_Points, iHandle);
|
|
|
}
|
|
|
|
|
|
POINT HTrackerHandleCalculator::GetCenterPoint()
|
|
|
{
|
|
|
return m_Points[4];
|
|
|
}
|
|
|
|
|
|
void HTrackerHandleCalculator::Reset()
|
|
|
{
|
|
|
memset(m_Points, 0, sizeof(m_Points));
|
|
|
}
|
|
|
|
|
|
POINT HTrackerHandleCalculator::Test(int i)
|
|
|
{
|
|
|
return m_Points[i];
|
|
|
}
|
|
|
//pPoints为m_PointSrc
|
|
|
CPoint HTrackerHandleCalculator::GetHandlePoint(LPPOINT pPoints, int iHandle)
|
|
|
{
|
|
|
// Handles are numbered clockwise, like this:
|
|
|
//
|
|
|
// HandleTopLeft HandleTop HandleTopRight
|
|
|
// 0 1 2
|
|
|
// *-----------*-----------*
|
|
|
// | |
|
|
|
// | |
|
|
|
// HandleLeft 7 * * 8 * 3 HandleRight
|
|
|
// | HandleCenter |
|
|
|
// | |
|
|
|
// *-----------*-----------*
|
|
|
// 6 5 4
|
|
|
// HandleBottomLeft HandleBottom HandleBottomRight
|
|
|
//
|
|
|
// The center point is handle 8, the HandleBody is handle 9.
|
|
|
|
|
|
if (iHandle >= 8)
|
|
|
return pPoints[4]; // center
|
|
|
|
|
|
//如果为偶数点,则为角点。
|
|
|
//m_PointSrc前四个点为角点。iHandle点隔一点就是角点。
|
|
|
//所以除以2,就获得了iHandle对应的角点的索引。
|
|
|
int i = iHandle / 2;
|
|
|
if ((iHandle & 1) == 0)
|
|
|
return pPoints[i]; // corner
|
|
|
|
|
|
int j = i + 1;
|
|
|
if (j > 3) j = 0;
|
|
|
|
|
|
//求出边线的中点
|
|
|
CPoint pnt;
|
|
|
pnt.x = (pPoints[i].x + pPoints[j].x) / 2;
|
|
|
pnt.y = (pPoints[i].y + pPoints[j].y) / 2;
|
|
|
return pnt; // edge
|
|
|
} |