在 canvas 上根据位置((x,y)坐标)用不同颜色绘制 SWT 点

Drawing SWT Point with different colors according to their positions ((x,y) coordinates) on canvas

我正在尝试用不同的颜色在 canvas 上画点。基本上,蓝色当前点,绿色当前点之前绘制的点和红色当前点之后绘制的点。请看代码

private void setElemColor(GC g, int pos) {
    int currentPoint = messtisch.getPointPos(); //current point, number
    if (pos > currentPoint) {
        g.setForeground(cRed);
    } else if (pos == currentPoint) {
        g.setForeground(cBlue);
    } else if (pos < currentPoint) {
        g.setForeground(cGreen);
    }
} 

增加理解力。这很完美。但是我正在尝试使用 Point 代替 Int 来做同样的事情并且没有得到正确的逻辑。如

private void setPointColor(GC g, Point cpoint) {
    if (cpoint.equals(currentPoint)) { // the current point itself
        g.setForeground(cBlue);
    } else if (!cpoint.equals(currentPoint)) {
        if (cpoint.x > currentPoint.x || cpoint.y > currentPoint.y) {
            g.setForeground(cRed);
        } else {
            g.setForeground(cGreen);
        }      
    }
}

请帮我看看。

我是通过使用新的 ArrayList 并将点保存到已经是 currentPoint 来完成的。然后用绿色绘制它们作为旧点。这是我的代码示例。

private ArrayList<Point> oldpoints = new ArrayList<Point>();  

private void setPointColor(GC g, Point cpoint) {
    if (oldpoints.contains(cpoint)) {
        g.setForeground(cGreen);
    } else if (!oldpoints.contains(cpoint)) {
        g.setForeground(cRed);
    }

    if (cpoint.equals(currentPoint)) {
         g.setForeground(cBlue);
         oldpoints.add(cpoint);
    } 
}

请建议其他方法,因为这个方法效率低且不合逻辑。提前致谢。

我认为您的解决方案是合理的,但请考虑使用集合而不是列表。例如,TreeSetHashSet 将能够比迭代更快地检查大型集合中的现有条目(树的 O(log n) 和哈希桶的 O(1))在列表上(O(n) - 线性时间)。

private Set<Point> oldpoints = new HashSet<Point>();