Rysowanie drzewa obiektów

0

Witam,

Jestem początkującym programistą więc proszę o wyrozumiałość.
Próbuję napisać rekurencję rysującą obiekty Element.
Każdy element może mieć dziecko (lecz nie musi) i posiadając dziecko jest parentem.
Każde dziecko może mieć swoje dzieci i być parentem itd...
Element reprezentowany jest przez kwadrat. Rodzeństwo jest wyświetlane obok siebie z przesunięciem względem swojej pozycji XY.

Na chwile obecną chyba przepełniam pamięć :/

KOD:

//BASE_BAR_SIZE = 100;
//Brush deviceBrush = new SolidBrush(Color.Blue);

private void DrawElements(int child,PaintEventArgs e)
        {

            Element oNode = new Element(0, 0, child);

            for (int i = 1; i <= oNode.cChildren;)  //Draws this node children
            {
                e.Graphics.FillRectangle(deviceBrush,(BASE_BAR_SIZE * oNode.positionX)+20,(BASE_BAR_SIZE * oNode.positionY)+20, 60, 60);
                oNode.positionX += 1;
                i++;
            }

            DrawElements(oNode.cChildren--,e);
        }        

KLASA ELEMENT:

class Element 
        {
        public int positionX;
        public int positionY;
        public int cChildren;

        public Element()
        {
        }

        public Element(int x,int y,int child)
        {
            this.positionX = x;
            this.positionY = y;
            this.cChildren = child;
        }

        private bool isParent()
        {
            if (this.cChildren > 0)
                return true;
            else return false;
        }

    }

Poproszę o sugestie i krytykę.

0

powinno to wyglądać mniej więcej tak:
klasa wierzchołek (Node/Element) powinna zawierać:

  • wszystkie dane które pozwolą Ci go narysować,
  • listę dzieci
    nie koniecznie musi zawierać rodzica.

To co napisałeś na oko wygląda jak coś co miałoby być listą dwukierunkową, a napisane jest tak jakby miałaby być drzewem

0

Podejżewałem, że nie ma to większego sensu :/

Powinienem najpierw stworzyć dwuwymiarową tablicę obiektów Elements, a potem je dopiero wyświetlać?
Chodzi o to by wyświetlać je w postaci drzewa tzn.

Root/
Child/ Child/
Child/Child/Child Child/Child

Cos w ten deseń...

0

Taka tablica jest zbędna, aczkolwiek jeśli nie umiesz inaczej, a obiektów nie ma za dużo to możesz tak zrobić. Nie specjalnie chce mi się napisać Tobie jak to powinno być zrobione, zwłaszcza że nie używam C# na codzień i musiałbym się go praktycznie uczyć.

0

Kod:


int nodeCount = 0;

        private void DrawRootElements(PaintEventArgs e)
        {

            Element oRoot = new Element(0,nodeCount++);
            e.Graphics.FillRectangle(rootBrush, (BASE_BAR_SIZE * oRoot.positionX) + 20, (BASE_BAR_SIZE * oRoot.positionY) + 20, 60, 60);
            nodeCount++;

            if (oRoot.cChildren > 0)
            {
                Element oNode = new Element();
                oNode = oRoot;
                oNode.positionY++;
                for (int i = 1; i <= oNode.cChildren; i++)
                {
                    e.Graphics.FillRectangle(deviceBrush, (BASE_BAR_SIZE * oNode.positionX) + 20, (BASE_BAR_SIZE * oNode.positionY) + 20, 60, 60);
                    oNode.positionX++;
                }

                DrawRootElements(e);
            }

        }

Klasa Element:

class Element
    {
        public int positionX;
        public int positionY;
        public int cChildren;
        static Random rand = new Random();

        public Element()
        {
            this.cChildren = rand.Next(3);
        }

        public Element(int x,int y)
        {
            this.positionX = x;
            this.positionY = y;
            //this.cChildren = child;
            this.cChildren = rand.Next(3);
        }

Coś jest już widoczne, ale to jeszcze nie to o co mi chodzi.
Teraz sprawdza rekurencyjnie elementy, ktorym losowo dodawane sa dzieci oraz rysuje je.
Ale sprawdza tylko pierwsze dziecko drzewa.

0

public int cChildren; to powinno mieć typ List<element>, a nie int

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