All pastes #1187520 Raw Edit

C++ - Umsetzung fr Linien und Kr

public cpp v1 · immutable
#1187520 ·published 2008-08-28 16:30 UTC
rendered paste body
#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 = &currentX;;	int *currentSlow = &currentY;	// 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 = &currentY;		currentSlow = &currentX;	}	// 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);	}}