//点是否在Ellipse上面
BOOL PtInEllipse(CPoint point/*测试点*/, CPoint lineStartPoint/*椭圆坐上角*/, CPoint lineEndPoint/*椭圆右下角*/,double fTolerance = 5/*允许的误差*/)
{//计算想x^2/a^2 + y^2/b^2 = 1 中的ab
CRect rt(min(lineStartPoint.x,lineEndPoint.x),min(lineStartPoint.y,lineEndPoint.y),max(lineStartPoint.x,lineEndPoint.x),max(lineStartPoint.y,lineEndPoint.y));
float a = (float)rt.Width()/2;float b = (float)rt.Height()/2;
if(point.x > rt.right+fTolerance || point.x < rt.left-fTolerance || point.y < rt.top - fTolerance || point.y > rt.bottom + fTolerance) return FALSE;
float x = a - (rt.right - point.x);
if (abs(x) >= a + fTolerance)
{
if(x > 0) x - fTolerance;
else x + fTolerance;
}
if (abs(x) > a) return FALSE;
float y1 = 0;
if(point.y > rt.bottom - b)
y1 = (rt.top + rt.bottom)/2 + sqrt(1-pow(x,2)/(a*a))*b;
else
y1 = (rt.top + rt.bottom)/2 - sqrt(1-pow(x,2)/(a*a))*b;
if(abs(y1 - point.y )>= fTolerance) return FALSE;
return TRUE;
}
//点是否在线段上
BOOL PtInLine(CPoint point, CPoint lineStartPoint, CPoint lineEndPoint, double fTolerance = 5)
{
//叉积=0三点 (X1 Y1 ) (X2 Y2) (X3 Y3)叉积=(X1-X2)*(Y3-Y2)-(X3-X2)*(Y1-Y2)=0时 三点在一直线上
double L,R,S;
BOOL bResult = FALSE;
L = sqrt((double)((lineEndPoint.x-lineStartPoint.x)*(lineEndPoint.x-lineStartPoint.x) + (lineEndPoint.y-lineStartPoint.y)*(lineEndPoint.y-lineStartPoint.y)));
if(L != 0)
{
R = ((lineStartPoint.y-point.y)*(lineStartPoint.y-lineEndPoint.y)-(lineStartPoint.x-point.x)*(lineEndPoint.x-lineStartPoint.x))/(L*L);
S = ((lineStartPoint.y-point.y)*(lineEndPoint.x-lineStartPoint.x)-(lineStartPoint.x-point.x)*(lineEndPoint.y-lineStartPoint.y))/(L*L);
if(R>0 && R<1)
{
if(abs(S*L)<= fTolerance)
bResult = TRUE;
}
}
return bResult;
}