2017-11-21 19 views
0

floodfill 메서드를 사용하여 몇 가지 점으로 캔버스를 만들었습니다. 서클 만 채워야하고 외부는 아무것도 채워서는 안됩니다. 그래서 나는 캔버스에 이미 표시되어있는 모든 점을 저장 한 목록을 만들었습니다. 충전 방법에서 Flood Fill Java (캔버스에서 동그라미 채우기)

private LinkedList<Point> filledpoints = new LinkedList<Point>(); 

지금 시작점을 overgive 싶습니다, 그리고 여기에 점을 그릴 수 경우, 또는 다음 내가 확인 싶어요 이미 점이있을 경우.

// checking if a dot can be drawn: 
    if (!filledpoints.contains(new Point(startX, startY))) { 
     drawDot(g,startX,startY,Color.ORANGE); 
     filledpoints.add(new Point(startX,startY)); 
     floodfill(g, startX + 1, startY); 
     floodfill(g, startX, startY + 1); 
     floodfill(g, startX - 1, startY); 
     floodfill(g, startX, startY - 1); 
     floodfill(g, startX + 1, startY + 1); 
     floodfill(g, startX - 1, startY + 1); 
     floodfill(g, startX - 1, startY - 1); 
     floodfill(g, startX + 1, startY - 1); 
    } 

또는 네 개의 이웃과 : 또한

if (!filledpoints.contains(new Point(startX, startY))) { 
     drawDot(g,startX,startY,Color.ORANGE); 
     filledpoints.add(new Point(startX,startY)); 
     floodfill(g, startX + 1, startY); 
     floodfill(g, startX, startY + 1); 
     floodfill(g, startX - 1, startY); 
     floodfill(g, startX, startY - 1); 
    } 

I - 나는 물론 홍수 채우기 알고리즘을 봤, 그 같은 내놓았다 나도 8 개 이웃 알고리즘을 사용하려 목록에있는 점의 값을 배열에 저장하고 배열을 검사하는 등의 작업을 시도했지만 도움이되지 않았습니다. 그것은 항상 나에게 첫 번째 재귀 호출 라인이 오류 제공 : sun.java2d.SunGraphics2D.fillOval (알 수없는 소스)에서

예외 스레드에서 "AWT-EventQueue로는-0"java.lang.StackOverflowError의를

이 시점에서 내가 뭘 잘못하고 있니? 또는 다른 말로하면 : 맞나요? 전에이 오류가 발생하지 않았으며이 시점에서 혼란 스럽습니다. 그 일을하려고하는 것이 올바른 방법일까요? 어떤 힌트라도 도움이 될 것입니다. 코드 솔루션 일 필요조차 없습니다!

public void paint(Graphics g) { 
    // drawing the circle: 
    for (Circle c : circles) { 
    drawCircle(g, c.radius, c.centerX, c.centerY); 
    } 

    if (!startpoints.isEmpty()) { 
     for (Point p : startpoints) { 
      floodfill(g, p.x, p.y); 
     } 
    } 

}  

Startpoints

가 존재하는 경우 나 (원 내부의 첫 번째 포인트에 저장하는 배열이다 : 필요한 경우 (프로그램을 실행하기 위해 호출된다)/

내 도장 방법은 다음과 같다 이 일을 더 우아한 방법, 제발 친절하고 알려 주시기 바랍니다). 이 질문에 대한 내 코드와 관련된 다른 정보가 필요하면 알려주십시오. 필요한 경우 몇 초 만에 편집하겠습니다!

답변

3

가장자리를 확인하지 않습니다. filledpointsPoint(-1, 0)과 같은 지점을 포함합니다. 그렇다면 fillOval 그걸 그릴 수없고 예외를 throw합니다.

+0

좋습니다. 그러나 나는 그것을 어떻게 할 수 있습니까? for 루프 또는 이와 비슷한 것을 통해 이웃을 확인하고 있습니까? – Calimera

+0

if (! filledpoints.contains (point)) && valid (point, width, height)와 같은 if 문을 확장 할 수 있고 유효한 메소드에서 다음과 같이 할 수 있습니다 :'return point.x> = 0 && point.y> = 0 && point.x jbarat

+0

정말 고마워요! – Calimera