2012-09-11 111 views
2

我正在绘制一个围绕按钮中间的假想圆。计算一个圆中的坐标

圆的半径是Height/2如果Height>WidthWidth/2如果Width>Height。 现在我要计算哪个坐标(以像素为单位)在这个圆圈内。 这个想法是,如果例如鼠标光标悬停在该圆上,发生了一些事情。

+3

你试过了什么?请提供一些示例代码。 – VIRA

+0

您的帖子无法阅读。您可以使用代码标记等来改进它吗? –

+1

为什么使用该半径?也许你想要直圈的外接圆。根据毕达哥拉斯定理,它的“半径*半径”等于“(高度/ 2)*(宽度/ 2)”或“高度*宽度/ 4”。所以你可以检查(避免整数除法)如果4 *(deltaX * deltaX + deltaY * deltaY)<= height * width'。 –

回答

3

你是圈内时,这个等式满足:

Math.pow(mouse_pos_x-center_circle_x,2)+Math.pow(mouse_pos_y-center_circle_y,2)<Math.pow(radius,2) 
+0

thx为您的帮助 –

4

计算每个坐标是矫枉过正;只需比较距离即可。例如:

int radius = 5; // whatever 

int deltaX = originX - mouseX, deltaY = originY - mouseY; 

// compare the square distance, to avoid an unnecessary square-root 
if((deltaX * deltaX) + (deltaY * deltaY) <= (radius * radius)) { 
    // inside the circle, or on the edge 
} 

为了避免一些数学,你也可以做一个快速的包围盒检查,即检查矩形区域(只是加法/减法)。这可以组合使用,即

  • 检查边框
    • 如果不是在边框它肯定不是在圈内
    • 如果在边界框,做数学题比较多,距离
+0

我认为一旦你将距离计算减少到5个整数运算(平方半径可以预先确定),边界框优化稍微矫枉过正,特别是因为这是对鼠标运动的反应(这在一秒内不会发生多次)。 – Rotem

1

根据定义,圆的面积是一组距离等于或小于中心的点。

所有你必须做的测试一个点是否在一个圆内是计算它和中心点之间的距离。如果此距离小于圆的半径,则该点位于圆内。

double Distance(Point p1, Point p2) 
{ 
    int x = p1.X - p2.X; 
    int y = p1.Y - p2.Y; 
    return Math.Sqrt(x * x + y * y); 
} 
+2

在大多数命中测试中,您只需比较*平方*距离,而不是计算(相对昂贵的)平方根。 –

+0

@Marc谢谢,这是一个好主意。 – Rotem

1

您可以使用一个条件:

x^2+y^2<R^2 

其中R - 半径, 所有这些点都在圆。