Pomocy!! Musze napisac metode rekurencyjna ktora bedzie mi znajdowala krawedz interesujacego mnie obiektu graficznego. Moj program dziala w ten sposob ze laduje rysunek testowy ktory sklada sie z 0 i 1 akurat tak jakos glupio sie zlozylo ze 0 oznacza piksel czarny a 1 piksel bialy. W kazdym razie stosujac klase WritableRaster przepisuje caly obrazek *.jpg do dwuwymiarowej tablicy bo na takiej latwiej mi operowac. Algorytm wykrywania krawedzi jest taki.
-
Znajdz pierwszy czarny punkt (to mam zrobione metoda znajdzPierwszyCzarnyPunkt(int[][] obrazek))
2.Wez pierwszy czarny punkt i sprawdzaj jego piksele "sasiadow" wokol niego zgodnie z ruchem wskazowek zegara rozpoczynajac od prawego sasiada ma to wygladac mniej wiecej tak678 5x1 432
gdy np 1 bedzie czarnym pikselem czyli w tablicy bedzie miec wartosc 0 to zapisz ten punkt do ArrayList o nazwie krawedz i wywolaj rekurencyjnie metode z tym obiektem.
No i to sie ma tak krecic. Wiadomo musi byc jakis warunek stopu. Pomyslalem ze moglby nim byc sytuacja w ktorej pierwszy punkt sie powtarza.
Metoda ktora ma to realizowac jest w jakims tam stopniu napisana, ale dziala zle poniewaz oscyluje ciagle miedzy tymi samymymi punktami az wkoncu wywala blad. Wiem gdzie jest blad, ale cienias jeszcze ze mnie a nie programista no i nie wiem jak sobie z tym poradzic. Z gory dzieki!!! Ponizej zamieszczam kod tej pokreconej metody.
public void wykryjKrawedz(Punkt punkt)
{
poprzedni = (Punkt)krawedz.get(licznik-1);
Punkt operacyjny = new Punkt();
int y = punkt.y;
int x = punkt.x;
int warunek = 0;
if (punkt.equals(poczatek)) {
warunek++;
System.out.println("dodalem");
}
if (obrazekTab[x + 1][y - 1] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x + 1;
operacyjny.y = y - 1;
System.out.println("Warunek 1");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x + 1][y] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x - 1;
operacyjny.y = y;
System.out.println("Warunek 2");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x + 1][y + 1] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x + 1;
operacyjny.y = y + 1;
System.out.println("Warunek 3");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x][y + 1] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x;
operacyjny.y = y + 1;
System.out.println("Warunek 4");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x - 1][y + 1] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x - 1;
operacyjny.y = y + 1;
System.out.println("Warunek 5");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x - 1][y] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x - 1;
operacyjny.y = y;
System.out.println("Warunek 6");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x - 1][y - 1] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x - 1;
operacyjny.y = y - 1;
System.out.println("Warunek 7");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
if (obrazekTab[x][y - 1] == 0 && !poprzedni.isChecked()) {
operacyjny.x = x - 1;
operacyjny.y = y;
System.out.println("Warunek 8");
krawedz.add(operacyjny);
poprzedni.setSprawdzony(true);
licznik++;
wykryjKrawedz(operacyjny);
}
}
i jeszcze klasa Punkt choc ona nie rozni sie zbyt wiele od swego pierwowzoru
public class Punkt extends Point {
boolean sprawdzany = false;
public Punkt() {
}
public void setSprawdzony(boolean war)
{
sprawdzany = war;
}
public boolean isChecked()
{return sprawdzany;}
}
P.S. jezeli bedziecie potrzebowali wiecej kodu to napiszcie ale reszta jest ok na 100%
// powiększanie czcionki nie prowadzi do zwiększenia szansy na odpowiedź, za to wybitnie zwiększa szansę na wylądowanie posta w koszu - Q