将正弦波打印到控制台

时间:2015-02-27 18:30:46

标签: java console trigonometry sine cos

我正在开发一个将正弦波打印到控制台的Java程序。这是我到目前为止所写的:

int num = 7;
for (double y = 2; y >= 0; y-=0.2) {
  for (double x = 0; x <= num; x+=0.2) {
    if ( ((0.1+x) >= Math.asin((double)y-1)) && (((double)x-0.1) <= Math.asin((double)y-1)) )
      System.out.print('*');
    else
      System.out.print(' ');
  }
  System.out.println();
}

本质上,该程序将每行上的每个字符视为坐标平面上的0.2 x 0.2区域。如果正弦函数穿过此区域,则会在屏幕上打印星号。否则,打印一个空格。 运行时,会将其打印到控制台:

        *                          
     *                             
   *                               
  *                                
 *                                 
*                                  

有人可以告诉我为什么我的程序在打印第一季度的波浪后停止了吗?

4 个答案:

答案 0 :(得分:0)

编辑:糟糕,快速浏览代码。这是错误的。

好吧,您将num设置为7,然后在循环中将x从0带到num-1,因此您只能循环超过7列。增加num,您的图表应添加其他列。如果您希望图表扩展为负数,则必须增加循环的y值范围。

但是,您的算法效率极低。您为图表中的每个方块计算了asin(y-1)两次,当您真正需要做的就是为每列计算一次sin(x)。为什么不用预先计算的正弦值填充数组,然后在绘制图形时查阅数组? (当然,我意识到,在现代计算机上,它的速度足够快,几乎无论如何都无关紧要。)

答案 1 :(得分:0)

问题似乎来自你的if语句,它几乎总是评估为false。您应该检查条件表达式后面的微积分。我发现增加num在这里并没有真正帮助。

例如,将System.out.print(' ');替换为System.out.print('_');,也许应该打印另一个字符而不是空格。这样您就可以弄清楚程序的行为方式。重新编写你的算法可能也会有所帮助。

答案 2 :(得分:0)

它仅打印正弦波的第一个四分之一的原因是由于指示range of Math.asin

  

返回值的反正弦值;返回的角度在-pi / 2到pi / 2的范围内。

提前xMath.PI / 2后,if语句的条件将始终为false

您可以利用

这一事实

sin(π - x )= sin( x

sin(2π - x )= -sin( x

包含更多条件。 (为了清楚起见,我还删除了double不必要的演员表。)

if ( (0.1+x >= Math.asin(y-1)) && (x-0.1 <= Math.asin(y-1)) ||
     (0.1+x >= Math.PI - Math.asin(y-1)) && (x-0.1 <= Math.PI - Math.asin(y-1))
     (2*Math.PI -(0.1 + x) <= -Math.asin(y-1)) && (2*Math.PI -(x-0.1) >= -Math.asin(y-1))  )

输出:

        *                          
     *     *                       
   *        *                      
  *           *                  * 
 *             *                *  
*               *              *   
                 *            *    
                  *          *     
                   *        *      
                    *      *       
                        *          

答案 3 :(得分:0)

谢谢大家的帮助!根据@ dasblinkenlight建议使用sin而不是asin,我找到了一个非常简单的解决方案:

int num = 7;
for (double y = 1; y >= -1; y-=0.2) {
  for (double x = 0; x <= num; x+=0.2) {
    double sin = Math.sin(x);
    if ( (0.1+y) >= sin && (y-0.1) <= sin )
      System.out.print('*');
    else
      System.out.print(' ');
  }
  System.out.println();
}

将此打印到控制台:

      *****                        
    **     *                       
   *        **                     
  *           *                  **
 *             *                *  
*               *              *   
                 *            *    
                  *          *     
                   *        *      
                    **    **       
                      ****