Paste Description for C++ - Umsetzung fr Linien und Kr
Umsetzung des bresenham'schen Linienalgorithmus und der Kreisvariante in C++
- C++ - Umsetzung fr Linien und Kr
- Thursday, August 28th, 2008 at 10:30:59am MDT
- #include <iostream>
- #ifndef _GLUT_
- #include <GL/glut.h>
- #define _GLUT_
- #endif
- #include "basic_algos.h"
- using namespace std;
- void basic_algos::drawPoint(int x, int y)
- {
- glVertex2i(x, y);
- }
- void basic_algos::drawLine(int x1, int y1, int x2, int y2)
- {
- // Schritt in x- und Y-Richtung positiv initialisieren
- int incX = 1;
- int incY = 1;
- // Delta von X und Y ausrechnen
- int dx = x2-x1;
- int dy = y2-y1;
- // Wenn die Linie in eine negative Richtung läuft, die Schrittvariablen negieren
- // und das Delta der jeweiligen Richtung negieren
- if(x1>x2)
- {
- incX = -1;
- dx *= -1;
- }
- if(y1>y2)
- {
- incY = -1;
- dy *= -1;
- }
- // Zähler für schnelle und langsame Richtung initialisieren
- int incFast = incX;
- int incSlow = incY;
- // Variablen für die aktuelle X- und Y-Position
- int currentX = x1;
- int currentY = y1;
- // Delta für schnelle Richtung und langsame Richtung initialisieren
- int dFast = dx;
- int dSlow = dy;
- // Zeiger auf aktuelle Position in schnelle und in langsame Richtung setzen
- int *currentFast = ¤tX;;
- int *currentSlow = ¤tY;
- // Wenn es sich um eine schnell steigende Linie handelt...
- if(dy > dx)
- {
- // ... dann Delta für schnelle Richtung auf den Wert von Delta-Y setzen und
- // Delta für langsame Richtung auf den Wert von Delta-X setzen...
- dFast = dy;
- dSlow = dx;
- // ... dann Zähler für schnelle Richtung auf den Zähler von Y-Richtung setzen und
- // Zähler für langsame Richtung auf den Zähler von X-Richtung setzen ...
- incFast = incY;
- incSlow = incX;
- // ... sowie Zeiger für schnelle Position auf Variable der Y-Position setzen und
- // Zeiger für langsame Position auf Variable der X-Position setzen.
- currentFast = ¤tY;
- currentSlow = ¤tX;
- }
- // Fehlervariable mit der hälfte des schnellen Deltas initialisieren (immer abgerundet)
- int error = (int)dFast / 2;
- drawPoint(currentX, currentY);
- // Solange die aktuelle X/Y-Position nicht mit den Koordinaten des Endpunktes übereinstimmt...
- while(currentX != x2 || currentY != y2)
- {
- // ... einen Schritt in die schnelle Position machen
- *currentFast += incFast;
- // ... Delta der langsamen Richtung von der Fehlervariable abziehen
- error -= dSlow;
- // Wenn der Fehlerwert unter 0 fällt ...
- if(error < 0)
- {
- // ... dann das Delta der schnellen Richtung aufaddieren ...
- error += dFast;
- // ... und einen Schritt in die langsame Richtung machen
- *currentSlow += incSlow;
- }
- drawPoint(currentX, currentY);
- }
- }
- void basic_algos::drawCircle(int x, int y, int r)
- {
- // Positionen an denen aktuell gezeichnet werden soll
- int currentX = r;
- int currentY = 0;
- // Fehlervariable
- int error = r;
- // Deltas (nicht wirklich aber zum Verständnis)
- int dx;
- int dy;
- // Zeichnen aller vier Startpunkte
- drawPoint(x+currentX, y+currentY);
- drawPoint(x-currentX, y+currentY);
- drawPoint(x+currentY, y+currentX);
- drawPoint(x+currentY, y-currentX);
- // Solange Pixel zeichnen, bis Oktand fertig berechnet wurde
- while(currentY < currentX)
- {
- // dy berechnen
- dy = currentY * 2 + 1;
- // Einen Schritt in Y-Richtung machen
- currentY += 1;
- // Fehlerwert verringern
- error -= dy;
- // Wenn der Fehler unter 0 sinkt
- if(error < 0)
- {
- // dx berechnen
- dx = 1 - currentX * 2;
- // einen Schritt in X-Richtung machen
- currentX -= 1;
- // Fehler wieder über 0 bringen
- error -= dx;
- }
- // berechneten Punkt in allen acht Oktanden zeichnen
- drawPoint(x+currentX, y+currentY);
- drawPoint(x-currentX, y+currentY);
- drawPoint(x-currentX, y-currentY);
- drawPoint(x+currentX, y-currentY);
- drawPoint(x+currentY, y+currentX);
- drawPoint(x-currentY, y+currentX);
- drawPoint(x-currentY, y-currentX);
- drawPoint(x+currentY, y-currentX);
- }
- }
Paste Details
Tags: bresenham linie kreis algorithmus glut
advertising
Update the Post
Either update this post and resubmit it with changes, or make a new post.
You may also comment on this post.
Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.