2017-09-08 1 views
1

다른 색상으로 캔버스에 점을 그리려고합니다. 기본적으로 파란색의 현재 점, 녹색 및 점의 현재 점보다 먼저 그려지는 점은 빨간색의 현재 점 다음에 그립니다. 코드 이해를 높이려면캔버스의 위치 ((x, y) 좌표)에 따라 다른 색상의 SWT 점을 그립니다.

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); 
    } 
} 

을 참조하십시오. 이것은 완벽하게 작동합니다. 하지만 Int 대신 Point를 사용하여 동일한 작업을 수행하고 논리가 올바르지 않게하려고합니다. 예 :

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); 
     }  
    } 
} 

도와주세요.

답변

0

나는 새로운 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); 
    } 
} 

효율적이고 논리적이지 않으므로 다른 미디어를 제안하십시오. 미리 감사드립니다.

0

귀하의 솔루션이 합리적인 것으로 생각되지만 목록 대신 세트를 사용하는 것이 좋습니다. 예를 들어, TreeSet 또는 HashSet은 목록 (O (n))을 반복하는 것보다 훨씬 빠른 (나무에 대해서는 O (log n)이고 해시 버킷에 대해서는 O (1)) 훨씬 더 빠른 대규모 항목의 기존 항목을 확인할 수 있습니다. - 선형 시간).

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

감사합니다. @BoffinbrainN, 나중에 사용해보고 u 리뷰를 제공 해드립니다. –

관련 문제