检查点是否在圆形扇区中

时间:2014-09-03 03:00:34

标签: java math

我发现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度。以下是一个例子;红色是这个代码的作用,而绿色是我想要的:

enter image description here

我尝试了各种代码更改,但仍然无法弄明白。

1 个答案:

答案 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.
}
}

 }