Bresenham die 2te
-
*g* lustig - hilft aber auch nicht gegen meine Doofheit... ich brauch mal wieder was von dem Zeug... wie heißt es... Autocogito
-
> auf diese weise verlagert man das problem Qausi auf den ersten quadranten, weil die Delta positiv sind.
Dieser Trick funktioniert beim Orginal Bresenham Algo nicht - für einen Plotter ist eine Strecke vom Punkt (0,0) zum Punkt (10,10) etwas anderes wie eine Strecke vom Punkt (10,10) zum Punkt (0,0).
-
Vertexwahn schrieb:
> auf diese weise verlagert man das problem Qausi auf den ersten quadranten, weil die Delta positiv sind.
Dieser Trick funktioniert beim Orginal Bresenham Algo nicht - für einen Plotter ist eine Strecke vom Punkt (0,0) zum Punkt (10,10) etwas anderes wie eine Strecke vom Punkt (10,10) zum Punkt (0,0).
das änderst du ja auch nicht. die zeichenrichtung bleibt gleich. das kann ich dir garantieren.
rapso->greets();
-
@Raspo
du hast recht die Zeichenrichtung bleibt die gleiche, aber bei einem Plotter wird einmal der Bewegungstyp M2 und einmal der Bewegungstyp M6 benötigt (siehe Bresenham). In der Computergrafik bietet es sich an hier vom Original Bresenham Algorithmus abzuweichen.
-
so hab ich jetzt eine sehr naive Bresnham Implementierung:
void Bresenham(int d1x, int d1y, int d2x, int d2y) { bool X, Y, Z; // zur Bestimmung der Bewegunsrichtung int da, db; // delta_a und delta_b int m1[2], m2[2]; // Bewegungsrichtung/Vektoren // delta a, delta b und Bewegungsrichtung bestimmen int dx = abs(d2x) - abs(d1x); int dy = abs(d2y) - abs(d1y); if(abs(dx)-abs(dy)>=0) { da = abs(dx); db = abs(dy); Z = true; } else { da = abs(dy); db = abs(dx); Z = false; } if(dx >= 0) X = true; else X = false; if(dy >= 0) Y = true; else Y = false; if(X == true && Y == true && Z == true) { // m1 = M1 // m2 = M2 m1[0] = 1; m1[1] = 0; m2[0] = 1; m2[1] = 1; } else { if(X == true && Y == true && Z == false) { // m1 = M3 // m2 = M2 m1[0] = 0; m1[1] = 1; m2[0] = 1; m2[1] = 1; } else { if(X == true && Y == false && Z == true) { // m1 = M1 // m2 = M8 m1[0] = 1; m1[1] = 0; m2[0] = 1; m2[1] = -1; } else { if(X == true && Y == false && Z == false) { // m1 = M7 // m2 = M8 m1[0] = 0; m1[1] = -1; m2[0] = 1; m2[1] = -1; } else { if(X == false && Y == true && Z == true) { // m1 = M5 // m2 = M4 m1[0] = -1; m1[1] = 0; m2[0] = -1; m2[1] = 1; } else { if(X == false && Y == true && Z == false) { // m1 = M3 // m2 = M4 m1[0] = 0; m1[1] = 1; m2[0] = -1; m2[1] = 1; } else { if(X == false && Y == false && Z == true) { // m1 = M5 // m2 = M6 m1[0] = -1; m1[1] = 0; m2[0] = -1; m2[1] = -1; } else { // m1 = M7 // m2 = M6 m1[0] = 0; m1[1] = -1; m2[0] = -1; m2[1] = -1; } } } } } } } int gradient = 2 * db - da; int x = d1x; int y = d1y; SetPixel(x, y, 0, 255, 0); for(int i = 0; i < da; i++) { if(gradient >= 0) { x = x + m2[0]; y = y + m2[1]; gradient = gradient + 2 * db - 2 * da; } else { x = x + m1[0]; y = y + m1[1]; gradient = gradient + 2 * db; } SetPixel(x, y, 0, 255, 0); } }
-
Die vielen verschachtelten ifs gefallen mir. Hat viel mehr Stil als nur so'n billiges Array...
Bye, TGGC (Ein Jahr Helden)
-
> Die vielen verschachtelten ifs gefallen mir. Hat viel mehr Stil als nur so'n billiges Array...
versteh ich nicht - kann kein C++
wie würde man das mit Arrays lösen?
ist es nicht viel schlimmer das ich mit zwei Multipliziere anstatt zu shiften?
ist es nicht viel schlimmer das ich haufenweiße Variablen in der Funktion 70 mal in der Sekunde auf den Stack haue und dann wieder runterwerfe?nö - jetzt im ernst - wie geht das mit Arrays?
ich wollte es erst mit switch lösen
-
array[8][4]={ { 0,1,0,1 }, ... m= array[X?1:0+Y?2:0+Z?4:0][n]
Indizes könnten auch vertauscht dein.
Bye, TGGC (Ein Jahr Helden)
-
naja ich hab es nicht umsonst "naive" Implementierung genannt
- ich könnte mir die hälfte der Fallunterscheidungen sparen wenn ich einfach den Endpunkt immer rechts vom Anfangspunkt setze ... ich will da jetzt gar nicht großartig zu optimieren anfangen, weil das eh keinen sinn hat, wenn man wie ich keine Ahnung von der Hardware hat (wie ich)
z. B. wäre es sicherlich sinnvoll einen inkrementier befehl zu benutzen - weil der schneller wie die Subtraktion ist (Intel hat doch da extra den Befehl inc) usw. aber da kenn ich mich zu wenig aus und außerdem hat mir nur das Dokument von Bresenham interessiert und nicht das ich wirklich mal ernsthaft eine line zeichnen kann - ich bin da ein knallharter Theoretiker
-
void Bresenham(int d1x, int d1y, int d2x, int d2y) { bool X, Y, Z; // zur Bestimmung der Bewegunsrichtung int da, db; // delta_a und delta_b int *m; // Bewegungsrichtung/Vektoren // delta a, delta b und Bewegungsrichtung bestimmen int dx = abs(d2x) - abs(d1x); int dy = abs(d2y) - abs(d1y); if(abs(dx)-abs(dy)>=0) { da = abs(dx); db = abs(dy); Z = true; } else { da = abs(dy); db = abs(dx); Z = false; } if(dx >= 0) X = true; else X = false; if(dy >= 0) Y = true; else Y = false; int array[8][4] = { { 0,-1,-1,-1 }, { 0,-1,1,-1 }, { 0,1,-1,1 }, { 0,1,1,1 }, { -1,0,-1,-1 }, { 1,0,1,-1 }, { -1,0,-1,1 }, { 1,0,1,1 }, }; m = array[(X?1:0) + (Y?2:0) + (Z?4:0)]; int gradient = (db<<1) - da; int x = d1x; int y = d1y; SetPixel(x, y); for(int i = 0; i < da; i++) { if(gradient >= 0) { x = x + m[2]; y = y + m[3]; gradient = gradient + (db<<1) - (da<<1); } else { x = x + m[0]; y = y + m[1]; gradient = gradient + (db<<1); } SetPixel(x, y); } }
ich hoffe der code ist bis auf die SetPixel Funktion Standardkonfrom