如何判断点在旋转椭圆内,边界以及包围矩形中

chenzhixin 2009-07-15 06:25:33
椭圆由2点pt1,pt2确定,之间的距离作为长轴,aE=(pt1-pt2)距离/2;
椭圆的旋转角度为pt1和pt2之间的角度.

现在可以跟随鼠标动态绘制旋转的椭圆了。
需要做到椭圆的选取,如何判断一个点是否在旋转的椭圆内呢?
查看反汇编,他们使用世界坐标来转换,然后使用PtInRect来做。
...全文
504 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhixin 2009-07-16
  • 打赏
  • 举报
回复
解决了。旋转的椭圆,需要将当前点绕中心点逆时针旋转angle
http://gpwiki.org/index.php/VB:Rotating_A_Point_In_2D

bool CDrawEllipse::AtEllipse(long x, long y)
{//判断点是否在椭圆上
float a,b,c;//椭圆的长半轴和短半轴,焦半轴
a=(float)abs(((m_x2-m_x1)/2));//长半轴
b=(float)abs(((m_y2-m_y1)/2));//短半轴
float DMax;
float d1,d2;//当前点到两个焦点的距离
float CenterPotX,CenterPotY;//中心点的坐标分量
CenterPotX=(float)((m_x2+m_x1)/2);
CenterPotY=(float)((m_y2+m_y1)/2);
if(a>=b)
{
c=(float)sqrt(a*a-b*b);//焦半轴
d1=(float)sqrt((x-CenterPotX+c)*(x-CenterPotX+c)+(y-CenterPotY)*(y-CenterPotY));//到左焦点的距离
d2=(float)sqrt((x-CenterPotX-c)*(x-CenterPotX-c)+(y-CenterPotY)*(y-CenterPotY));//到右焦点的距离
DMax=(float)abs(d1+d2-2*a);
}
if(a<b)
{
c=(float)sqrt(b*b-a*a);//焦半轴
d1=(float)sqrt((x-CenterPotX)*(x-CenterPotX)+(y-CenterPotY+c)*(y-CenterPotY+c));//到左焦点的距离
d2=(float)sqrt((x-CenterPotX)*(x-CenterPotX)+(y-CenterPotY-c)*(y-CenterPotY-c));//到右焦点的距离
DMax=(float)abs(d1+d2-2*b);
}
return (DMax<2);
}
bool CDrawEllipse::AtEllipseInside(long x, long y)
{//判断点是否在椭圆内
float a,b,c;//椭圆的长半轴和短半轴,焦半轴
a=(float)abs(((m_x2-m_x1)/2));//长半轴
b=(float)abs(((m_y2-m_y1)/2));//短半轴
float DMax;
float d1,d2;//当前点到两个焦点的距离
float CenterPotX,CenterPotY;//中心点的坐标分量
CenterPotX=(float)((m_x2+m_x1)/2);
CenterPotY=(float)((m_y2+m_y1)/2);
if(a>=b)
{
c=(float)sqrt(a*a-b*b);//焦半轴
d1=(float)sqrt((x-CenterPotX+c)*(x-CenterPotX+c)+(y-CenterPotY)*(y-CenterPotY));//到左焦点的距离
d2=(float)sqrt((x-CenterPotX-c)*(x-CenterPotX-c)+(y-CenterPotY)*(y-CenterPotY));//到右焦点的距离
DMax=(float)abs(2*a);
}
if(a<b)
{
c=(float)sqrt(b*b-a*a);//焦半轴
d1=(float)sqrt((x-CenterPotX)*(x-CenterPotX)+(y-CenterPotY+c)*(y-CenterPotY+c));//到左焦点的距离
d2=(float)sqrt((x-CenterPotX)*(x-CenterPotX)+(y-CenterPotY-c)*(y-CenterPotY-c));//到右焦点的距离
DMax=(float)abs(2*b);
}
return (d1+d2<DMax);
}


chenzhixin 2009-07-16
  • 打赏
  • 举报
回复
可是这个椭圆是旋转后的~
  • 打赏
  • 举报
回复
//m_pt1 m_pt2是椭圆所在矩形的两个点
float fRX=(m_pt2.x-m_pt1.x)/2.f;
float fRY=(m_pt2.y-m_pt1.y)/2.f;
CPoint cter;//椭圆中心点
if(pow(pnt.x-cter.x,2)+pow(pnt.y-cter.y,2)*(fRX/fRY)*(fRX/fRY)<=fRX*fRX)
//在椭圆内部
用户 昵称 2009-07-15
  • 打赏
  • 举报
回复
知道椭圆的方程吗?如果知道方程,最直接的办法就是计算鼠标到两个焦点的距离。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧