首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将正弦波打印到控制台

将正弦波打印到控制台
EN

Stack Overflow用户
提问于 2015-02-27 18:30:46
回答 4查看 4K关注 0票数 4

我正在编写一个将正弦波输出到控制台的Java程序。这就是我到目前为止所写的:

代码语言:javascript
运行
复制
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.2x0.2区域。如果正弦函数穿过这个区域,屏幕上会打印一个星号。否则,打印一个空格。当运行时,这将被打印到控制台:

代码语言:javascript
运行
复制
        *                          
     *                             
   *                               
  *                                
 *                                 
*                                  

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-27 19:09:03

它之所以只打印正弦波的第一节是因为指示的Math.asin

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

一旦x通过了Math.PI / 2,那么if语句的条件将始终是false

你可以利用这一事实

sin(π- x) = sin(x)

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

包括更多的条件。(为了清晰起见,我还删除了对double的不必要转换。)

代码语言:javascript
运行
复制
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))  )

输出:

代码语言:javascript
运行
复制
        *                          
     *     *                       
   *        *                      
  *           *                  * 
 *             *                *  
*               *              *   
                 *            *    
                  *          *     
                   *        *      
                    *      *       
                        *          
票数 1
EN

Stack Overflow用户

发布于 2015-02-27 18:39:26

编辑:哇,浏览代码有点太快了。这是错误的,

那么,您将num设置为7,然后在循环中将x从0取为num-1,所以您只需要遍历7列。增加num,您的图形应该添加额外的列。如果你想把图扩展到负数,你也必须增加y值的范围。

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

票数 0
EN

Stack Overflow用户

发布于 2015-02-27 18:50:43

这个问题似乎是由if语句的条件引起的,它几乎总是计算为false。您应该检查条件表达式后面的微积分。我发现增加num对这里没有什么帮助。

也许您应该打印另一个字符,而不是空白,例如用System.out.print(' ');代替System.out.print('_');。通过这种方式,您可能能够理解为什么您的程序会这样做。改进您的算法也可能有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28771899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档