19,472
社区成员




#include <math.h>
// 枚举方位
enum DIVIDED_POSITION
{
POSITION_NONE=0,
POSITION_LEFT,
POSITION_RIGHT,
POSITION_TOP,
POSITION_BOTTOM
}
// 函数体
DIVIDED_POSITION RectDevide(float fRectLeftX,float fRectBottomY,float fRectRightX,float fRectTopY,float fMouseX,float fMouseY)
{
//求4个绝对值
float fLeftDistanceX=abs(fRectLeftX-fMouseX);
float fRightDistanceX=abs(fRectRightX-fMouseX);
float fTopDistanceY=abs(fRectTopY-fMouseY);
float fBottomDistanceY=abs(fRectBottomY-fMouseY);
//比较两两大小
float fMaxHori=(fLeftDistanceX>fRightDistanceY)?fLeftDistanceX:fRightDistanceX;
float fMaxVerti=(fTopDistanceY>fBottomDistanceY)?fTopDistanceY:fBottomDistanceY;
//继续比较大小
switch ((fMaxHori>fMaxVerti)?fMaxHori:fMaxVerti)
{
case fLeftDistanceX:
return POSITION_LEFT; // 左
case fRightDistanceX:
return POSITION_RIGHT; // 右
case fTopDistanceY:
return POSITION_TOP; // 上
case fBottomDistanceY:
return POSITION_BOTTOM;
default:
return POSITION_NONE;
}
}
//struct CVSNestPoint
{
double m_dx;
double m_dy;
};
// 判断一个点是否在三角形中,如果点的坐标代入到三个边的ABC中结果同为正或同为负或有一个为0,都认为是在三角形中
BOOL CVSNestHelper::IsPtInTriangle(CVSNestPoint *pPtOne,CVSNestPoint *pPtTwo,CVSNestPoint *pPtThr,CVSNestPoint *pPtFour)
{
BOOL bReturn = false;
//求出三角形三边的ABC的值 Ax + By + C = 0
double A1,A2,A3;
double B1,B2,B3;
double C1,C2,C3;
//A1,B1,C1是第1点与第2点的直线ABC,A2,B2,C2是第2点与第3点的直线ABC,A3,B3,C3是第3点与第1点的直线ABC
A1 = pPtTwo->m_dY - pPtOne->m_dY;
B1 = pPtOne->m_dX - pPtTwo->m_dX;
C1 = pPtTwo->m_dX * pPtOne->m_dY - pPtOne->m_dX * pPtTwo->m_dY;
A2 = pPtThr->m_dY - pPtTwo->m_dY;
B2 = pPtTwo->m_dX - pPtThr->m_dX;
C2 = pPtThr->m_dX * pPtTwo->m_dY - pPtTwo->m_dX * pPtThr->m_dY;
A3 = pPtOne->m_dY - pPtThr->m_dY;
B3 = pPtThr->m_dX - pPtOne->m_dX;
C3 = pPtOne->m_dX * pPtThr->m_dY - pPtThr->m_dX * pPtOne->m_dY;
double x1,x2,x3;
x1 = A1 * pPtFour->m_dX + B1 * pPtFour->m_dY + C1;
x2 = A2 * pPtFour->m_dX + B2 * pPtFour->m_dY + C2;
x3 = A3 * pPtFour->m_dX + B3 * pPtFour->m_dY + C3;
if(((x1 > ESP) && (x2 > ESP) && (x3 > ESP)) || ((x1 < -ESP) && (x2 < -ESP) && (x3 < -ESP)))
{
bReturn = true;
return bReturn;
}
//如果第四点代入系数方程为0
if(fabs(x1) <= ESP)
{
//如果第4点的在两点之间,则在三角形上,否则在外
if(((pPtOne->m_dX - pPtFour->m_dX) * (pPtTwo->m_dX - pPtFour->m_dX) <=ESP) &&
((pPtOne->m_dY - pPtFour->m_dY) * (pPtTwo->m_dY - pPtFour->m_dY) <=ESP))
{
bReturn = true;
return bReturn;
}
}
if( fabs(x2) <= ESP )
{
//如果第4点的在两点之间,则在三角形上,否则在外
if(((pPtThr->m_dX - pPtFour->m_dX) * (pPtTwo->m_dX - pPtFour->m_dX) <=ESP) &&
((pPtThr->m_dY - pPtFour->m_dY) * (pPtTwo->m_dY - pPtFour->m_dY) <=ESP))
{
bReturn = true;
return bReturn;
}
}
if( fabs(x3) <= ESP )
{
//如果第4点的在两点之间,则在三角形上,否则在外
if(((pPtThr->m_dX - pPtFour->m_dX) * (pPtOne->m_dX - pPtFour->m_dX) <= ESP) &&
((pPtThr->m_dY - pPtFour->m_dY) * (pPtOne->m_dY - pPtFour->m_dY) <= ESP))
{
bReturn = true;
return bReturn;
}
}
return bReturn;
}