为何极大值点无法绘制?JavaFX绘图问题排查
问题排查与解决方案
核心原因:极大值点判断逻辑错误
你的代码中对「极大值点」的判断逻辑完全搞反了:
- 你当前的逻辑是:如果当前点在某个其他点的下方(y更小)或同y左方(x更小),则该点不是极大值点。
- 但正确的极大值点定义是:不存在任何其他点在当前点的右上方(即
other.x ≥ 当前x且other.y ≥ 当前y,且至少有一个维度严格大于)。
以你提供的点集为例,(397, 379)本应是极大值点(没有点在它的右上方),但你的代码会因为它在(334, 441)的下方(y更小),错误地将它排除出极大值集合,最终导致maximalSet中只有(334, 441)一个点,无法进入size>=2的分支。
修复方案
方案1:直接修正判断逻辑
修改findAndDrawMaximalSet方法中的内层循环判断条件,替换为正确的极大值判断逻辑:
private void findAndDrawMaximalSet() { ArrayList<Point> maximalSet = new ArrayList<>(); for (Point point : points) { boolean isMaximal = true; for (Point other : points) { // 正确条件:存在其他点在当前点的右上方,则当前点不是极大值 if (point != other && other.getX() >= point.getX() && other.getY() >= point.getY()) { isMaximal = false; break; } } if (isMaximal) { maximalSet.add(point); } } if (maximalSet.size() >= 2) { Collections.sort(maximalSet); drawLines(maximalSet); } }
方案2:新增语义化方法(更易读)
在Point类中新增一个判断「是否在当前点右上方」的方法:
public class Point implements Comparable<Point> { // 原有代码不变... // 新增方法:判断当前点是否在other点的右上方 public boolean isAboveAndToRightOf(Point other) { return this.y >= other.getY() && this.x >= other.getX(); } }
然后在findAndDrawMaximalSet中使用该方法:
if (point != other && other.isAboveAndToRightOf(point)) { isMaximal = false; break; }
修复后效果
修正后,你的点集中会正确识别出两个极大值点:(334, 441)和(397, 379),maximalSet.size()等于2,会进入连线绘制分支,按x排序后两点会被正确连接。
内容的提问来源于stack exchange,提问作者JimArkadian
相关产品推荐
相关产品推荐

