You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何填补余弦曲线文本绘图中输入值大于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:05:30