1 // Computergraphik I
2 // Prof. Dr. Juergen Doellner
3 // Sommersemester 2001
4 //
5 // Rahmenprogramm fuer Aufgabenzettel 3
6
7 // Stephan Brumme, 702544
8 // last changes: May 12, 2001
9
10 #include "cgraster.h"
11 #include <memory.h>
12 #include "gl/gl.h"
13
14
15 CGRaster::CGRaster(int width, int height) {
16 // speichern von width und height
17 // in Objektvariablen
18
19 // überprüfen, ob Ausmaße vernünftig sind
20 if (width <= 0 || width > MAXWIDTH)
21 width = MAXWIDTH;
22 if (height <= 0 || height > MAXHEIGHT)
23 height = MAXHEIGHT;
24
25 m_nWidth = width;
26 m_nHeight = height;
27
28 // anlegen des bool-Arrays
29 m_arBuffer = new bool[m_nWidth*m_nHeight];
30
31 // loeschen des Arrays
32 clear();
33 }
34
35
36 CGRaster::~CGRaster() {
37 // Rasterspeicher freigeben
38 delete [] m_arBuffer;
39 }
40
41
42 int CGRaster::width() const {
43 return m_nWidth;
44 }
45
46
47 int CGRaster::height() const {
48 return m_nHeight;
49 }
50
51
52 void CGRaster::clear() {
53 // setzten aller Werte des bool-Arrays auf false
54 memset(m_arBuffer, false, sizeof(bool)*m_nWidth*m_nHeight);
55 }
56
57
58 bool CGRaster::getPixel(int x, int y) const {
59 // liegen Koordinaten innerhalb des Rasters ?
60 if (x<0 || x>=m_nWidth ||
61 y<0 || y>=m_nHeight)
62 return false;
63
64 // Punkt zurückgeben
65 return m_arBuffer[x+y*m_nWidth];
66 }
67
68
69 void CGRaster::setPixel(int x, int y) {
70 // liegen Koordinaten innerhalb des Rasters ?
71 if (x<0 || x>=m_nWidth ||
72 y<0 || y>=m_nHeight)
73 return;
74
75 // Punkt setzen
76 m_arBuffer[x+y*m_nWidth] = true;
77 }
78
79
80 void CGRaster::draw() const {
81 // zeichnen aller Pixel, die gesetzt sind
82
83 // Umgebung sichern
84 glPushAttrib(GL_CURRENT_BIT);
85
86 // schwarz
87 glColor3f(0.0, 0.0, 0.0);
88
89 // alle Punkte des Rasters durchlaufen
90 int x,y;
91 for (x=0; x<m_nWidth; x++)
92 for (y=0; y<m_nHeight; y++)
93 // ggf. Rechteck mit Seitenlänge 1 zeichnen, im Zentrum liegt (x,y)
94 if (getPixel(x,y))
95 glRectf(x-0.5, y-0.5, x+0.5, y+0.5);
96
97
98 // zeichnen der Raster-Linien
99 glColor3f(0.7, 0.7, 0.7);
100 glBegin(GL_LINES);
101 // vertikal
102 for (x=0; x<m_nWidth; x++)
103 {
104 glVertex2f(x+0.5, 0);
105 glVertex2f(x+0.5, m_nWidth);
106 }
107
108 // horizontal
109 for (y=0; y<m_nHeight; y++)
110 {
111 glVertex2f(0, y+0.5);
112 glVertex2f(m_nHeight, y+0.5);
113 }
114 glEnd();
115
116 glPopMatrix();
117 }
118