📄 ang1.c
字号:
else if (y2 > 255.0) {
y2 = linex[i];
y_fac = 1;
}
else if (fabs(y2 - y1) > GRAD_THRESHOLD) {
if (fabs(linex[i] - y1) < GRAD_THRESHOLD/2. && y2 < linex[i]) {
y2 = linex[i];
y_fac = 1;
}
else if ((y2 - linex[i]) < GRAD_THRESHOLD/2. && y1 > linex[i]) {
y1 = linex[i];
y_fac = 1;
}
}
if (z1 > 255.0) {
z1 = linex[i];
z_fac = 1;
}
else if (z2 > 255.0) {
z2 = linex[i];
z_fac = 1;
}
else if (fabs(z2 - z1) > GRAD_THRESHOLD) {
if (fabs(linex[i] - z1) < GRAD_THRESHOLD/2. && z2 < linex[i]) {
z2 = linex[i];
z_fac = 1;
}
else if (fabs(z2 - linex[i]) < GRAD_THRESHOLD/2. && z1 < linex[i]) {
z1 = linex[i];
z_fac = 1;
}
}
lineg[i] = grad(x1, x2, y1, y2, z1, z2, x_fac, y_fac, z_fac);
if (dispmode & 8) {
/* combine with distance */
lineg[i] = (float) lineg[i] * (1.0 - dist_weight) +
(255.0-linex[i]) * dist_weight;
}
}
}
if (linex[255] > 255.0)
lineg[255] = lined[255] = 0;
else {
if (dispmode & 1)
lined[255] = 255.5 - linex[255];
if (dispmode & 2) {
lineg[255] = grad(0.0, 2.0, linex[254], linex[255], linex1[255], linex2[255],
1, 2, z_fac);
if (dispmode & 8) {
lineg[i] = (float) lineg[255] * (1.0 - dist_weight) +
(255.0-linex[255]) * dist_weight;
}
}
}
if (fg != NULL) fwrite(lineg,sizeof(unsigned char),256,fg);
if (fd != NULL) fwrite(lined,sizeof(unsigned char),256,fd);
}
doviews()
{
FILE *fg,*fd,*fx,*fy;
int z,i,j,k,mid;
mid=1;
fd = fg = NULL;
if(dispmode & 1) {
if ((fd=fopen(fnd,"wb")) == NULL) {
printf("Error opening %s\n", fnd);
exit(1);
}
printf("Created %s\n", fnd);
}
if (dispmode & 2) {
if ((fg=fopen(fng,"wb")) == NULL) {
printf("Error opening %s\n", fng);
exit(1);
}
printf("Created %s\n", fng);
}
if ((fx=fopen(xfile,"rb")) == NULL || (fy=fopen(yfile,"rb")) == NULL) {
printf("Error opening %s or %s\n", xfile, yfile);
exit(1);
}
/*read first three lines */
for(i=0;i<3;i++){
fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
fread(fxbuf[i],1,FLOAT_LINE,fx);
fseek(fy,(long)FLOAT_LINE*i,SEEK_SET);
fread(fybuf[i],1,FLOAT_LINE,fy);
}
/* do first line (forward differene)*/
getdistances(fxbuf[0],fybuf[0]);
doline(fxbuf[0],fxbuf[0],fxbuf[1],fybuf[0],fybuf[0],fybuf[1],1,fg,fd);
/* do middle lines (central diffrence) */
for(z=0;z<(NLINES-2);z++){ /*for each slice */
getdistances(fxbuf[mid],fybuf[mid]);
doline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[succ(mid)],
fybuf[mid],fybuf[prev(mid)],fybuf[succ(mid)],2,fg,fd);
fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
fseek(fy,(long)FLOAT_LINE*i,SEEK_SET);
i++;
fread(fxbuf[prev(mid)],1,FLOAT_LINE,fx);
fread(fybuf[prev(mid)],1,FLOAT_LINE,fy);
mid=succ(mid);
printf(" line %d\r", z+2);
}
printf("\n");
/* do last line (backward difference)*/
getdistances(fxbuf[mid],fybuf[mid]);
doline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[prev(mid)],
fybuf[mid],fybuf[prev(mid)],fybuf[prev(mid)],1,fg,fd);
if (fg != NULL) fclose(fg);
if (fd != NULL) fclose(fd);
fclose(fx);
fclose(fy);
}
dostrview()
{
FILE *fg,*fd,*fx;
int z,i,j,k,mid;
mid=1;
fd = fg = NULL;
if(dispmode & 1) {
if ((fd=fopen(fnd,"wb")) == NULL) {
printf("Error opening %s\n", fnd);
exit(1);
}
printf("Created %s\n", fnd);
}
if (dispmode & 2) {
if ((fg=fopen(fng,"wb")) == NULL) {
printf("Error opening %s\n", fng);
exit(1);
}
printf("Created %s\n", fng);
}
if ((fx=fopen(xfile,"rb")) == NULL) {
printf("Error opening %s\n", xfile);
exit(1);
}
/*read first three lines */
for(i=0;i<3;i++) {
fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
fread(fxbuf[i],1,FLOAT_LINE,fx);
}
/* do first line (forward differene)*/
dostrline(fxbuf[0], fxbuf[0], fxbuf[1], 1, fg, fd);
/* do middle lines (central diffrence) */
for(z=0;z<(NLINES-2);z++){ /*for each slice */
dostrline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[succ(mid)],2,fg,fd);
fseek(fx,(long)FLOAT_LINE*i,SEEK_SET);
i++;
fread(fxbuf[prev(mid)],1,FLOAT_LINE,fx);
mid=succ(mid);
printf(" line %d\r",z+2);
}
printf("\n");
/* do last line (backward difference)*/
dostrline(fxbuf[mid],fxbuf[prev(mid)],fxbuf[prev(mid)],
1,fg,fd);
if (fg != NULL) fclose(fg);
if (fd != NULL) fclose(fd);
fclose(fx);
}
getang(ang)
int ang;
{
sprintf(fng,"gang%03d.out",ang);
sprintf(fnd,"dang%03d.out",ang);
if( ( ang > 0) && ( ang < 90) ){
xdir=forward;
ydir=backward;
sprintf(xfile,"%c:ydis2.dat",DR);
sprintf(yfile,"%c:xdis1.dat",DR);
xinc=1;
yinc=-1;
}
else if( ( ang > 90) && ( ang < 180) ){
xdir=forward;
ydir=backward;
sprintf(xfile,"%c:xdis1.dat",DR);
sprintf(yfile,"%c:ydis1.dat",DR);
xinc=1;
yinc=-1;
ang-=90;
}
else if( ( ang > 180) && ( ang < 270) ){
xdir=forward;
ydir=backward;
sprintf(xfile,"%c:ydis1.dat",DR);
sprintf(yfile,"%c:xdis2.dat",DR);
xinc=1;
yinc=-1;
ang-=180;
}
else if( ( ang > 270) && ( ang < 360) ){
xdir=forward;
ydir=backward;
sprintf(xfile,"%c:xdis2.dat",DR);
sprintf(yfile,"%c:ydis2.dat",DR);
xinc=1;
yinc=-1;
ang-=270;
}
else if (ang == 0) {
xdir=forward;
sprintf(xfile,"%c:ydis2.dat",DR);
xinc=1;
cosTheta = 1.0;
sinTheta = 0.0;
return(0);
}
else if (ang == 90) {
xdir=forward;
sprintf(xfile,"%c:xdis1.dat",DR);
xinc=1;
cosTheta = 1.0;
sinTheta = 0.0;
return(0);
}
else if (ang == 180) {
xdir=forward;
sprintf(xfile,"%c:ydis1.dat",DR);
xinc=1;
cosTheta = 1.0;
sinTheta = 0.0;
return(0);
}
else if (ang == 270) {
xdir=forward;
sprintf(xfile,"%c:xdis2.dat",DR);
xinc=1;
cosTheta = 1.0;
sinTheta = 0.0;
return(0);
}
else {
printf(" Bad angle\n");
exit(1);
}
IXmax = 127.5 * (1.0 + sqrt(2.0) * sin(((double) ang - 45.0) * PI / 180.0));
THETA=(double)ang * PI/180;
sinTheta=sin(THETA);
cosTheta=cos(THETA);
tgnTheta=sinTheta/cosTheta;
}
/**********************************************************/
/**** MAIN ***** MAIN ***** MAIN ***** MAIN ***** MAIN ****/
/**********************************************************/
/* Command line input:
ang [-a] [-r] [-g] [-n(d|g)] [-h] [-d]
-a : angle (no default)
-r : number of output images (default: 1)
-g : threshold for gradient (default: 3.0)
-n : not making distance (d) or gradient (g) image
-h : filling holes
-d : weight for distance combined with the gradient
*/
main(argc, argv)
int argc;
char *argv[];
{
char filname[13];
FILE *par;
int ANG;
int i;
/* first get some parameters */
if ((par=fopen("param.dat","r")) == NULL) {
printf("Error opening PARAM.DAT\n");
exit(1);
}
fscanf(par,"%c %d",&DR,&NLINES);
fclose(par);
if (argc != 1) {
for (argc--; argc > 0; argc--) {
if (**++argv == '-' || **argv == '/') {
switch (tolower(*(*argv+1))) {
case 'a':
ANG = atoi(*argv+2);
break;
case 'r':
number_pic = atoi(*argv+2);
break;
case 'g':
GRAD_THRESHOLD = atof(*argv+2);
break;
case 'd':
dispmode |= 8;
if (*(*argv+2) != '\0')
if ((dist_weight = atof(*argv+2)) < 0.0 || dist_weight > 1.0)
dist_weight = 0.5;
break;
case 'n':
switch (tolower(*(*argv+2))) {
case 'd':
dispmode &= 0xfe;
break;
case 'g':
dispmode &= 0xfd;
break;
default:
usage();
}
break;
case 'h':
dispmode |= 4;
break;
default:
usage();
}
}
else
usage();
}
}
else {
printf("Enter angle: ");
scanf("%d", &ANG);
if (ANG != 0) {
printf("Enter number of rotations: ");
scanf("%d", number_pic);
}
}
if (number_pic <= 0) {
printf("number_pic should be larger than 0!\n");
exit(1);
}
if (GRAD_THRESHOLD <= 1.0) {
printf("Gradient threshold should be larger than 1.0!\n");
exit(1);
}
while (ANG < 0) ANG = 360 - ANG;
if (ANG == 0 && number_pic > 1) number_pic = 1;
for (i = 1; i <= number_pic; i++) {
getang(ANG*i % 360);
if (ANG*i % 90 != 0)
doviews();
else
dostrview((ANG % 360) / 90);
}
}
usage()
{
printf("%s\n", usestr);
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -