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

为何极大值点无法绘制?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:13:12