IDE:Visual Studio 2010,c#.net 4.0 winforms application。
嗨,在我的应用程序中,我必须划分一个圆圈(在面板(圆形图像)上设置8个部分,请建议如何将其划分为8个部分。
示例
因为我想在这些部分上执行不同的鼠标按下鼠标向上事件。所以如果你能建议任何技巧方法或算法或dll或api来解决这个问题会更好。
答案 0 :(得分:3)
将(x,y)坐标转换为圆心的极坐标(半径,角度)。然后,如果半径在圆圈内,请使用角度值来确定用户单击的段。
例如,如果圆圈的中心位于(xc,yc)
,并且(x,y)
中出现点击,则
float dx = x-xc, dy = y-yc;
float radius = (float)Math.Sqrt(dx*dx+dy*dy);
float angle = (float)Math.Atan2(dy,dx);
if(angle<0) { angle += 2*Math.PI; }
float segment_angle = 2*Math.PI/8;
if( radius <= diameter/2)
{
int segment = (int)(angle/segment_angle);
}
答案 1 :(得分:3)
您的问题最好用极坐标表示,而鼠标坐标通常以笛卡尔值表示。
要转换,请计算鼠标所在控件的哪个部分,作为坐标偏移量。 如,
var xOffset = xMouse - xCenter;
var yOffset = yMouse - yCenter;
使用atan2将偏移转换为[0,360]度的角度:
var angle = Math.Atan2(yOffset, xOffset)/Math.Pi*180 + 180;
现在使用角度值来确定您所在的行业:
int nSectors = 8;
int sectorId = (int)angle/360.0*nSectors;