2016-04-02 45 views
1

我想要为x = rcos(a)和y = rsin(a)生成半径为1的圆的x和y值,但是当我使用三下面的不同方法我只通过手动添加它们来获得正确的值,但我想将它们添加到循环中。Java ArrayList在使用for循环时存储不同的值

ArrayList<Double> cCoords = new ArrayList<Double>(); 
double pi = Math.PI; 
double pi_over_two = Math.PI/2.0; 
double pi_over_four = Math.PI/4.0; 
double pi_over_180 = Math.PI/180.0; 
double piVals = 0; 


cCoords.add(Math.cos(0)); 
cCoords.add(Math.sin(0)); 
cCoords.add(Long.valueOf(Math.round(Math.cos(pi_over_two))).doubleValue()); 
cCoords.add(Math.sin(pi_over_two)); 
cCoords.add(Math.sin(pi_over_two+pi_over_two+pi_over_two)); 

////////Below values are printed correctly 

    cCoords.add(Math.cos(pi_over_four)); 
    cCoords.add(Math.sin(pi_over_four)); 

    cCoords.add(Math.cos(pi_over_four+pi_over_four)); 
    cCoords.add((Math.sin(pi_over_four+pi_over_four))); 

    cCoords.add(Math.cos(pi_over_four+pi_over_four+pi_over_four)); 
    cCoords.add(Math.sin(pi_over_four+pi_over_four+pi_over_four)); 

    cCoords.add(Math.cos(pi_over_four +pi_over_four+pi_over_four+pi_over_four)); 
    cCoords.add(Math.sin(pi_over_four +pi_over_four+pi_over_four+pi_over_four)); 

    cCoords.add(Math.cos(pi_over_four+pi_over_four + pi_over_four+pi_over_four+pi_over_four)); 
    cCoords.add(Math.sin(pi_over_four+pi_over_four +pi_over_four+pi_over_four+pi_over_four)); 

    cCoords.add(Math.cos(pi_over_four+pi_over_four+pi_over_four +pi_over_four+pi_over_four+pi_over_four)); 
    cCoords.add(Math.sin(pi_over_four+pi_over_four+pi_over_four + pi_over_four+pi_over_four+pi_over_four)); 


//////////////Above values are printed correctly 


    for(int i = 0; i < 6; i++) { // Wrong values 

     cCoords.add(i, Math.cos(pi_over_four)); 
     cCoords.add(i+1, Math.sin(pi_over_four)); 

     pi_over_four+=pi_over_four; 

    } 
///// 


    for(int i = 0; i < 6; i++) { // x=1 coordinate gets repeated with different y values 

     cCoords.add(Math.cos(pi_over_four)); 
     cCoords.add(Math.sin(pi_over_four)); 

     pi_over_four+=pi_over_four; 

    } 

//// 

    for(int i = 0; i < cCoords.size()-1; i+=2) { 
     System.out.print("(" + cCoords.get(i) + ","); 
     System.out.println(cCoords.get(i+1) + ")\n"); 
    } 

回答

1

pi_over_four在变化每次循环,因此在现实中,代替由2^x,其中x为i + 1 2的每个要乘以时间相乘。想象一下,在第一个循环中,pi_over_four等于pi/4,在第二个等于pi/2时,但是您将pi/2添加到pi/4而不是pi/4,从而使第三个循环具有相等的性能到pi。将新的pi_over_four存储在其他变量中以解决此问题。

2

由于您在更改变量pi_over_four本身的值后在循环中插入了错误的值,所以得到的值不正确。

例如,你说的是正确打印的值下面的代码片段,你从刚刚pi_over_four一倍为下一次迭代即2 * pi_over_four值:

cCoords.add(Math.cos(pi_over_four)); 
cCoords.add(Math.sin(pi_over_four)); 

cCoords.add(Math.cos(pi_over_four + pi_over_four)); 
cCoords.add(Math.sin(pi_over_four + pi_over_four)); 

在下一次迭代中变得3 * pi_over_four

cCoords.add(Math.cos(pi_over_four + pi_over_four + pi_over_four)); 
cCoords.add(Math.sin(pi_over_four + pi_over_four + pi_over_four)); 

请注意,在这里您不会更改变量pi_over_four的值。你只是在做n * pi_over_four然后把它存回列表中。

但是,如果您仔细看到您的循环,则您正在更改pi_over_four本身的值,这是错误的。你应该做的却是这样的:

for(int i = 0; i < 6; i++) { 
    cCoords.add(i, Math.cos((i + 1) * pi_over_four)); 
    cCoords.add(i+1, Math.sin((i + 1) * pi_over_four)); 
} 
+0

谢谢大家的帮助下,找到了循环应该是类似 您的建议: INT J = 0; for(int i = 0; i <6; i + = 2)cCoords.add(i,Math.cos((j)* pi_over_four)); cCoords.add(i + 1,Math.sin((j)* pi_over_four)); j + = 0.5) – user1420482

+0

@ user1420482您的欢迎! :) – user2004685