Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将X、Y转换为角度_Java_Android_Angle - Fatal编程技术网

Java 将X、Y转换为角度

Java 将X、Y转换为角度,java,android,angle,Java,Android,Angle,我需要一种将X和Y坐标转换成角度的方法。我有此代码,但我需要此布局: 180 90270 360 private double getAngle(double xTouch, double yTouch) { double x = xTouch - (slideBtn.getWidth() / 2d); double y = slideBtn.getHeight() - yTouch - (slideBtn.getHeight() / 2d); switch (get

我需要一种将X和Y坐标转换成角度的方法。我有此代码,但我需要此布局:

 180
90270

360

private double getAngle(double xTouch, double yTouch) {
    double x = xTouch - (slideBtn.getWidth() / 2d);
    double y = slideBtn.getHeight() - yTouch - (slideBtn.getHeight() / 2d);
    switch (getQuadrant(x, y)) {
        case 1:
            return Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI;
        case 2:
            return 180 - Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI;
        case 3:
            return 180 + (-1 * Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI);
        case 4:
            return 360 + Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI;
        default:
            return 0;
    }
}

/**
 * @return The selected quadrant.
 */
private static int getQuadrant(double x, double y) {
    if (x >= 0) {
        return y >= 0 ? 1 : 4;
    } else {
        return y >= 0 ? 2 : 3;
    }
}

编辑,以澄清问题:我遇到的问题是,我得到了错误的x,y角度角度。例如:0/360度是圆的顶部,180度是圆的底部。我尝试使用上面的代码修复它(使用不同的象限,但没有成功)。被接受的答案帮了我的忙。

我不确定你想要达到什么目的,但是仅仅使用atan2函数来获得角度不是更容易吗

,双份)

如果您不熟悉该功能,可以在此处阅读:

编辑,代码示例:

在讨论之后,这里是一些我认为有用的代码

public static double getAngle(int x, int y)
{
    return 1.5 * Math.PI - Math.atan2(y,x); //note the atan2 call, the order of paramers is y then x
}
基本上,它计算负Y轴与正顺时针方向之间的角度。我希望这就是你一直在寻找的。

var x,x1,x2,y,y1,y2;
变量单元格='cell0';
var h,w;
var-cx,cy;
var-dx,dy;
var derajat;
var deg;
瓦朗;
var灯;
var控制;
功能鼠标\监视(事件){
x=event.clientX;
y=event.clientY;
单元数据(单元);
koordina(x2,y2);
布苏尔(德拉贾特);
}
函数坐标(x2,y2){
x2=x-cx;
y2=y-cy;
yk=y2;
xk=x2;
}
功能busur(derajat){
y1=数学sqrt((数学abs(yk)*数学abs(yk))+(数学abs(xk)*(数学abs(xk));
x1=0;
dy=yk-y1;
dx=xk-x1;
rad=数学常数2(dy,dx);
derajat=rad*(360/Math.PI);
单元格=document.getElementById(单元格);
ang=cell.getElementsByClassName('angle0')[0];
ang.style.transform='旋转('+derajat+'deg');
light=ang.getElementsByClassName('points')[0];
light.style.height=y1+'px';
}
功能单元\数据(单元){
单元格=document.getElementById(单元格);
h=编号(单元格.样式.高度.替换('px','');
w=编号(单元格.样式.宽度.替换('px','');
cy=编号(单元格样式顶部替换('px','')+h/2;
cx=编号(单元格样式左替换('px','')+w/2;
}
。预览引擎{
位置:绝对位置;
排名:0;
左:0;
填充:10px;
背景色:#2E8AE6;
颜色:白色;
}
身体{
游标:默认值;
宽度:100%;
身高:100%;
字体系列:Arial;
字体大小:12px;
}
.实地调查{
宽度:100%;
身高:100%;
位置:绝对位置;
顶部:0px;
左:0px;
}
.细胞{
位置:相对位置;
过渡:宽度2s,高度2s,顶部2s,左侧2s;
背景色:红色;
}
.0{
宽度:200px;
高度:200px;
位置:绝对位置;
顶部:-75px;
左:-75px;
背景颜色:绿色;
边界半径:50%;
不透明度:0.5;
过渡:宽度2s,高度2s,顶部2s,左侧2s;
}
.要点{
宽度:10px;
高度:10px;
位置:绝对位置;
左:95px;
顶部:95px;
背景色:红色;
边界半径:1米;
不透明度:无;
}

此类将操纵杆的输入转换为角度,0表示y轴正方向为0度,x轴正方向为90度,y轴负方向为180度,x轴负方向为270度

public class GetAngle {

    public static void main(String[] args) {

        System.out.println(getAngle(-1,0));

    }

    public static double getAngle(double x, double y) {

        // Checking if the joystick is at center (0,0) and returns a 'stand still'
        // command by setting the return to 99999
        if (x == 0 && y == 0) {

            return (99999);

            // Returns a value based on the quadrant and does some math to deliver the angle
            // of the coordinates
        } else if (x >= 0 && y > 0) {

            return (90 - (Math.atan(y / x) * 180 / Math.PI));

        } else if (x > 0 && y <= 0) {

            return (90 - (Math.atan(y / x) * 180 / Math.PI));

        } else if (x <= 0 && y < 0) {

            return (180 + (Math.atan(y / x) * 180 / Math.PI));

        } else if (x < 0 && y >= 0) {

            return (270 - (Math.atan(y / x) * 180 / Math.PI));

        } else
            return (99999);

    }

}
公共类GetAngle{
公共静态void main(字符串[]args){
系统输出println(getAngle(-1,0));
}
公共静态双角度(双x,双y){
//检查操纵手柄是否位于中心(0,0)并返回“静止”
//命令,将返回设置为99999
如果(x==0&&y==0){
报税表(99999);
//返回基于象限的值,并进行一些数学运算以提供角度
//坐标的变化
}如果(x>=0&&y>0),则为else{
返回值(90-(数学平均值(y/x)*180/数学平均值));

}else if(执行getAngle()方法时x>0&&y)我得到了错误的角度布局。所以我需要上面指定的角度布局。atan2不是我想要的东西…180度,而不是顶部的90度。因此,将整个角度旋转90度,但我不知道如何做当你得到atan2的结果时,你应该只添加PI/2,将角度逆时针旋转90度,如果这就是你的问题所在。但问题是我不明白你的布局上是0度,角度是顺时针还是逆时针增加的?0度与360度在同一点上,但我会尝试atan2!谢谢,当它工作时我会接受你的答案我有时速度慢…在这种情况下,我认为你应该减去角度e你从-90度的角度从atan2得到。这样你可以反转方向和坐标开始。我已经编辑了我的答案,我希望这就是你一直在寻找的答案,但我要求的是java答案,而不是javascript答案;)但我可能可以用java重写它,所以谢谢!你能帮我用java写我的游戏吗?我用javascript制作了一个在浏览器中运行的游戏,但我卡在了用于运行游戏的gpu内存中,如果游戏创建更多对象,它会使flash运行变慢。