2017-11-21 9 views
0

floodfillメソッドを使用して、キャンバス内にいくつかのドットを付けて円を描こうとしています。サークルだけが埋め尽くされ、外側は何も埋められません。だから私はすでにキャンバスにマークされているすべてのポイントを保存したリストを作った。私は今の出発点をovergiveしたいのですが、その後、私はここにドットを描画することが可能であるかどうかを確認してみたい、またはそこにドットがすでに存在する場合充填方法でフラッドフィルJava(キャンバスに円を塗りつぶす)

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

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

またはわずか4隣人と::また

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

私は - 私はもちろんの洪水塗りつぶしアルゴリズムをGoogleで検索し、そのようなことを思い付いた私は、どちらかの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

エッジをチェックしません。 filledpointsは、Point(-1, 0)のようなポイントを含みます。その後、fillOvalはそれを描くことはできず、例外がスローされます。

+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

関連する問題