同时绘制正弦和余弦曲线

Posted

技术标签:

【中文标题】同时绘制正弦和余弦曲线【英文标题】:Drawing simultaneously sine and cosine curves 【发布时间】:2019-12-04 13:31:49 【问题描述】:

我正在尝试编写一个 c 程序,当正弦和余弦的值相等时,使用“+”表示正弦,“x”表示余弦,“*”。代码如下:

#include<stdio.h>
#include<math.h> /* for  sin(x) */

#define M_PI 3.14159265358979323846264338327950288

int main() 
  double x;
  int s_indent;
  int c_indent;
  for(x = -180.0; x <=180.0; x+=15.0) 
    /*  compute  value  */
    s_indent = 10 + 10* sin(x/180 * M_PI);
    c_indent = 10 +  10* cos(x/180 * M_PI);


    if(c_indent == s_indent)
      for(;s_indent;--s_indent) putchar(' ');
      printf("*\n");
    
    else
      for(; s_indent; --s_indent) putchar(' ');
      printf("+\n");

      /* plot x at position */

      for(; c_indent; --c_indent) putchar(' ');
      printf("x\n");
    
  
  return 0;


但代码的问题在于它逐行生成曲线。喜欢这里:

我想把它放在像这里这样的同一行:

想法?

【问题讨论】:

将字符写入 2D 缓冲区,例如 80 x 25 个字符。然后打印每一行。 是的,这是可能的。 Stack Overflow 不是“为我编写代码”服务。 您可能会发现one of the answers here 会有所帮助。 在您的else 中,您使用两个for,每个\n。它应该如何在同一条线上?您如何修改它以使其正常工作? 我通过比较缩进的值并据此暗示 \n 来尝试它。然后曲线在某个点之后变得疯狂。我发布了这段代码作为最接近输出的示例,我应该在最后得到。 【参考方案1】:

你可以:创建一个空行

char line[] = "                          ";

在适当的地方设置字符

line[c_indent] = 'x';
line[s_indent] = '+';

然后输出这一行:

puts(line);

正弦和余弦在一个点上的情况留给你作为练习;)

【讨论】:

【参考方案2】:

在发布的代码中,每个符号在计算位置处打印在单独的行中,但您需要做的是确定符号的顺序并将两者打印在同一行中。

Consier 使用一个简单的函数,例如

void print_after_n_spaces(int n, const char* str)

    while (n-- > 0)
        putchar(' ');
    printf("%s", str);

另外,添加另一个分支并计算两个位置之间的差异

for(int x = -180; x <= 180; x += 15)

    double angle = x / 180.0 * M_PI;
    int s_pos = 10.5 + 10.0 * sin(angle);
    int c_pos = 10.5 + 10.0 * cos(angle);
    //          ^^^^ To "round" the values

    if (c_pos > s_pos)
    
        print_after_n_spaces(s_pos, "+");
        //                          ^^^                 Don't print the newline here
        print_after_n_spaces(c_pos - s_pos - 1, "x\n");
        //                   ^^^^^^^^^^^^^^^^^          Difference between the positions
    
    else if (c_pos < s_pos) 
    
        // Here prints first the "x" (the cosine), then the "+"
    
    else
    
        // Here prints only "*"
    

【讨论】:

【参考方案3】:else 语句中,检查s_indentc_indent 中哪个较大。 将这些变量复制到两个新变量largestsmallest。 使用 for 循环遍历 smallest 以打印空格,然后根据哪个最小打印 + 或 x。 然后从 smallest 迭代到 largest,打印空格,然后根据哪个最大打印 + 或 x。

另一种更优雅的解决方案是创建一个函数void printline (int n, char symbol),然后调用它两次。

【讨论】:

以上是关于同时绘制正弦和余弦曲线的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义View——实现水波纹效果类似剩余流量球

Python绘制正弦余弦函数用到哪些函数?

MATLAB入门笔记

Arduino STM32+OLED绘制正弦和余弦波形图形

傅里叶变换2

已知所有点,怎么用OpenCV写正弦的拟合曲线?