Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define GLEW_STATIC
- #include <stdlib.h>
- #include <glut.h>
- #include <cmath>
- #include <ctime>
- #include <windows.h>
- struct COOORD
- {
- double x;
- double y;
- double z;
- };
- struct CORD
- {
- double X;
- double Y;
- double Z;
- };
- struct RGB
- {
- GLfloat r;
- GLfloat g;
- GLfloat b;
- };
- struct triangle
- {
- COOORD a;
- COOORD b;
- COOORD c;
- };
- //int x, y;
- double Pi = 3.1415926535897932384626433832795;
- double RAD = 0.01745329251994329576923690768489;
- int m = 5;//медианы
- int n = 3;//паралели
- int h= 20;//высота
- int r = 200;//радиус
- COOORD E = { 50, 40, 10 };//точка камеры
- int d = 300;//resolution
- int cm = 100;//расстояние к экрану
- int rx = atan(E.x / E.y)* 180.0 / Pi;
- int ry = atan(E.z / E.y)* 180.0 / Pi;
- int rz = atan(E.x / E.z)* 180.0 / Pi;
- CORD tmp;
- CORD tmp2;
- COOORD buf;
- COOORD buf2;
- float angle = 1.0;// угол поворота камеры
- float lx = 0.0f, lz = -1.0f;// XZ позиция камеры
- float x = r*1.0f, z = r*1.0f;
- float deltaAngle = 0.0f;
- float deltaMove = 0;
- int xOrigin = -1;
- bool first = true;
- RGB colorbase[100];
- double depth_buffer[601][601];
- RGB color_buffer[601][601];
- void setPixel(CORD a,RGB collor)
- {
- if (depth_buffer[(int)a.Y + d ][(int)a.X + d] > (int)a.Z)
- {
- depth_buffer[(int)a.Y + d ][(int)a.X + d ] = a.Z;
- color_buffer[(int)a.Y + d ][(int)a.X + d ].r = collor.r;
- color_buffer[(int)a.Y + d ][(int)a.X + d ].g = collor.g;
- color_buffer[(int)a.Y + d ][(int)a.X + d ].b = collor.b;
- }
- }
- void nsetPixel(CORD a, RGB collor)
- {
- glPointSize(1);
- glBegin(GL_POINTS);
- {
- glColor3f(1,0, 0);
- glVertex3i(a.X, a.Y, a.Z);
- }
- glEnd();
- }
- char sort(COOORD a, COOORD b, COOORD c)
- {
- int dx, dy , dz;
- if ((a.x > b.x&&b.x > c.x)||(c.x>b.x&&b.x>a.x))
- dx = abs(a.x - c.x);
- else
- {
- if ((a.x > c.x&&c.x > b.x)||(b.x>c.x&&c.x>a.x))
- dx = abs(a.x - b.x);
- else
- {
- if ((c.x>a.x &&a.x>b.x) || (b.x>a.x&&a.x>c.x))
- dx = abs(c.x - b.x);
- else
- {
- if (a.x == b.x || b.x == c.x)
- dx = abs(a.x - c.x);
- else
- {
- if (a.x == c.x || b.x == c.x)
- dx = abs(a.x - b.x);
- }
- }
- }
- }
- if ((a.y > b.y&&b.y > c.y) || (c.y>b.y&&b.y>a.y))
- dy = abs(a.y - c.y);
- else
- {
- if ((a.y > c.y&&c.y > b.y) || (b.y>c.y&&c.y>a.y))
- dy = abs(a.y - b.y);
- else
- {
- if ((c.y>a.y &&a.y>b.y) || (b.y>a.y&&a.y>c.y))
- dy = abs(c.y - b.y);
- else
- {
- if (a.y == b.y || b.y == c.y)
- dy = abs(a.y - c.y);
- else
- {
- if (a.y == c.y || b.y == c.y)
- dy = abs(a.y - b.y);
- }
- }
- }
- }
- if ((a.z > b.z&&b.z> c.z) || (c.z>b.z&&b.z>a.z))
- dz = abs(a.z - c.z);
- else
- {
- if ((a.z > c.z&&c.z > b.z) || (b.z>c.z&&c.z>a.z))
- dz = abs(a.z - b.z);
- else
- {
- if ((c.z>a.z &&a.z>b.z) || (b.z>a.z&&a.z>c.z))
- dz = abs(c.z - b.z);
- else
- {
- if (a.z == b.z || b.z == c.z)
- dz = abs(a.z - c.z);
- else
- {
- if (a.z == c.z || b.z == c.z)
- dz = abs(a.z - b.z);
- }
- }
- }
- }
- if (dx > dy&&dx > dz)
- return 'x';
- if (dy >= dx&&dy > dz)
- return 'y';
- if (dz > dy&&dz > dx)
- return 'z';
- return'0';
- }
- void Brezenhem(CORD BGN, CORD END, RGB color, int e)
- {
- glBegin(GL_LINES);
- glColor3f(color.r, color.g, color.b);
- glVertex3f(BGN.X, BGN.Y, BGN.Z);
- glVertex3f(END.X, END.Y, END.Z);
- glEnd();
- }
- void Brezenhem(CORD BGN, CORD END, RGB color)
- {
- double t, d = 0;
- int j, k;
- int start, finish, v;
- if (BGN.Y == END.Y)
- {
- if (abs(END.X - BGN.X) >= abs(END.Z - BGN.Z))
- {
- double dz = END.Z - BGN.Z;
- double dx = END.X - BGN.X;
- t = dz / dx;
- if (BGN.X < END.X)
- {
- start = BGN.X;
- finish = END.X;
- v = BGN.Z;
- }
- else
- {
- start = END.X;
- finish = BGN.X;
- v = END.Z;
- }
- for (j = start; j != finish; j++)
- {
- tmp.X=j;
- tmp.Y=BGN.Y;
- tmp.Z=v;
- setPixel(tmp, color);
- d += t;
- if (d > 0.5)
- {
- v++;
- d--;
- }
- if (d < -0.5)
- {
- v--;
- d++;
- }
- }
- tmp.X=j;
- tmp.Y=BGN.Y;
- tmp.Z=v;
- setPixel(tmp, color);
- }
- else
- {
- double dz = END.Z - BGN.Z;
- double dx = END.X - BGN.X;
- t = dx / dz;
- if (BGN.Z < END.Z)
- {
- start = BGN.Z;
- finish = END.Z;
- v = BGN.X;
- }
- else
- {
- start = END.Z;
- finish = BGN.Z;
- v = END.X;
- }
- for ( j = start; j != finish; j++)
- {
- tmp.X=v;
- tmp.Y=BGN.Y;
- tmp.Z=j;
- setPixel( tmp, color);
- d += t;
- if (d > 0.5)
- {
- v++;
- d--;
- }
- if (d < -0.5)
- {
- v--;
- d++;
- }
- }
- tmp.X=v;
- tmp.Y=BGN.Y;
- tmp.Z=j;
- setPixel(tmp, color);
- }
- }
- if (BGN.X == END.X)
- {
- if (abs(END.Y - BGN.Y) >= abs(END.Z - BGN.Z))
- {
- double dz = END.Z - BGN.Z;
- double dy = END.Y - BGN.Y;
- t = dz / dy;
- if (BGN.Y < END.Y)
- {
- start = BGN.Y;
- finish = END.Y;
- v = BGN.Z;
- }
- else
- {
- start = END.Y;
- finish = BGN.Y;
- v = END.Z;
- }
- for (j = start; j != finish; j ++)
- {tmp.X=BGN.X;
- tmp.Y=j;
- tmp.Z=v;
- setPixel(tmp, color);
- d += t;
- if (d > 0.5)
- {
- v++;
- d--;
- }
- if (d < -0.5)
- {
- v--;
- d++;
- }
- }
- tmp.X=BGN.X;
- tmp.Y=j;
- tmp.Z=v;
- setPixel(tmp, color);
- }
- else
- {
- double dz = END.Z - BGN.Z;
- double dy = END.Y - BGN.Y;
- t = dy / dz;
- if (BGN.Z < END.Z)
- {
- k = 1;
- }
- else
- {
- k = -1;
- }
- for (j = BGN.Z; j != (int)END.Z; j += k)
- {
- tmp.X=BGN.X;
- tmp.Y=BGN.Y;
- tmp.Z=j;
- setPixel(tmp, color);
- d += t;
- if (d > 0.5)
- {
- BGN.Y++;
- d--;
- }
- if (d < -0.5)
- {
- BGN.Y--;
- d++;
- }
- }
- tmp.X=BGN.X;
- tmp.Y=BGN.Y;
- tmp.Z=j;
- setPixel(tmp, color);
- }
- }
- }
- void color()
- {
- float tmp;
- for (int i = 0; i < m + 2 * m*(n - 1); i++)
- {
- tmp = (rand() % 100) / 100.0 -0.1;
- colorbase[i].r = tmp;
- tmp = (rand() % 100) / 100.0-0.1;
- colorbase[i].g = tmp;
- tmp = (rand() % 100) / 100.0-0.1;
- colorbase[i].b = tmp;
- }
- }
- void Draw(COOORD a, COOORD b, COOORD c, RGB color, int n)
- {
- glBegin(GL_POLYGON);
- glColor3f(color.r, color.g, color.b);
- glVertex3i(a.x, a.y, a.z);
- glVertex3i(b.x, b.y, b.z);
- glVertex3i(c.x, c.y, c.z);
- glEnd();
- glColor3f(0, 0, 0);
- glBegin(GL_POLYGON);
- glVertex3i(a.x, a.y, d - 1);
- glVertex3i(b.x, b.y, d - 1);
- glVertex3i(c.x, c.y, d - 1);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex3i(a.x, a.y, d + 1);
- glVertex3i(b.x, b.y, d + 1);
- glVertex3i(c.x, c.y, d + 1);
- glEnd();
- }
- void glutBufferActivated()
- {
- //ініціалізація буфера глубини
- for (int i = 0; i < 2*d + 1; i++)
- for (int j = 0; j < 2*d + 1; j++)
- depth_buffer[i][j] = d;
- //ініціалізація буфера кольору
- for (int i = 0; i < 2*d + 1; i++)
- for (int j = 0; j < 2*d + 1; j++)
- {
- color_buffer[i][j].r = 1.0;
- color_buffer[i][j].g = 1.0;
- color_buffer[i][j].b = 1.0;
- }
- }
- void glutDrawBuffers()
- {
- glPointSize(1);
- glBegin(GL_POINTS);
- for (int j = 0; j <= 2*d; j++)//x-d/2
- for (int i = 0; i <= 2*d; i++)//y-d/2
- {
- glColor3f(color_buffer[i][j].r, color_buffer[i][j].g, color_buffer[i][j].b);
- glVertex3i(j - d , i - d , depth_buffer[i][j]);
- }
- glColor3f(0, 0, 0);
- glVertex3i(0, 0, 0);
- glEnd();
- }
- void nDraw(COOORD a, COOORD b, COOORD c, RGB color)
- {
- if (sort(a,b,c)=='z')
- {
- if (a.z < b.z)
- {
- COOORD t = a;
- a = b;
- b = t;
- }
- if (a.z < c.z)
- {
- COOORD t = a;
- a = c;
- c = t;
- }
- if (c.z > b.z)
- {
- COOORD t = c;
- c = b;
- b = t;
- }
- if (c.z > a.z)
- {
- COOORD t = c;
- c = a;
- a = t;
- }
- COOORD begin;
- COOORD end;
- if (a.z == b.z)
- {
- for (int z = a.z; z >= (int)c.z; z--)
- {
- if (z == (int)a.z)
- {
- begin.x = a.x;
- begin.y = a.y;
- end.x = b.x;
- end.y = b.y;
- }
- else
- {
- if (z > (int)c.z)
- {
- begin.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
- begin.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
- end.x = b.x + (c.x - b.x)*(z - b.z) / (c.z - b.z);
- end.y = b.y + (c.y - b.y)*(z - b.z) / (c.z - b.z);
- }
- else
- {
- if (z == (int)c.z)
- {
- begin.x = c.x;
- begin.y = c.y;
- end.x = c.x;
- end.y = c.y;
- }
- }
- }
- CORD linker = { begin.x, begin.y, z};
- CORD linkeer = { end.x, end.y, z};
- Brezenhem(linker, linkeer, color);
- }
- }
- else
- {
- if (b.z == c.z)
- {
- for (int z = a.z; z >= (int)b.z; z--)
- {
- if (z == (int)a.z)
- {
- begin.x = a.x;
- begin.y = a.y;
- end.x = a.x;
- end.y = a.y;
- }
- else
- {
- if (z > b.z)
- {
- begin.x = a.x + (b.x - a.x)*(z - a.z) / (b.z - a.z);
- begin.y = a.y + (b.y - a.y)*(z - a.z) / (b.z - a.z);
- end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
- end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
- }
- else
- {
- if (z == (int)b.z)
- {
- begin.x = b.x;
- begin.y = b.y;
- end.x = c.x;
- end.y = c.y;
- }
- }
- }
- CORD link = { begin.x, begin.y, z };
- CORD linke = { end.x, end.y, z };
- Brezenhem(link,linke, color);
- }
- }
- if (a.z != b.z && c.z != b.z)
- {
- for (int z = a.z; z >= (int)c.z; z--)
- {
- if (z == (int)a.z)
- {
- begin.x = a.x;
- begin.y = a.y;
- end.x = a.x;
- end.y = a.y;
- }
- else
- {
- if (z > b.z)
- {
- begin.x = a.x + (b.x - a.x)*(z - a.z) / (b.z - a.z);
- begin.y = a.y + (b.y - a.y)*(z - a.z) / (b.z - a.z);
- end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
- end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
- }
- else
- {
- if (z == (int)b.z)
- {
- begin.x = b.x;
- begin.y = b.y;
- end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
- end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
- }
- else
- {
- if (z > c.z)
- {
- begin.x = b.x + (c.x - b.x)*(z - b.z) / (c.z - b.z);
- begin.y = b.y + (c.y - b.y)*(z - b.z) / (c.z - b.z);
- end.x = a.x + (c.x - a.x)*(z - a.z) / (c.z - a.z);
- end.y = a.y + (c.y - a.y)*(z - a.z) / (c.z - a.z);
- }
- else
- {
- if (z == (int)c.z)
- {
- begin.x = c.x;
- begin.y = c.y;
- end.x = c.x;
- end.y = c.y;
- }
- }
- }
- }
- }
- CORD lin = { begin.x, begin.y, z };
- CORD linn ={ end.x, end.y, z };
- Brezenhem(lin,linn , color);
- }
- }
- }
- }
- if (sort(a, b, c) == 'y')
- {
- if (a.y < b.y)
- {
- COOORD t = a;
- a = b;
- b = t;
- }
- if (a.y < c.y)
- {
- COOORD t = a;
- a = c;
- c = t;
- }
- if (c.y > b.y)
- {
- COOORD t = c;
- c = b;
- b = t;
- }
- if (c.y > a.y)
- {
- COOORD t = c;
- c = a;
- a = t;
- }
- COOORD begin;
- COOORD end;
- if (a.y == b.y)
- {
- for (int y = a.y; y >= (int)c.y; y--)
- {
- if (y == (int)a.y)
- {
- begin.x = a.x;
- begin.z = a.z;
- end.x = b.x;
- end.z = b.z;
- }
- else
- {
- if (y > c.y)
- {
- begin.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
- begin.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
- end.x = b.x + (c.x - b.x)*(y - b.y) / (c.y - b.y);
- end.z = b.z + (c.z - b.z)*(y - b.y) / (c.y - b.y);
- }
- else
- {
- if (y == (int)c.y)
- {
- begin.x = c.x;
- begin.z = c.z;
- end.x = c.x;
- end.z = c.z;
- }
- }
- }
- tmp.X=begin.x;
- tmp.Y=y;
- tmp.Z=begin.z;
- tmp2.X=end.x;
- tmp2.Y=y;
- tmp2.Z=end.z;
- Brezenhem(tmp, tmp2, color);
- }
- }
- else
- {
- if (b.y == (int)c.y)
- {
- for (int y = a.y; y >= (int)b.y; y--)
- {
- if (y == (int)a.y)
- {
- begin.x = a.x;
- begin.z = a.z;
- end.x = a.x;
- end.z = a.z;
- }
- else
- {
- if (y > (int)b.y)
- {
- begin.x = a.x + (b.x - a.x)*(y - a.y) / (b.y - a.y);
- begin.z = a.z + (b.z - a.z)*(y - a.y) / (b.y - a.y);
- end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
- end.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
- }
- else
- {
- if (y == (int)b.y)
- {
- begin.x = b.x;
- begin.z = b.z;
- end.x = c.x;
- end.z = c.z;
- }
- }
- }
- tmp.X=begin.x;
- tmp.Y=y;
- tmp.Z=begin.z;
- tmp2.X=end.x;
- tmp2.Y=y;
- tmp2.Z=end.z;
- Brezenhem(tmp, tmp2, color);
- }
- }
- if (a.y != b.y && c.y != b.y)
- {
- for (int y = a.y; y >= (int)c.y; y--)
- {
- if (y == (int)a.y)
- {
- begin.x = a.x;
- begin.z = a.z;
- end.x = a.x;
- end.z = a.z;
- }
- else
- {
- if (y > b.y)
- {
- begin.x = a.x + (b.x - a.x)*(y - a.y) / (b.y - a.y);
- begin.z = a.z + (b.z - a.z)*(y - a.y) / (b.y - a.y);
- end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
- end.z = a.z + (c.z- a.z)*(y - a.y) / (c.y - a.y);
- }
- else
- {
- if (y == (int)b.y)
- {
- begin.x = b.x;
- begin.z = b.z;
- end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
- end.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
- }
- else
- {
- if (y > c.y)
- {
- begin.x = b.x + (c.x - b.x)*(y - b.y) / (c.y - b.y);
- begin.z = b.z + (c.z - b.z)*(y - b.y) / (c.y - b.y);
- end.x = a.x + (c.x - a.x)*(y - a.y) / (c.y - a.y);
- end.z = a.z + (c.z - a.z)*(y - a.y) / (c.y - a.y);
- }
- else
- {
- if (y == (int)c.y)
- {
- begin.x = c.x;
- begin.z = c.z;
- end.x = c.x;
- end.z = c.z;
- }
- }
- }
- }
- }
- tmp.X=begin.x;
- tmp.Y=y;
- tmp.Z=begin.z;
- tmp2.X=end.x;
- tmp2.Y=y;
- tmp2.Z=end.z;
- Brezenhem(tmp, tmp2, color);
- }
- }
- }
- }
- if (sort(a, b, c) == 'x')
- {
- if (a.x < b.x)
- {
- COOORD t = a;
- a = b;
- b = t;
- }
- if (a.x < c.x)
- {
- COOORD t = a;
- a = c;
- c = t;
- }
- if (c.x > b.x)
- {
- COOORD t = c;
- c = b;
- b = t;
- }
- if (c.x > a.x)
- {
- COOORD t = c;
- c = a;
- a = t;
- }
- COOORD begin;
- COOORD end;
- if (a.x == b.x)
- {
- for (int x = a.x; x >= (int)c.x; x--)
- {
- if (x == (int)a.x)
- {
- begin.y = a.y;
- begin.z = a.z;
- end.y = b.y;
- end.z = b.z;
- }
- else
- {
- if (x > c.x)
- {
- begin.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
- begin.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
- end.y = b.y + (c.y - b.y)*(x - b.x) / (c.x - b.x);
- end.z = b.z + (c.z - b.z)*(x - b.x) / (c.x - b.x);
- }
- else
- {
- if (x == (int)c.x)
- {
- begin.y = c.y;
- begin.z = c.z;
- end.y = c.y;
- end.z = c.z;
- }
- }
- }
- tmp.X=x;
- tmp.Y=begin.y;
- tmp.Z=begin.z;
- tmp2.X=x;
- tmp2.Y=end.y;
- tmp2.Z=end.z;
- Brezenhem(tmp, tmp2, color);
- }
- }
- else
- {
- if (b.x == c.x)
- {
- for (int x = a.x; x >= (int)b.x; x--)
- {
- if (x == (int)a.x)
- {
- begin.y = a.y;
- begin.z = a.z;
- end.y = a.y;
- end.z = a.z;
- }
- else
- {
- if (x > b.x)
- {
- begin.y = a.y + (b.y - a.y)*(x - a.x) / (b.x - a.x);
- begin.z = a.z + (b.z - a.z)*(x - a.x) / (b.x - a.x);
- end.x = a.x + (c.x - a.x)*(x - a.x) / (c.x - a.x);
- end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
- }
- else
- {
- if (x == (int)b.x)
- {
- begin.y = b.y;
- begin.z = b.z;
- end.y = c.y;
- end.z = c.z;
- }
- }
- }
- tmp.X=x;
- tmp.Y=begin.y;
- tmp.Z=begin.z;
- tmp2.X=x;
- tmp2.Y=end.y;
- tmp2.Z=end.z;
- Brezenhem(tmp, tmp2, color);
- }
- }
- if (a.x != b.x && c.x != b.x)
- {
- for (int x = a.x; x >= (int)c.x; x--)
- {
- if (x == (int)a.x)
- {
- begin.y = a.y;
- begin.z = a.z;
- end.y = a.y;
- end.z = a.z;
- }
- else
- {
- if (x > b.x)
- {
- begin.y = a.y + (b.y - a.y)*(x - a.x) / (b.x - a.x);
- begin.z = a.z + (b.z - a.z)*(x - a.x) / (b.x - a.x);
- end.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
- end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
- }
- else
- {
- if (x == (int)b.x)
- {
- begin.y = b.y;
- begin.z = b.z;
- end.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
- end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
- }
- else
- {
- if (x > c.x)
- {
- begin.y = b.y + (c.y - b.y)*(x - b.x) / (c.x - b.x);
- begin.z = b.z + (c.z - b.z)*(x - b.x) / (c.x - b.x);
- end.y = a.y + (c.y - a.y)*(x - a.x) / (c.x - a.x);
- end.z = a.z + (c.z - a.z)*(x - a.x) / (c.x - a.x);
- }
- else
- {
- if (x == c.x)
- {
- begin.y = c.y;
- begin.z = c.z;
- end.y = c.y;
- end.z = c.z;
- }
- }
- }
- }
- }
- /*tmp.X=x;
- tmp.Y=begin.y;
- tmp.Z = begin.z;
- tmp2.X=x;
- tmp2.Y=end.y;
- tmp2.Z=end.z;*/
- CORD li ={ x, begin.y, begin.z };
- CORD lii={ x, end.y, end.z };
- Brezenhem(li, lii, color);
- }
- }
- }
- }
- }
- void display()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f(1.0, 1.0, 1.0);
- //////////////////////////////////////////
- triangle*object = new triangle[m + 2 * m*(n - 1)];
- int *R = new int[n + 1];
- double a = 90 * RAD / n;
- for (int i = 0; i < n; i++)
- {
- R[i] = r*cos(i*a);
- }
- R[n] = 0;
- int *Z = new int[n + 1];
- for (int i = 0; i < n + 1; i++)
- {
- Z[i] = -r*sin(i*a);
- }
- double *X = new double[m + 1];
- double *Y = new double[m + 1];
- a = 360 * RAD / m;
- for (int i = 0; i < m; i++)
- {
- X[i] = cos(i*a);
- Y[i] = sin(i*a);
- }
- X[m] = X[0];
- Y[m] = Y[0];
- /////////////////////////////////////////////////
- int k = 0;
- //for (int j = 0; j < n - 1; j++)
- //for (int i = 0; i < m; i++)
- //{
- // buf.x = X[i] * R[j];
- // buf.y = Y[i] * R[j];
- // buf.z = Z[j];
- // object[k].a = buf;/////////////////
- // buf.x = X[i + 1] * R[j];
- // buf.y = Y[i + 1] * R[j];
- // buf.z = Z[j];
- // object[k].b = buf;
- // buf.x = X[i] * R[j + 1];
- // buf.y = Y[i] * R[j + 1];
- // buf.z = Z[j + 1];
- // object[k].c = buf;
- // k++;
- // buf.x = X[i + 1] * R[j + 1];
- // buf.y = Y[i + 1] * R[j + 1];
- // buf.z = Z[j + 1];
- // object[k].a = buf;
- // buf.x = X[i + 1] * R[j];
- // buf.y = Y[i + 1] * R[j];
- // buf.z = Z[j];
- // object[k].b = buf;
- // buf.x = X[i] * R[j + 1];
- // buf.y = Y[i] * R[j + 1];
- // buf.z = Z[j + 1];
- // object[k].c = buf;
- // k++;
- //}
- for (int i = 0; i < m; i++)
- {
- buf.x = X[i] * R[n - 1];
- buf.y = Y[i] * R[n - 1];
- buf.z = Z[n]+100;
- object[k].a = buf;
- buf.x = X[i + 1] * R[n - 1];
- buf.y = Y[i + 1] * R[n - 1];
- buf.z = Z[n]+100;
- object[k].b = buf;
- buf.x = X[i] * R[n];
- buf.y = Y[i] * R[n];
- buf.z = Z[n]+100;
- object[k].c = buf;
- k++;
- }
- glutDrawBuffers();
- ////////////////////////////////////////////////
- glutBufferActivated();
- ///////////////////////////////////////////////////
- //
- for (int i = 0; i < m + 2 * m*(n - 1); i++)
- {
- nDraw(object[i].a, object[i].b, object[i].c, colorbase[i]);
- }
- ///////////////////////////////////////////////////
- //nDraw(object[11].a, object[11].b, object[11].c, colorbase[11]);
- //nDraw(object[10].a, object[10].b, object[10].c, colorbase[10]);
- //nDraw(object[9].a, object[9].b, object[9].c, colorbase[9]);
- //nDraw(object[8].a, object[8].b, object[8].c, colorbase[8]);
- //nDraw(object[7].a, object[7].b, object[7].c, colorbase[7]);
- //nDraw(object[1].a, object[1].b, object[1].c, colorbase[1]);
- /*glBegin(GL_LINES);
- glColor3f(0, 0, 1);
- glVertex3f(100, 0, -173);
- glVertex3f(-50, -86, -173);
- glColor3f(0, 1, 0);
- glVertex3f(0, 0, -200);
- glVertex3f(0, -57, -173);
- glEnd();
- Brezenhem({ 0, 0, -200 }, { 0, -57, -173 }, { 1, 0, 0 });*/
- glutDrawBuffers();
- glTranslatef(0, 0, deltaMove);
- deltaMove = 0;
- if (first)
- {
- first = false;
- //glRotatef(-30, 1,1, 0);
- glRotatef(180, 1, 0, 0);
- glRotatef(90,0, 0,1);
- }
- glRotatef(0.3,1, 0, 0);
- glutSwapBuffers();
- }
- void timer(int = 0)
- {
- display();
- glutTimerFunc(10, timer, 0);
- }
- void pressKey(int key, int xx, int yy) {
- switch (key) {
- case GLUT_KEY_UP: deltaMove = 5.0f; break;
- case GLUT_KEY_DOWN: deltaMove = -5.0f; break;
- }
- }
- int main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- glutInitWindowSize(500, 500);
- glutInitWindowPosition(20, 20);
- glutCreateWindow("Z_BUFFER");
- glClearColor(0.0, 0.0, 0.0,1.0);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-d, d, -d, d, -5 * d, 5 * d);
- //srand(time(NULL));
- color();
- glutIgnoreKeyRepeat(1);
- glutSpecialFunc(pressKey);
- glEnable(GL_DEPTH_TEST);
- glutDisplayFunc(display);
- timer();
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement