Baum (in der Art eines binären Baums) darstellen

Naja, sind evtl schneller (wobeis darauf wohl nich ankommen wird) ... aber wozu gibts die Funktionen denn, wenn man sie eh nicht benutz ? ;)
 
moin


Meinst echt das die schneller sind?!
Kann ich mir nicht vorstellen.

Aber darauf kommt es wirklich nicht an.
Und benutzen tu ich sie, wenn es nötig ist...


mfg
umbrasaxum
 
umbrasaxum hat gesagt.:
moin


Es geht!
Ich bin nach ein paar Versuchen drauf gekommen, dann hab ich gesehen das du oben schon die Lösung des Problems beschrieben hattest hab es nur leider erst übersehen.
Naja es funktioniert super!

Funktion:
Code:
void zeichnen(HDC hDC, int x, int y, int richtung, float weite, float div)
{
	int i=0;

	if(weite > 0.5)
	switch(richtung)
	{
	case 1:
		for(i=0; i < weite; i++)
			SetPixel(hDC, x, y-i, RGB(0,0,0));
		zeichnen(hDC, x, y-i, 3, weite/div, div);
		zeichnen(hDC, x, y-i, 4, weite/div, div);
		break;
	case 2:
		for(i=0; i < weite; i++)
			SetPixel(hDC, x, y+i, RGB(0,0,0));
		zeichnen(hDC, x, y+i, 3, weite/div, div);
		zeichnen(hDC, x, y+i, 4, weite/div, div);
		break;
	case 3:
		for(i=0; i < weite; i++)
			SetPixel(hDC, x-i, y, RGB(0,0,0));
		zeichnen(hDC, x-i, y, 1, weite/div, div);
		zeichnen(hDC, x-i, y, 2, weite/div, div);
		break;
	case 4:
		for(i=0; i < weite; i++)
			SetPixel(hDC, x+i, y, RGB(0,0,0));
		zeichnen(hDC, x+i, y, 1, weite/div, div);
		zeichnen(hDC, x+i, y, 2, weite/div, div);
		break;
	}
}

Aufruf:
Code:
case WM_PAINT:
	{
		HDC hDC;
		PAINTSTRUCT ps;
		hDC = BeginPaint(hWnd, &ps);
		{
			zeichnen(hDC, 400, 500, 1, 200, 1.35);
		}
		EndPaint(hWnd, &ps);
		ReleaseDC(hWnd, hDC);
			
		return 0;
	}

Man sollte mit dem Parameter div gut aufpassen hab ich gemerkt, da der Computer ganz schnell sehr viel zu tun hat!
Bei weite = 200 und div = 1.35 werden 2097151 Linien gezeichnet....unten das Beispiel wie es dann aussieht ;)


mfg
umbrasaxum


Wenn du jetzt noch einen Parameter mit in die Funktion aufnimmst der die Tiefe bestimmt und diese dann als Abbruchkriterium anstatt der Länge als Abbruchkriterium verwendest solltest du auch die Schritte quantitisieren
können.

Code:
void zeichneBaum(direction degrees, double length, int depth)
  if(depth > 0){
  ...
   switch(degrees){
                        case 0GRAD:
                                //zeichne den Strich in der angegebenen Länge im 0 grad Winkel<-- Pseudocode
                                zeichneBaum(90GRAD, length / 2, depth - 1);
                                zeichneBaum(270GRAD, length / 2, depth - 1);
                                break;
   ...
}

Aufruf dann z.B.:

Code:
zeihneBaum(180GRAD, 300, 4); //bis zu 4 Teilbaeume zeichnen

Gruß

RedWing
 
Zurück