最近,在工作中遇到需要处理鼠标选中椭圆的问题,思来想去,最后老老实实使用标准方程来解决的。今天,一起假装高中生 _。
不多废话,直接上图:
场景描述:
在平面直角坐标系中,已知A、B两点坐标,并且画以AB为对角线的矩形的内接椭圆哦O,判断光标是否在椭圆上(选中该椭圆对象,椭圆高亮)。
首先,复习下焦点不在坐标轴的椭圆的方程:
点O(c,d)即为该椭圆中心点。
这里,我在实际项目中,为了鼠标选中椭圆明显,设置10%的上下浮动。
来看看具体实现:
bool PtInEllipse(CPoint pt1, CPoint pt2, CPoint pt0)
{
CPoint ptCenter((pt2.x + pt1.x) / 2, (pt2.y + pt1.y) / 2);
const int nLengthHorizon = abs(pt2.x - pt1.x) / 2;//a
const int nLengthVertical = abs(pt2.y - pt1.y) / 2;//b
float fRate = ((float)(pow(pt0.x - ptCenter.x, 2)) / pow(nLengthHorizon, 2)) +
((float)(pow(pt0.y - ptCenter.y, 2)) / pow(nLengthVertical, 2));
if (0.9 <= fRate&&fRate <= 1.1)//10%浮动,选中效果明显
{
return true;
}
return false;
}