Top Solo
Overview
team name - classical DoTA reference
CImage is a free and open source cross platform Image Processing solution written in C++:
Assignment 1
I am going to try and profile and optimize the following function from the CImg Library. This function creates triangles on the screen and allows the user to make them clump up by clicking the mouse buttons.
// Item : Filled Triangles //------------------------- void* item_filled_triangles() { // Size const int SIZE = 100; // Create a colored 640x480 background image which consists of different color shades. CImg<float> background(640,480,1,3); cimg_forXY(background,x,y) background.fillC(x,y,0, x*std::cos(6.0*y/background.height()) + y*std::sin(9.0*x/background.width()), x*std::sin(8.0*y/background.height()) - y*std::cos(11.0*x/background.width()), x*std::cos(13.0*y/background.height()) - y*std::sin(8.0*x/background.width())); background.normalize(0,180); // Init images and create display window. CImg<unsigned char> img0(background), img; unsigned char white[] = { 255, 255, 255 }, color[100][3]; CImgDisplay disp(img0,"[#6] - Filled Triangles (Click to shrink)"); // Define random properties (pos, size, colors, ..) for all triangles that will be displayed. float posx[SIZE], posy[SIZE], rayon[SIZE], angle[SIZE], veloc[SIZE], opacity[SIZE]; int num = 1; std::srand((unsigned int)time(0)); // I'm thinking of offloading these operations to the GPU for (int k = 0; k<SIZE; ++k) { posx[k] = (float)(cimg::rand()*img0.width()); posy[k] = (float)(cimg::rand()*img0.height()); rayon[k] = (float)(10 + cimg::rand()*50); angle[k] = (float)(cimg::rand()*360); veloc[k] = (float)(cimg::rand()*20 - 10); color[k][0] = (unsigned char)(cimg::rand()*255); color[k][1] = (unsigned char)(cimg::rand()*255); color[k][2] = (unsigned char)(cimg::rand()*255); opacity[k] = (float)(0.3 + 1.5*cimg::rand()); } // Start animation loop. while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) { img = img0; /* Maybe offload this for loop to GPU? */ // Draw each triangle on the background image. for (int k = 0; k<num; ++k) { const int x0 = (int)(posx[k] + rayon[k]*std::cos(angle[k]*cimg::PI/180)), y0 = (int)(posy[k] + rayon[k]*std::sin(angle[k]*cimg::PI/180)), x1 = (int)(posx[k] + rayon[k]*std::cos((angle[k] + 120)*cimg::PI/180)), y1 = (int)(posy[k] + rayon[k]*std::sin((angle[k] + 120)*cimg::PI/180)), x2 = (int)(posx[k] + rayon[k]*std::cos((angle[k] + 240)*cimg::PI/180)), y2 = (int)(posy[k] + rayon[k]*std::sin((angle[k] + 240)*cimg::PI/180)); if (k%10) img.draw_triangle(x0,y0,x1,y1,x2,y2,color[k],opacity[k]); else img.draw_triangle(x0,y0,x1,y1,x2,y2,img0,0,0,img0.width()-1,0,0,img.height()-1,opacity[k]); img.draw_triangle(x0,y0,x1,y1,x2,y2,white,opacity[k],~0U); // Make the triangles rotate, and check for mouse click event. // (to make triangles collapse or join). angle[k]+=veloc[k]; if (disp.mouse_x()>0 && disp.mouse_y()>0) { float u = disp.mouse_x() - posx[k], v = disp.mouse_y() - posy[k]; if (disp.button()) { u = -u; v = -v; } posx[k]-=0.03f*u, posy[k]-=0.03f*v; if (posx[k]<0 || posx[k]>=img.width()) posx[k] = (float)(cimg::rand()*img.width()); if (posy[k]<0 || posy[k]>=img.height()) posy[k] = (float)(cimg::rand()*img.height()); } } // Display current animation framerate, and refresh display window. img.draw_text(5,5,"%u frames/s",white,0,0.5f,13,(unsigned int)disp.frames_per_second()); img0.resize(disp.display(img).resize(false).wait(20)); if (++num>SIZE) num = SIZE; // Allow the user to toggle fullscreen mode, by pressing CTRL+F. if (disp.is_keyCTRLLEFT() && disp.is_keyF()) disp.resize(640,480,false).toggle_fullscreen(false); } return 0; }