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

📄 wzpixmap.cxx

📁 Delaunay三角形的网格剖分程序
💻 CXX
字号:
//#include <iostream.h>#include "wzoutput.hxx"#include <stdio.h>#include <stdlib.h>#include "wzpixmap.hxx"       wzTrueColorPixmap::wzTrueColorPixmap(int lx,int ly):Lx(lx),Ly(ly){c(lx*ly);}void wzTrueColorPixmap::save(wzString fname) const{int i,j; FILE* file = fopen(fname,"w"); if(file==NULL){ throw wzFileOpenError();} fprintf(file,"P6\n"); fprintf(file,"# created by WZ 1.0\n"); fprintf(file,"%d %d\n",Lx,Ly); fprintf(file,"255\n"); for(i=0;i<Ly;i++) for(j=0;j<Lx;j++){	fputc((*this)(j,i).r(),file);	fputc((*this)(j,i).g(),file);	fputc((*this)(j,i).b(),file); }}void wzElevationMap::save(wzString fname) const{int i,j; wzColor c; FILE* file = fopen(fname,"w"); if(file==NULL){ throw wzFileOpenError();} fprintf(file,"P6\n"); fprintf(file,"# created by WZ 1.0\n"); fprintf(file,"%d %d\n",Lx,Ly); fprintf(file,"255\n"); for(i=0;i<Ly;i++) for(j=0;j<Lx;j++){	c.setElevation((*this)(j,i));	fputc(c.r(),file);	fputc(c.g(),file);	fputc(c.b(),file); }}void wzColorTablePixmap::save(wzString fname) const{int i,j; FILE* file = fopen(fname,"w"); if(file==NULL){ throw wzFileOpenError();} fprintf(file,"P6\n"); fprintf(file,"# created by WZ 1.0\n"); fprintf(file,"%d %d\n",Lx,Ly); fprintf(file,"255\n"); for(i=0;i<Ly;i++) for(j=0;j<Lx;j++){	int ind = (*this)(j,i);	fputc(color(ind).r(),file);	fputc(color(ind).g(),file);	fputc(color(ind).b(),file); }}static int getnumber(FILE *file){wzByte cc; int n;beg: cc = fgetc(file); if(feof(file)) return -2; if(cc=='#'){	do{		cc=fgetc(file); 		if(feof(file)) return -2;	}while((cc != '\n'));	goto beg;  } if((cc==' ')||(cc=='\t')||(cc=='\n')) goto beg; n = 0; do{	if((cc<'0')||(cc>'9')){		if((cc==' ')||(cc=='\t')||(cc=='\n')) return n;		return -1;	}	n *= 10; n += cc-'0';	cc = fgetc(file);	if(feof(file)) return n; }while(n<100000); return n;	}wzTrueColorPixmap::wzTrueColorPixmap(wzString fname){int l,c0,cf,i,j,k,c1,n,col,fac,edges,rest,ci,r,g,b; wzByte *cc; FILE* file = fopen(fname,"r"); if(file==NULL){ throw wzFileOpenError();} c0 = fgetc(file); cf = fgetc(file); if((c0 != 'P')||(cf < '1') || (cf > '6')){	throw wzFileReadError(); } if((Lx=getnumber(file)) < 0) goto error; if((Ly=getnumber(file)) < 0) goto error; c(l=Lx*Ly); switch(cf){ case '1':	for(i=0;i<l;i++){		n = getnumber(file);		if(n>0){			      	c[i].set();		}else if(n==0){			      	c[i].set(255);		}else{			goto error;		}	}	break; case '2':	col = getnumber(file);	if(col>255) goto error;	if(col<255){		fac = (256/(col+1));		for(i=0;i<l;i++){			n = getnumber(file);			if(n>=0){			       	c[i].set(n*fac);			}else{				goto error;			}		}	}else{		for(i=0;i<l;i++){			n = getnumber(file);			if(n>=0){			       	c[i].set(n);			}else{				goto error;			}		}	}	break; case '3':	col = getnumber(file);	if(col>255){ goto error;	}else if(col<255){fac = (256/(col+1));		for(i=0;i<l;i++){			r=getnumber(file); if(r<0||r>col) goto error;			g=getnumber(file); if(g<0||g>col) goto error;			b=getnumber(file); if(b<0||b>col) goto error;			c[i].set(r*fac,g*fac,b*fac);		}	}else{		for(i=0;i<l;i++){			r=getnumber(file); if(r<0||r>col) goto error;			g=getnumber(file); if(g<0||g>col) goto error;			b=getnumber(file); if(b<0||b>col) goto error;			c[i].set(r,g,b);		}	}	break; case '4':	edges = l/8;	rest  = l%8; ci = 0;	cc = (wzByte*)malloc(edges+2);	fread(cc,1,edges+1,file);	for(i=0;i<edges;i++){	       	c1 = cc[i]; k=128;	 	for(j=0;j<8;j++){			if(c1 & k ){			      	c[ci].set();			}else{			      	c[ci].set(255);			}			ci++; k /= 2;		}	} 	for(j=0;j<rest;j++){			if(c1 & k ){			      	c[ci].set();			}else{			      	c[ci].set(255);			}			ci++; k *= 2;	}	free(cc);	break; case '5':	cc = (wzByte*)malloc(l+2);	col = getnumber(file);	if(col > 255) goto error;	if(col < 255){fac = 256 / (col+1);		fread(cc,1,3*l,file);	      	for(i=0;i<l;i++){			c[i].set(cc[i]*fac);		}	}else{		fread(cc,1,3*l,file);	      	for(i=0;i<l;i++){			c[i].set(cc[i]);		}	}	free(cc);	break; case '6':	col = getnumber(file);	cc = (wzByte*)malloc(3*(l+2));	if(col > 255) goto error;	fread(cc,1,3*l,file);	j=0;	if(col < 255){fac = 256 / (col+1);	      	for(i=0;i<l;i++){wzByte r,g,b;			r=cc[j++];g=cc[j++];b=cc[j++];			c[i].set(r*fac,g*fac,b*fac);		}	}else{	      	for(i=0;i<l;i++){wzByte r,g,b;			r=cc[j++];g=cc[j++];b=cc[j++];			c[i].set(r,g,b);		}	}	free(cc);	break; } fclose(file); return;error: fclose(file); {throw wzFileReadError();}}wzColorTablePixmap::wzColorTablePixmap(wzString fname, int max){wzTrueColorPixmap pp(fname); getTrueColorPixmap(pp,max);}wzColorTablePixmap::wzColorTablePixmap(const wzTrueColorPixmap& tmap, int max){ getTrueColorPixmap(tmap,max);}void wzColorTablePixmap::getTrueColorPixmap(			const wzTrueColorPixmap& tmap, int max){int f[3],ff,i,j; wzByte t,to,newt,last,rr,gg,bb; Lx=tmap.lx(); Ly=tmap.ly(); if(max>255||max<=0) max=255;	// greater values not allowed by wzByte-type. if(max==1) max=2; map(Lx*Ly); f[0] = f[1] = f[2] = 1; ff = 1;       start: last = 255; newt=1; for(i=Lx-1;i>=0;i--){	for(j=0;j<Ly;j++){		rr = tmap(i,j).r()/f[0];		gg = tmap(i,j).g()/f[1];		bb = tmap(i,j).b()/f[2];		t = last;		while(t<255){			if(rr != C[t].r()) {t = P[to=t]; continue;}			if(gg != C[t].g()) {t = P[to=t]; continue;}			if(bb != C[t].b()) {t = P[to=t]; continue;}			break;		}		if(t==255){			t = newt;  newt++;			if(newt> max){	 			ff++; ff %= 3; f[ff] *= 2; goto start;			}			C[t].set(rr,gg,bb);		 	P[t] = last; last = t;		}else if(t != last){			P[to] = P[t];		 	P[t] = last; last = t;		}		(*this)(i,j) = t;	} } Lc = newt-1; for(t=1;t<=Lc;t++){	rr = (C[t].r()*f[0]);	gg = (C[t].g()*f[1]);	bb = (C[t].b()*f[2]);	C[t].set(rr,gg,bb); } return;}int wzColorTablePixmap::print() const{  wzOutput::Default.operator()("Pixmap [<>,<>] with <> colors\n")<< lx(),ly(),colors();  for(int i=1;i<=Lc;i++){    wzOutput::Default.operator()("<>: <>\n")<<i,color(i);  }  return 0;}void	wzColorTablePixmap::fitColorList(wzIndex length,wzColor* col,int* reg){int inew[wzColorTableLength]; int i,j,lc,cc,cd; for(i=1;i<=Lc;i++){	cc=3*256*256+1; inew[i]=0;	for(j=1;j<=length;j++){		const wzColor& ci=color(i),cj=col[j];		int cr = (int) ci.r() - (int) cj.r();		int cb = (int) ci.b() - (int) cj.b();		int cg = (int) ci.g() - (int) cj.g();		cd = cr*cr+cb*cb+cg*cg;		if(cd<cc){ cc=cd; inew[i]=j;}	} } lc=0;					// find the maximal index; for(i=1;i<=length;i++){	if(reg[i]>255) reg[i]=0;	if(lc<reg[i]) lc=reg[i]; } for(i=0;i<=lc;i++){			// initializing color with default;	C[i] = col[0]; } for(i=1;i<=length;i++){		// setting the colors;	C[reg[i]] = col[i]; } for(i=1;i<=Lc;i++){			// resetting the indices;	inew[i] = reg[inew[i]]; } Lc = lc; for(i=Lx-1;i>=0;i--){	for(j=0;j<Ly;j++){		(*this)(i,j) = inew[(*this)(i,j)];	} }}wzElevationMap::wzElevationMap(const wzTrueColorPixmap& tmap){ getTrueColorPixmap(tmap);}wzElevationMap::wzElevationMap(int lx, int ly){ Lx=lx; Ly=ly; map(Lx*Ly);}wzElevationMap::wzElevationMap(wzString fname){wzTrueColorPixmap pp(fname); getTrueColorPixmap(pp);}void wzElevationMap::getTrueColorPixmap(			const wzTrueColorPixmap& tmap){int i,j; Lx=tmap.lx(); Ly=tmap.ly(); map(Lx*Ly); for(i=Lx-1;i>=0;i--){	for(j=0;j<Ly;j++){		tmap(i,j).getElevation((*this)(i,j));	} }}

⌨️ 快捷键说明

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