如何填补余弦曲线文本绘图中输入值大于4时的星号间隙?
问题描述
以下是绘制余弦曲线的C++代码:
#include <math.h> #include <iostream> using namespace std; void graph(){ int x=140; int y=20; double convert = 3.141592/180; cout<<"amplitude, frequency\n"; double amp,freq; cin>>amp>>freq; for(int i=0; i<y; i++){ for(int j=0; j<x; j++){ if(i==nearbyint(3*amp*cos(5*freq*j*convert))+10){ cout<<"*"; } else if(i==y/2){ cout<<"-"; } else if(j==x/2){ cout<<"|"; } else{ cout<<" "; } } cout<<endl; } } int main(){ graph(); return 0; }
运行上述代码时,输入振幅或频率不超过4时绘图正常,但输入值大于4时,y轴方向的*之间会出现较大间隙。公式中的3和5用于格式化调整,请问填补这些间隙的最简方法是什么?
解决方案
问题原因
当前代码仅在i恰好等于余弦函数计算出的整数位置时才打印*。当振幅或频率增大,余弦函数的y值变化幅度会超过1,相邻x对应的y值会跳过多个整数行,导致这些被跳过的行没有*,从而出现间隙。
最简修改方法
把原来的“等于”判断改成区间覆盖判断:计算出当前x对应的理论y值,只要当前行i落在该y值的整数覆盖范围内,就打印*。
修改核心判断代码:
// 替换原来的if判断 double y_val = 3*amp*cos(5*freq*j*convert) + 10; if(i >= floor(y_val) && i <= ceil(y_val)){ cout<<"*"; }
原理说明
floor(y_val)会取y值的最小整数边界,ceil(y_val)取最大整数边界,判断i是否在这个区间内,就能覆盖所有被余弦曲线“穿过”的行。不管y值变化幅度多大,所有被曲线覆盖的行都会打印*,自然填补了间隙。
内容的提问来源于stack exchange,提问作者tyler90
相关产品推荐
相关产品推荐

