Java 获取集合在360和1之间的平均度数方向

Java 获取集合在360和1之间的平均度数方向,java,math,Java,Math,我试着从0到359取一组角度,得到角度的平均方向。我到处都搜索过,有些示例可以运行,但由于某种原因,我的代码无法运行 例如,{355355,15,15}的平均值应该是5度,但是我得到了一系列不同的答案,这些答案没有多大意义 我使用wiki提供的公式: publicstaticvoidmain(字符串[]args){ //ATAN2(sin之和(θ),cos之和(θ)) 双[]数={355355,15,15}; 双正弦=0.0,cos=0.0,θ=0.0; 用于(双d:数字){ sin+=数学s

我试着从0到359取一组角度,得到角度的平均方向。我到处都搜索过,有些示例可以运行,但由于某种原因,我的代码无法运行

例如,{355355,15,15}的平均值应该是5度,但是我得到了一系列不同的答案,这些答案没有多大意义

我使用wiki提供的公式:

publicstaticvoidmain(字符串[]args){
//ATAN2(sin之和(θ),cos之和(θ))
双[]数={355355,15,15};
双正弦=0.0,cos=0.0,θ=0.0;
用于(双d:数字){
sin+=数学sin(d);
cos+=数学cos(d);
}
sin=sin/((双)个数.长度);
cos=cos/((双)个数.长度);
//仅使用atan2
System.out.println(“仅Atan2:+Math.toDegrees(Math.Atan2(sin,cos)));
//仅限Atan2:159.71920992022936
//使用wiki解决方案
如果(sin>0&&cos>0){
θ=Math.atan(sin/cos);
}else if(cos<0){
θ=Math.atan(sin/cos)+180;
}else if(sin<0&&cos>0){
θ=Math.atan(sin/cos)+360;
}
System.out.println(“维基答案:+theta”);
//维基答案:179.6460334382022
}

Java中的数学方法假设您使用的是弧度,而不是度。尝试将所有值乘以π/180,将其转换为弧度,看看这是否能解决问题。

注意:这种方法存在相当大的缺陷;将这个答案留在这里,以便其他人理解这些缺陷。有关详细信息,请参阅@LutzL和我(@Nadesri)之间的评论

也许我错过了什么。。。 我想你应该能够把所有的数字相加,取360度的模和,然后除以n

private double avgOfAngles(List<int> numbers) {
    int n = numbers.size();
    int sum = 0;
    for (int i=0; i<numbers; i++) {
        sum += numbers.get(i);
    }
    return (double) (sum % 360) / n;
}
private double avgOfAngles(列表编号){
int n=numbers.size();
整数和=0;

对于(int i=0;i,您需要将输入从度转换为弧度,再转换为正弦和余弦,然后返回结果:

    double[] numbers = {355, 5, 15 };
    double sin=0.0, cos=0.0, theta=0.0;

    for(double d : numbers) {
        double s = Math.sin(Math.toRadians(d));
        sin += s;

        double c = Math.cos(Math.toRadians(d));
        cos += c;
    }

    sin = sin / ((double)numbers.length);
    cos = cos / ((double)numbers.length);

    // Using only atan2
    System.out.println("Atan2 Only: " + Math.toDegrees(Math.atan2(sin, cos)));
    // Atan2 Only: 159.71920992022936

    // Using the wiki solution
    if (sin > 0 && cos > 0) {
        theta = Math.atan(sin/cos);
    } else if(cos < 0) {
        theta = Math.atan(sin/cos) + 180;
    } else if(sin < 0 && cos > 0) {
        theta = Math.atan(sin/cos) + 360;
    }
    System.out.println("Wiki Answer: " + theta);
    System.out.println("Wiki Answer in degrees: " + Math.toDegrees(theta));

不,你会遇到同样的问题,因为(355+15)/2=185保持不变的模360。谢谢@LutzL:我的原始帖子的平均值是:sum%360/n;阅读维基让我困惑,直觉上正确的答案应该是什么。我编辑了我的答案以反映原始解决方案(sum%360/n),根据早期修订和不正确的解决方案(sum/n%360),我不确定您是否可以通过这种方式穷尽反例的可能性。这里的第一个是345°和5°的中点,因为简化模型360保留350不变。现在可以将范围缩小到(-180°)180°),但对于180°左右的点簇会发生什么?或者取三元组(119120121)和360,@LutzL:好点;我同意在考虑三元组(或任何更大的三元组)时,解决方案很容易崩溃谢谢你指出这一点。我可以选择把这个答案留在这里,这样别人就可以看到它有缺陷的逻辑,将来有人会考虑这个答案吗?难道你不需要一个关于<代码> Cs==0 的例子吗?
    double[] numbers = {355, 5, 15 };
    double sin=0.0, cos=0.0, theta=0.0;

    for(double d : numbers) {
        double s = Math.sin(Math.toRadians(d));
        sin += s;

        double c = Math.cos(Math.toRadians(d));
        cos += c;
    }

    sin = sin / ((double)numbers.length);
    cos = cos / ((double)numbers.length);

    // Using only atan2
    System.out.println("Atan2 Only: " + Math.toDegrees(Math.atan2(sin, cos)));
    // Atan2 Only: 159.71920992022936

    // Using the wiki solution
    if (sin > 0 && cos > 0) {
        theta = Math.atan(sin/cos);
    } else if(cos < 0) {
        theta = Math.atan(sin/cos) + 180;
    } else if(sin < 0 && cos > 0) {
        theta = Math.atan(sin/cos) + 360;
    }
    System.out.println("Wiki Answer: " + theta);
    System.out.println("Wiki Answer in degrees: " + Math.toDegrees(theta));
Atan2 Only: 4.9999999999999964
Wiki Answer: 0.08726646259971642
Wiki Answer in degrees: 4.9999999999999964