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

📄 wzpixmap.cxx

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 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 + -