文本模式绘制函数坐标图:镜像显示及公式修改无显示问题求助
问题修复方案
问题根源
- 图像镜像:当前代码中
graphLine[9 - h] = '*'的索引计算导致y值与横向位置反向,y越大*越靠左,呈现镜像效果。 - 加负号后无图像:修改y的计算式后,
y+1的范围变为1~2,乘以10后h≥10,超出h < 10的判断条件,因此无法绘制*。
修复步骤
- 修正图像方向:将
PrintGraph方法中的索引计算从9 - h改为h,让y值越大(h越大),*越靠右,符合常规坐标逻辑。 - 处理边界值:通过归一化+范围限制,确保h始终落在0~9的有效索引区间,避免边界值无法绘制的问题。
- 优化通用性:引入
minY和maxY统一处理y值映射,适配不同函数的取值范围,提升代码复用性。
修改后的完整代码
using System; using System.Text; class Program { static void Main(string[] args) { double x, y; Console.WriteLine("| x | y |"); // 当前函数的y值范围是-1到0 double maxY = 0; double minY = -1; for (x = 0; x <= 4; x += 0.20) { if (x < 2) { y = Math.Sqrt(1 - Math.Pow(x - 1, 2)) - 1; } else { y = -0.5 * Math.Sqrt(1 - Math.Pow(x - 3, 2)); } Console.Write($"| {x,5:F2} | {y,5:F2} |"); PrintGraph(minY, maxY, y); Console.WriteLine(); } Console.ReadLine(); } static void PrintGraph(double minY, double maxY, double y) { StringBuilder graphLine = new StringBuilder(" "); // 归一化y值到0~9的索引范围 int h = (int)((y - minY) / (maxY - minY) * 9); // 强制限制h在有效索引区间内 h = Math.Clamp(h, 0, 9); graphLine[h] = '*'; Console.Write(graphLine); } }
代码说明
- 用
minY和maxY做归一化计算,替代原有的y+1,适配任意函数的y值范围,避免硬编码导致的适配问题。 Math.Clamp确保h不会超出0~9的有效索引区间,解决y取边界值时无法绘制*的问题。- 索引改为
h后,y值越大*越靠右,图像方向与预期完全一致。
内容的提问来源于stack exchange,提问作者Vivilonchello
相关产品推荐
相关产品推荐

