我发现this question处理同样的问题。提供的答案有效,但我需要稍微改变一下。以下是我的答案:
double theta = Math.atan2(pointerY - height / 2, pointerX - width / 2);
if(theta<0)
theta = Math.PI - theta;
int whichSlice = 0;
double sliceSize = Math.PI*2 / 4;
double sliceStart;
for(int i=1; i<=4; i++) {
sliceStart = i*sliceSize;
if(theta < sliceStart) {
whichSlice = i;
break;
}
}
就我而言,我需要将象限旋转45度。以下是一个例子;红色是这个代码的作用,而绿色是我想要的:
我尝试了各种代码更改,但仍然无法弄明白。
答案 0 :(得分:1)
编辑:
首先,在它自己绝望的JComponent中创建你的圈子,并添加它自己的听众 - 基本上为这个圈子创建一个类,让圈子本身接收鼠标事件,并确保它是圆圈占领了整个矩阵 - 它必须触及所有边缘(我将使用this.getHeight(),这必须返回圆圈边界框的高度)!!!
下面修复了支持这种情况的代码,除了支持向下增加的y轴:
第1步: 检查我们是否在圈内。 第2步: 检查我们是否高于/低于对角线(注意:对角线的方程是y = x,y = -x)
Point pointWeAreChecking;
Point centerOfCircle;
double radius;
if(Math.pow(Math.pow(pointWeAreChecking.x-centerOfCircle.x , 2) + Math.pow(pointWeAreChecking.y-centerOfCircle.y , 2), 0.5) <= radius)
{
//Means we are in circle.
if(pointWeAreChecking.y>pointWeAreChecking.x)
{
//Means it is either in 2 or 3 (it is below y = -x line)
if(pointWeAreChecking.y>-pointWeAreChecking.x + this.getHeight()){
//We are in 2.
}else
{
//We are in 3.
}
}else
{
if(pointWeAreChecking.y>-pointWeAreChecking.x + this.getHeight())
{
//We are in 4.
}else
{
//We are in 2.
}
}
}