#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); }}