⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cimg_demo.cpp

📁 this a image processing program
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	  else disp.resize(visu,false);	}	visu.draw_object3d(visu.dimx()/2.0f,visu.dimy()/2.0f,0.0f,			   rpoints,primitives,colors,opacities,4,			   true,500.0f,(float)(cos(theta+=0.01f)+1)*visu.dimx()/2.0f,(float)visu.dimy(),-100.0f,0.2f).	  display(disp.wait(25));      }    } break;    case 19: {      // 3D Metaballs      //--------------      CImg<unsigned char> img(512,320,1,3);      img = CImg<unsigned char>(100,100,1,3,0).noise(100,2).draw_plasma(0,0,99,99).resize(img,3).blur(4);      img.get_shared_channel(2)/=4; img.get_shared_channel(1)/=2;      metaballs3d met;      CImgList<float> points;      CImgList<unsigned int> primitives;      CImgList<unsigned char> colors(8000,3,1,1,1,255);      unsigned char white[3] = {255,255,255};      float alpha=0, beta=0, delta=0, theta=0, gamma=0;      CImgDisplay disp(img,"3D Metaballs");      while (!disp.is_closed && disp.key!=cimg::keyQ && disp.key!=cimg::keyESC) {	met.cx2=1.5f*(float)cos(theta);     met.cy2=2.5f*(float)sin(3*(theta+=0.04f));	met.cy1=2.0f*(float)sin(4*gamma);   met.cz1=1.2f*(float)cos(2*(gamma-=0.02f));	met.cx3=2.5f*(float)cos(2.5*delta); met.cz3=1.5f*(float)sin(2*(delta+=0.03f));	points.assign(); primitives.assign();	cimg::marching_cubes(met,0.8f,-4.5f,-4.5f,-3.5f,4.5f,4.5f,3.5f,0.25f,0.25f,0.25f,points,primitives,true);	CImgList<> rpoints(points);	const CImg<> rot = 50*CImg<>::rotation_matrix(0,0,1,(alpha+=0.04f))*CImg<>::rotation_matrix(1,1,0,(beta+=0.023f));	cimglist_for(rpoints,l) rpoints(l) = rot*points(l);	cimglist_for(primitives,ll) {	  colors(ll,0) = 191+64*ll/primitives.size;	  colors(ll,1) = 191+64*ll/primitives.size;	  colors(ll,2) = 255*ll/primitives.size;	}	if (primitives.size) {	  (+img).draw_object3d(img.dimx()/2.0f,img.dimy()/2.0f,0.0f,			       rpoints,primitives,			       colors.get_crop(0,primitives.size-1,true),			       4,false,500,0,0,-500,0,0.9f).	    draw_text(5,5,white,0,11,0.5f,"%u frames/s",(unsigned int)disp.frames_per_second()).display(disp);	}	if (disp.is_resized) disp.resize(false);	if (disp.is_typed(cimg::keyCTRLLEFT,cimg::keyF)) disp.toggle_fullscreen();      }    } break;    case 20: {      // Fireworks      //----------      CImg<unsigned char> img(640,480,1,3,0);      CImgDisplay disp(img,"Fireworks");      CImgList<unsigned char> colors;      unsigned char white[3] = {255,255,255}, black[3] = {128,0,0};      CImgList<> particles;      float time=0, speed=100.0f;      while (!disp.is_closed && disp.key!=cimg::keyQ && disp.key!=cimg::keyESC) {	if (disp.button&1 || !particles.size || (--time)<0) {	  particles.insert(CImg<>::vector((float)cimg::rand()*img.dimx(),(float)img.dimy(),					  (float)cimg::crand()*4,-6-(float)cimg::rand()*3,					  30+60*(float)cimg::rand(),3));	  colors.insert(CImg<unsigned char>::vector(255,255,255));	  time = (float)(cimg::rand()*speed);	}	img*=0.92f;	cimglist_for(particles,l) {	  bool remove_particle = false;	  float &x = particles(l,0), &y = particles(l,1), &vx = particles(l,2), &vy = particles(l,3),	    &t = particles(l,4), &r = particles(l,5);	  const float n = (float)sqrt(1e-5f+vx*vx+vy*vy), nvx = vx/n, nvy = vy/n,	    r2 = (t>0 || t<-42)?r/3:r*(1-2*(-(t+2)/40.0f)/3);	  img.draw_ellipse((int)x,(int)y,r,r2,nvx,nvy,colors[l].ptr(),0U,0.6f);	  x+=vx; y+=vy; vy+=0.09f; t--;	  if (y>img.dimy()+10 || x<0 || x>=img.dimx()+10) remove_particle = true;	  if (t<0 && t>=-1) {	    if ((speed*=0.9f)<10) speed=10.0f;	    const unsigned char	      r = cimg::min(50+3*(unsigned char)(100*cimg::rand()), 255),	      g = cimg::min(50+3*(unsigned char)(100*cimg::rand()), 255),	      b = cimg::min(50+3*(unsigned char)(100*cimg::rand()), 255);	    const float di = 10+(float)cimg::rand()*60, nr = (float)cimg::rand()*30;	    for (float i=0; i<360; i+=di) {	      const float rad = i*(float)cimg::PI/180, c = (float)cos(rad), s = (float)sin(rad);	      particles.insert(CImg<>::vector(x,y,2*c+vx/1.5f,2*s+vy/1.5f,-2.0f,nr));	      colors.insert(CImg<unsigned char>::vector(r,g,b));	    }	    remove_particle = true;	  } else if (t<-1) { r*=0.95f; if (r<0.5f) remove_particle=true; }	  if (remove_particle) { particles.remove(l); colors.remove(l); l--; }	}	if (disp.button&2) cimglist_for(particles,l) if (particles(l,4)>0) particles(l,4)=0.5f;	img.draw_text(5,5,white,black,11,0.5f,"%u frames/s",(unsigned int)disp.frames_per_second());	disp.display(img).wait(25);	if (disp.is_typed(cimg::keyCTRLLEFT,cimg::keyF)) {	  disp.toggle_fullscreen();	  if (disp.is_fullscreen) disp.resize(disp.screen_dimx(),disp.screen_dimy(),false);	  else disp.resize(img,false);	}	if (disp.is_resized) disp.resize(disp,false);      }    } break;    case 21: {      // Rubber Logo      //-------------      const unsigned char white[3] = {255,255,255};      CImg<unsigned char> background = CImg<unsigned char>(300,300).noise(100,2);      background(0,0) = background(299,0) = background(299,299) = background(0,299) = 0;      background.draw_plasma(0,0,299,299).blur(1.0f,14.0f,0.0f,0).resize(-100,-100,1,3);      CImgDisplay disp(CImg<unsigned char>(background).		       draw_text(10,10,white,0,11,1.0f,"Generating the rubber object..."),"3D Rubber Logo");      CImg<unsigned char> vol = CImg<unsigned char>().draw_text("CImg",30,30,white,0,48).resize(-100,-100,15,1);      for (unsigned int k=0; k<5; k++) { vol.get_shared_plane(k).fill(0); vol.get_shared_plane(vol.dimz()-1-k).fill(0); }      vol.resize(vol.dimx()+30,vol.dimy()+30,-100,1,0).blur(2).resize(-50,-50);      CImgList<> points;      CImgList<unsigned int> faces;      CImgList<unsigned char> colors;      vol.marching_cubes(45,points,faces,true);      colors.insert(faces.size,CImg<unsigned char>::vector(100,100,255));      cimglist_for(colors,l) {	const float x = (points(faces(l,0),0) + points(faces(l,1),0) + points(faces(l,2),0))/3;	if (x<27) colors[l] = CImg<unsigned char>::vector(255,100,100);	else { if (x<38) colors[l] = CImg<unsigned char>::vector(200,155,100);	else { if (x<53) colors[l] = CImg<unsigned char>::vector(100,255,155);	}}}      {cimglist_for(points,l) { points(l,0)-=vol.dimx()/2; points(l,1)-=vol.dimy()/2; points(l,2)-=vol.dimz()/2; }}      points*=5.5;      CImgList<unsigned char> frames(100,background);      bool ok_visu = false;      unsigned int nb_frame = 0;      float alpha=0, beta=0, gamma=0;      while (!disp.is_closed && disp.key!=cimg::keyQ && disp.key!=cimg::keyESC) {	CImg<unsigned char>& frame = frames[nb_frame++];	if (nb_frame>=frames.size) { ok_visu = true; nb_frame = 0; }	const CImg<>	  rot = CImg<>::rotation_matrix(0,1,0.2f,alpha+=0.011f)*	  CImg<>::rotation_matrix(1,0.4f,1,beta+=0.015f)*	  (1+0.1f*cos((double)(gamma+=0.1f)));	(frame=background).draw_object3d(frame.dimx()/2.0f,frame.dimy()/2.0f,frame.dimz()/2.0f,rot*points,faces,colors,5);	if (ok_visu) {	  CImg<unsigned char> visu(frame);	  cimglist_for(frames,l) {	    const unsigned int	      y0 = l*visu.dimy()/frames.size,	      y1 = (l+1)*visu.dimy()/frames.size-1;	    cimg_forV(visu,k) visu.get_shared_lines(y0,y1,0,k) = frames[(nb_frame+l)%frames.size].get_shared_lines(y0,y1,0,k);	  }	  visu.draw_text(5,5,white,0,11,0.5f,"%u frames/s",(unsigned int)disp.frames_per_second());	  disp.display(visu).wait(20);	}	if (disp.is_typed(cimg::keyCTRLLEFT,cimg::keyF)) disp.toggle_fullscreen();	if (disp.is_resized) disp.resize();      }    } break;    case 22: {      // Image Waves      //-------------      const CImg<unsigned char> img = CImg<unsigned char>("img/milla.ppm").get_resize(128,128,1,3);      const unsigned int w = img.dimx()+1, h = img.dimy()+1;      CImgList<> points0;      CImgList<unsigned int> faces0;      CImgList<unsigned char> colors0;      { for (unsigned int y=0; y<h; y++) for (unsigned int x=0; x<w; x++)		  points0.insert(CImg<>::vector(3*(x-w/2.0f),3*(y-w/2.0f),0)); }      cimg_forXY(img,x,y) {	faces0.insert(CImg<unsigned int>::vector(x+y*w,x+(y+1)*w,x+1+(y+1)*w,x+1+y*w));	colors0.insert(CImg<unsigned char>::vector(img(x,y,0),img(x,y,1),img(x,y,2)));      }      CImgList<> opacities0(faces0.size,CImg<>::vector(1.0f));      CImg<unsigned char>	back = CImg<unsigned char>(400,300,1,3).sequence(0,130),	ball = CImg<unsigned char>(12,12,1,3,0).draw_circle(6,6,5,CImg<unsigned char>::vector(0,128,64).ptr());      const CImg<> mball = ball.get_norm_pointwise(2).normalize(0,1.0f).dilate(3);      ball.draw_circle(7,5,4.5f,CImg<unsigned char>::vector(16,96,52).ptr()).	draw_circle(8,4,2.5f,CImg<unsigned char>::vector(0,128,64).ptr()).	draw_circle(8,4,1.5f,CImg<unsigned char>::vector(64,196,128).ptr());      CImg<> uc(img.dimx()/2,img.dimy()/2,1,1,0), up(uc), upp(uc);      CImgDisplay disp(back,"Image Waves");      CImgList<int> particles;      for (float alpha=0.0f, count=10.0f; !disp.is_closed && disp.key!=cimg::keyESC && disp.key!=cimg::keyQ; ) {	if ((disp.button&1 && disp.mouse_x>=0) || --count<0) {	  particles.insert(CImg<int>::vector((int)(cimg::rand()*(img.dimx()-1)),(int)(cimg::rand()*(img.dimy()-1)),-200,0));	  count = (float)(cimg::rand()*15);	}	alpha = (disp.mouse_x>=0 && disp.button&2)?(float)(disp.mouse_x*2*cimg::PI/disp.dimx()):(alpha+0.04f);        if (disp.is_typed(cimg::keyCTRLLEFT,cimg::keyF)) disp.toggle_fullscreen();	cimglist_for(particles,l) {	// Handle particles	  float& z = up(particles(l,0)>>1,particles(l,1)>>1);	  if ((particles(l,2)+=(particles(l,3)++))>z-10) { z = 250.0f; particles.remove(l--); }	}	CImg_3x3(U,float);  // Apply wave effect	cimg_for3x3(up,x,y,0,0,U) uc(x,y) = (Unc+Upc+Ucn+Ucp)/2 - upp(x,y);	(uc-=(float)CImgStats(uc.blur(0.7f),false).mean).swap(upp).swap(up);	CImgList<> points(points0);	CImgList<unsigned int> faces(faces0);	CImgList<unsigned char> colors(colors0);	CImgList<> opacities(opacities0);	cimglist_for(points,p) points(p,2) = cimg::min(30 + uc.linear_pix2d((p%w)/2.0f,(p/w)/2.0f),70.0f);	{ cimglist_for(particles,l) {	  points.insert(CImg<>::vector(3*(particles(l,0)-w/2.0f),3*(particles(l,1)-h/2.0f),30.0f+particles(l,2)));	  faces.insert(CImg<unsigned int>::vector(points.size-1));	  colors.insert(ball);	  opacities.insert(mball);	}}	const CImg<> rot = CImg<>::rotation_matrix(1.0f,0,0,(float)(cimg::PI/3.0f))*CImg<>::rotation_matrix(0,0,1.0f,alpha);	(+back).draw_object3d(back.dimx()/2.0f,back.dimy()/2.0f,0,rot*points,faces,colors,opacities,4,false,500.0f,0,0,0,0.3f).	  display(disp.resize(false).wait(20));      }    } break;    case 23: {      // Breakout      //----------      // Init graphics      CImg<unsigned char> board(8,10,1,1,0),        background = CImg<unsigned char>(board.dimx()*32,board.dimy()*16+200,1,3,0).noise(20,1).draw_plasma().blur(1,8,0),        visu0(background/2), visu(visu0), brick(16,16,1,1,200), racket(64,8,1,3,0), ball(8,8,1,3,0);      const unsigned char white[3] = { 255,255,255 }, green1[3] = { 60,150,30 }, green2[3] = { 130,255,130 };      { cimg_for_borderXY(brick,x,y,1) brick(x,y) = x>y?255:128; }      { cimg_for_insideXY(brick,x,y,1) brick(x,y) = cimg::min(255,64+8*(x+y)); }      brick.resize(31,15,1,1,1).resize(32,16,1,1,0);      ball.draw_circle(4,4,3,white); ball-=ball.get_erode(3)/1.5f;      racket.draw_circle(4,3,3.7f,green1).draw_circle(3,2,1.8f,green2);      { cimg_forY(racket,y) racket.draw_rectangle(4,y,racket.dimx()-7,y,CImg<unsigned char>::vector(y*4,255-y*32,255-y*25).ptr()); }      racket.draw_image(racket.get_crop(0,0,racket.dimx()/2-1,racket.dimy()-1).mirror('x'),racket.dimx()/2,0);      const int        w = visu.dimx(), h = visu.dimy(), w2 = w/2, h2 = h/2,        bw = ball.dimx(), bh = ball.dimy(), bw2 = bw/2, bh2 = bh/2,        rw = racket.dimx(), rh = racket.dimy(), rw2 = rw/2;      float xr = (float)(w-rw2), oxr = (float)xr, xb = 0, yb = 0, oxb = 0, oyb = 0, vxb = 0, vyb = 0;      // Begin game loop      CImgDisplay disp(visu,"CImg Breakout");      disp.move((CImgDisplay::screen_dimx()-w)/2,(CImgDisplay::screen_dimy()-h)/2);      for (unsigned int N=0, N0=0; !disp.is_closed && disp.key!=cimg::keyESC && disp.key!=cimg::keyQ; ) {        if (N0) {          int X = (int)xr;          if (disp.mouse_x>=0) X = (int)(w2+((disp.mouse_x<0?w2:disp.mouse_x)-w2)*2);          else disp.set_mouse(xr>w2?w-81:80,h2);          if (X<rw2) { X = rw2; disp.set_mouse(80,h2); }          if (X>=w-rw2) { X = w-rw2-1; disp.set_mouse(w-81,h2); }          oxr = xr; xr = (float)X; oxb = xb; oyb = yb; xb+=vxb; yb+=vyb;          if ((xb>=w-bw2) || (xb<bw2)) { xb-=vxb; yb-=vyb; vxb=-vxb; }          if (yb<bh2) { yb = (float)bh2; vyb=-vyb; }          if (yb>=h-rh-8-bh2 && yb<h-8-bh2 && xr-rw2<=xb && xr+rw2>=xb) {            xb = oxb; yb = h-rh-8.0f-bh2; vyb=-vyb; vxb+=(xr-oxr)/4;            if (cimg::abs(vxb)>8) vxb*=8/cimg::abs(vxb);          }          if (yb<board.dimy()*16) {            const int X = (int)xb/32, Y = (int)yb/16;            if (board(X,Y)) {              board(X,Y) = 0;              N++;              const unsigned int x0 = X*brick.dimx(), y0 = Y*brick.dimy(), x1 = (X+1)*brick.dimx()-1, y1 = (Y+1)*brick.dimy()-1;              visu0.draw_image(background.get_crop(x0,y0,x1,y1),x0,y0);              if (oxb<(X<<5) || oxb>=((X+1)<<5)) vxb=-vxb;              else if (oyb<(Y<<4) || oyb>=((Y+1)<<4)) vyb=-vyb;            }          }          disp.set_title("Score : %u/%u",N,N0);        }        if (yb>h || N==N0) {          disp.show_mouse();          while (!disp.key && !disp.is_closed && !disp.button) {            ((visu=visu0)/=2).draw_text(N0?"Game Over !":"Get Ready ?",50,visu.dimy()/2-10,white,0,25).              display(disp);            disp.wait();            if (disp.is_resized) disp.resize(disp);          }          board.fill(0); visu0 = background;          cimg_forXY(board,x,y) if (0.2f+cimg::crand()>=0) {            CImg<> cbrick = CImg<double>::vector(100+cimg::rand()*155,100+cimg::rand()*155,100+cimg::rand()*155).              unroll('v').resize(brick.dimx(),brick.dimy());            cimg_forV(cbrick,k) (cbrick.get_shared_channel(k).mul(brick))/=255;            visu0.draw_image(cbrick,x*32,y*16);            board(x,y) = 1;          }          N0 = (int)board.sum(); N = 0;          oxb = xb = (float)w2; oyb = yb = board.dimy()*16.0f+bh; vxb = 2.0f; vyb = 3.0f;          disp.hide_mouse();        } else disp.display((visu=visu0).draw_image(racket,(int)(xr-rw2),h-rh-8).draw_image(ball,(int)(xb-bw2),(int)(yb-bh2)));        if (disp.is_resized) disp.resize(disp);        disp.wait(20);      }    } break;    }  }  // Exit demo menu  //----------------  fprintf(stderr,"Exit CImg Demo\n");  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -