多项式绘图工具Y值翻转偏移问题技术求助
问题分析与修复方案
核心问题1:多项式求值逻辑错误
你的sub方法计算多项式的方式完全错误,当前代码把系数与x的乘积作为底数取幂,正确的多项式计算应该是系数乘以x的对应次幂。比如输入系数列表[1.0, 0.0],正确的多项式是1.0*x^1 + 0.0,但你的代码计算逻辑会导致高阶项或非1系数的场景出现严重偏差,这是逻辑上的根本错误。
核心问题2:坐标映射逻辑错误
- 网格的行索引和数学Y轴方向相反:数学中Y值越大越靠上,但你的网格里
r=0是顶部、r=10是底部,所以需要用5 - yVal将数学Y值转换为网格行索引(r=5对应Y=0)。 - 原代码中处理负Y值的逻辑完全错误,直接加5会导致偏移,应该统一使用转换公式后再判断是否在网格范围内。
- 原代码错误地将
grid[i][yVal]设为*,这里的i是X对应的列索引,正确的赋值应该是grid[转换后的行索引][i]。
修正后的代码
1. 修复sub方法
public static double sub(ArrayList<Double> currentCoefList, double val) { double subbed = 0.0; int degree = currentCoefList.size() - 1; // 多项式最高次数 for (int i = 0; i < currentCoefList.size(); i++) { // 正确计算:系数 × x的(最高次 - i)次方 subbed += currentCoefList.get(i) * Math.pow(val, degree - i); } return subbed; }
2. 修复makesGraph方法的坐标映射逻辑
public static char[][] makesGraph(ArrayList<Double> currentArrayList) { int row = 11; int col = 11; int xVal = -5; int[] ysVal = new int[11]; char[][] grid = new char[row][col]; // 初始化网格坐标轴 for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[0].length; c++) { if (r == 5 && c == 5) { grid[r][c] = '+'; } else if (c == 5) { grid[r][c] = '|'; } else if (r == 5) { grid[r][c] = '-'; } else { grid[r][c] = ' '; } } } // 计算每个X对应的Y值(直接在这里做四舍五入) for (int i = 0; i < grid[0].length; i++){ ysVal[i] = (int) Math.round(sub(currentArrayList, xVal)); xVal++; } // 将Y值映射到网格并标记 for (int i = 0; i < grid[0].length; i++) { int yVal = ysVal[i]; // 转换数学Y值为网格行索引:r=5对应Y=0,Y增大则行索引减小 int gridRow = 5 - yVal; // 确保行索引在网格范围内 if (gridRow >= 0 && gridRow < row) { grid[gridRow][i] = '*'; } } // 打印网格 for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[0].length; c++) { System.out.print(grid[r][c]); } System.out.println(); } return grid; }
测试验证
- 输入
[1.0, 0.0](对应y=x):X从-5到5时,Y值从-5到5,转换后网格中会形成一条从左下到右上的斜线,无偏移无翻转。 - 输入
[1.0, 2.0](对应y=x+2):Y值比y=x整体高2,转换后斜线整体上移,符合预期。
内容的提问来源于stack exchange,提问作者Mikey
相关产品推荐
相关产品推荐

