Advertisement
Guest User

Untitled

a guest
Oct 30th, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.51 KB | None | 0 0
  1. /*
  2. OpenGL visualization skeleton for displaying bitmap images. Just provide a GenerateImage function.
  3. Good starting point for all image processing exercises for parallel programming.
  4.  
  5. Example of generating bitmaps using GenerateImage and the prepared GLUT OpenGL visualization.
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11.  
  12. #ifdef __APPLE__
  13. #include <GLUT/glut.h>
  14. #else
  15. #include <GL/freeglut.h>
  16. #include <GL/freeglut_ext.h>
  17. #endif
  18.  
  19. typedef struct {
  20. GLbyte r;
  21. GLbyte g;
  22. GLbyte b;
  23. } pixel;
  24.  
  25. typedef struct{
  26. int x;
  27. int y;
  28. } vertex;
  29.  
  30. pixel black;
  31.  
  32. // postupnost bodov, najprv 3 potom 2
  33. //treba vedet zobrazit pole (postupnost)
  34. //vertex[] pole = { {1,2,3}, {4,5}, {6,7}};
  35.  
  36. #define TEX_SIZE 512
  37. pixel image[TEX_SIZE][TEX_SIZE];
  38.  
  39. GLuint texture;
  40.  
  41. int mocnina(int a, int b)
  42. {
  43. return (int) pow(a,b);
  44. }
  45.  
  46. void line(vertex a, vertex b)
  47. {
  48. int i,j;
  49.  
  50. for (i=a.x; i<=b.x; i++)
  51. for (j=a.y; j<=b.y; j++)
  52. image[i][j] = black;
  53. }
  54.  
  55.  
  56. float *multiply (float ucka[4], int matrix[4][4])
  57. {
  58. float *m = malloc(4 * sizeof(float));
  59. int i,j;
  60.  
  61. m[0] = ucka[0] * matrix[0][0] + ucka[1] * matrix[1][0] + ucka[2] * matrix[2][0] + ucka[3] * matrix[3][0];
  62. m[1] = ucka[0] * matrix[0][1] + ucka[1] * matrix[1][1] + ucka[2] * matrix[2][1] + ucka[3] * matrix[3][1];
  63. m[2] = ucka[0] * matrix[0][2] + ucka[1] * matrix[1][2] + ucka[2] * matrix[2][2] + ucka[3] * matrix[3][2];
  64. m[3] = ucka[0] * matrix[0][3] + ucka[1] * matrix[1][3] + ucka[2] * matrix[2][3] + ucka[3] * matrix[3][3];
  65.  
  66. return m;
  67. }
  68.  
  69. int mul(float m[4], int v[4])
  70. {
  71. float f = 0;
  72. int i;
  73.  
  74. for (i=0; i<4; i++)
  75. f += m[i] * v[i];
  76.  
  77. return (int)f;
  78. }
  79.  
  80. void GenerateImage() {
  81.  
  82. int x,y;
  83. float u;
  84.  
  85. black.r = 0;
  86. black.g = 0;
  87. black.b = 0;
  88.  
  89. for (x = 0; x < TEX_SIZE; x++)
  90. for (y = 0; y < TEX_SIZE; y++)
  91. image[x][y].r = image[x][y].b = image[x][y].g = 255;
  92.  
  93. /* int Vy1 = 130;
  94. int Vx1 = 130;
  95. int Vx2 = 50;
  96. int Vy2 = 50;
  97.  
  98.  
  99. for (u = 0; u < 1; u += 0.01) {
  100. Qy = (1 - u) * Vy1 + Vy2;
  101. Qx = (1 - u) * Vx1 + Vx2;
  102. image[Qx][Qy] = black;
  103. }*/
  104.  
  105. vertex v0;
  106. vertex v1;
  107. vertex v2;
  108. vertex Q, Q2;
  109.  
  110. v0.x = 10;
  111. v0.y = 500;
  112. v1.x = 100;
  113. v1.y = 20;
  114. v2.x = 500;
  115. v2.y = 500;
  116.  
  117. for (u = 0; u < 1; u += 0.00001) {
  118. Q.y = (1 - u) * ( (1-u) * v0.y + u * v1.y) + u * ( (1-u) * v1.y + u * v2.y) ;
  119. Q.x = (1 - u) * ( (1-u) * v0.x + u * v1.x) + u * ( (1-u) * v1.x + u * v2.x) ;
  120. image[Q.y][Q.x] = black;
  121. }
  122.  
  123. v0.x = 10;
  124. v0.y = 200;
  125. v1.x = 250;
  126. v1.y = 20;
  127. v2.x = 500;
  128. v2.y = 200;
  129.  
  130. for (u = 0; u < 1; u += 0.00001) {
  131. Q.y = (1 - u) * ( (1-u) * v0.y + u * v1.y) + u * ( (1-u) * v1.y + u * v2.y) ;
  132. Q.x = (1 - u) * ( (1-u) * v0.x + u * v1.x) + u * ( (1-u) * v1.x + u * v2.x) ;
  133. image[Q.y][Q.x] = black;
  134. }
  135.  
  136. v0.x = 200;
  137. v0.y = 90;
  138. v1.x = 160;
  139. v1.y = 60;
  140. v2.x = 200;
  141. v2.y = 40;
  142.  
  143. for (u = 0; u < 1; u += 0.0001) {
  144. Q.y = (1 - u) * ( (1-u) * v0.y + u * v1.y) + u * ( (1-u) * v1.y + u * v2.y) ;
  145. Q.x = (1 - u) * ( (1-u) * v0.x + u * v1.x) + u * ( (1-u) * v1.x + u * v2.x) ;
  146. image[Q.y][Q.x] = black;
  147. }
  148.  
  149. float ucka[4] = {1,1,1,1};
  150.  
  151. float *temp;
  152.  
  153. int matrix[4][4] = {-1,3,-1,1,3,-6,3,0,-3,3,0,0,1,0,0,0};
  154.  
  155. int verticesX[4] = {100,160,140,100};
  156. int verticesY[4] = {50,30,20,0};
  157.  
  158.  
  159. for (u = 0; u < 1; u += 0.00001) {
  160.  
  161. ucka[0] = u*u*u;
  162. ucka[1] = u*u;
  163. ucka[2] = u;
  164. ucka[3] = 1;
  165.  
  166. temp = multiply(ucka, matrix);
  167.  
  168. Q.y = mul(temp, verticesY);
  169. Q.x = mul(temp, verticesX);
  170.  
  171. // printf("%.2f %.2f %.2f %.2f\n",temp[0],temp[1],temp[2],temp[3]);
  172.  
  173. image[Q.y][Q.x] = black;
  174. }
  175.  
  176. }
  177.  
  178. // Initialize OpenGL state
  179. void init() {
  180. // Texture setup
  181. glEnable(GL_TEXTURE_2D);
  182. glGenTextures( 1, &texture);
  183. glBindTexture(GL_TEXTURE_2D, texture);
  184. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  185. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  186. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  187. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  188.  
  189. // Other
  190. glClearColor(0,0,0,0);
  191. gluOrtho2D(-1,1,-1,1);
  192. glLoadIdentity();
  193. glColor3f(1,1,1);
  194. }
  195.  
  196. // Generate and display the image.
  197. void display() {
  198. // Call user image generation
  199. GenerateImage();
  200. // Copy image to texture memory
  201. glBindTexture(GL_TEXTURE_2D, texture);
  202. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEX_SIZE, TEX_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
  203. // Clear screen buffer
  204. glClear(GL_COLOR_BUFFER_BIT);
  205. // Render a quad
  206. glBegin(GL_QUADS);
  207. glTexCoord2f(1,0); glVertex2f(1,-1);
  208. glTexCoord2f(1,1); glVertex2f(1,1);
  209. glTexCoord2f(0,1); glVertex2f(-1,1);
  210. glTexCoord2f(0,0); glVertex2f(-1,-1);
  211. glEnd();
  212. // Display result
  213. glFlush();
  214. glutPostRedisplay();
  215. glutSwapBuffers();
  216. }
  217.  
  218. // Main entry function
  219. int main(int argc, char ** argv) {
  220. // Init GLUT
  221. glutInit(&argc, argv);
  222. glutInitWindowSize(TEX_SIZE, TEX_SIZE);
  223. glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
  224. glutCreateWindow("OpenGL Window");
  225. // Set up OpenGL state
  226. init();
  227. // Run the control loop
  228. glutDisplayFunc(display);
  229. glutMainLoop();
  230. return EXIT_SUCCESS;
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement