同时绘制正弦和余弦曲线
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_indent
和c_indent
中哪个较大。
将这些变量复制到两个新变量largest
和smallest
。
使用 for 循环遍历 smallest
以打印空格,然后根据哪个最小打印 + 或 x。
然后从 smallest
迭代到 largest
,打印空格,然后根据哪个最大打印 + 或 x。
另一种更优雅的解决方案是创建一个函数void printline (int n, char symbol)
,然后调用它两次。
【讨论】:
以上是关于同时绘制正弦和余弦曲线的主要内容,如果未能解决你的问题,请参考以下文章