社区
图形处理/算法
帖子详情
如何判断点在旋转椭圆内,边界以及包围矩形中
chenzhixin
2009-07-15 06:25:33
椭圆由2点pt1,pt2确定,之间的距离作为长轴,aE=(pt1-pt2)距离/2;
椭圆的旋转角度为pt1和pt2之间的角度.
现在可以跟随鼠标动态绘制旋转的椭圆了。
需要做到椭圆的选取,如何判断一个点是否在旋转的椭圆内呢?
查看反汇编,他们使用世界坐标来转换,然后使用PtInRect来做。
...全文
564
4
打赏
收藏
如何判断点在旋转椭圆内,边界以及包围矩形中
椭圆由2点pt1,pt2确定,之间的距离作为长轴,aE=(pt1-pt2)距离/2; 椭圆的旋转角度为pt1和pt2之间的角度. 现在可以跟随鼠标动态绘制旋转的椭圆了。 需要做到椭圆的选取,如何判断一个点是否在旋转的椭圆内呢? 查看反汇编,他们使用世界坐标来转换,然后使用PtInRect来做。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
可是这个椭圆是旋转后的~
写不动代码的人
2009-07-15
打赏
举报
回复
//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
打赏
举报
回复
知道椭圆的方程吗?如果知道方程,最直接的办法就是计算鼠标到两个焦点的距离。
opencv之轮廓周围绘制
矩形
框和圆形框实例下载
获取图像的轮廓,并在轮廓周围绘制图形在图像处理
中
很常用,此实例详细讲解了发现轮廓的步骤, 通过相关API在轮廓
中
找到最小
矩形
和圆,
旋转
矩形
和
椭圆
,然后绘制。
基于 YOLOv5 的改进算法 MR2-YOLOv5
针对传统目标检测算法未考虑实际分拣场景目标物形态尺度的多样性, 无法获取
旋转
角度信息的问题, 提出基于 YOLOv5 的改进算法 MR2-YOLOv5.
2018吉林省数学建模竞赛A题__自己做的相关结果和代码
2018吉林省数学建模竞赛A题__自己做的相关结果和代码 用到的知识:广义霍夫变换 霍夫变换 最小外接
矩形
模式识别物体测量PPT学习教案.pptx
模式识别物体测量PPT学习教案.pptx
vc++图形基元的显示
VC++图形基元的显示/VC++图形基元的显示/VC++图形基元的显示
图形处理/算法
19,472
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章