Teksturowanie trójkąta - StackOverflowException

0

Zadanie które realizuje polega na na łożeniutekstury z jednego trójkąta na drugi trójkąt.
zadanie to realizuje przy pomocy dwóch obiektów Bitmap.
Jednym z nich wykorzystuję do zaznaczenia trójkąta wraz z teksturą a druga do utworzenia trójkąta na którego będę nakładał teksturę z pierwszego.

Całość zadania opieram o współrzędne barycentryczne.

Problem pojawia się gdy trójkąt do teksturowania jest duży, wtedy aplikacja zwraca mi wyjątek
An unhandled exception of type 'System.StackOverflowException' occurred in System.Drawing.dll

Myślę, że jest to związane z wywołaniami rekurencyjnymi ale nie za bardzo mam pomysł w jaki sposób mogę to obejść?

0

Nie używać rekurencji.

1

@somekind - W wersji x64 jest już tail-call optimization więc można by przerobić rekurencję na ogonową. Ale w C# TCO to optymalizacja raczej niż sposób na projektowania algorytmów (bo nie ma jej w standardzie) więc to raczej zły pomysł.

@Autor - Jeśli chcesz zostawić kod jak jest - zmień rozmiar stosu: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/22/increasing-the-size-of-your-stack-net-memory-management-part-3.aspx

Albo po prostu zmień kod z rekurencyjnego na iteracyjny...

PS. jeszcze jedno - ciekawą musisz mieć tą rekurencję jeśli wyczerpuje stos.
Zakładając że masz funkcję f która rekurencyjnie wywołuje 2 razy sama siebie i przyjmuje 2 parametry typu int - żeby wyczerpał Ci się stos musiałbyś zagnieździć ją ponad 125000 razy. Tylko że przy takim zagnieżdżeniu łączna ilość wywołań funkcji wyniosłaby 21 + 22 + 23 + 24 + ... + 2124999 + 2125000. Żeby dać Ci wyobrażenie tej liczby, to samo 2 ^ 125000 wynosi http://pastebin.com/CeAb8Eea
Jesteś pewien że musisz tyle razy wywołać tą funkcję (hint: nie.)?

Poszukaj w tym programie nieskończonej rekurencji, to pewnie ona wykańcza stos.

0

MSM:
Skąd ci taki wynik wyszedł? Wystarczy 125000 wywołań normalnej rekurencyjnej funkcji, aby zapchać stos.

public class Main {

    int sum(int from, int to) {
        return from > to ? 0 : from + sum(from + 1, to);
    }

    void run() {
        System.out.println(sum(1, 234567));
    }

    public static void main(String[] args) {
        new Main().run();
    }
}

SOE od razu :]

Inna sprawa to to, że HotSpot nie robi TCO (przynajmniej domyślnie).

0

MSM ma rację. Sprawdź czy nie wywołuje Ci się rekurencja w nieskończoność - ja widziałem ten wyjątek właśnie w takich sytuacjach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1