点是否在线上或者椭圆上

//点是否在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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值