/*include 文 件 */
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <dos.h>
#include <io.h>
#include <string.h>
#include <alloc.h>
#include <math.h>
#include <graphics.h>
#include <chen0.h>
#include <chen1.h>
void interrupt handler()
{
disable();
prn5();
enable();
}
/*主 程 序:*/
main()
{
unsigned int a,x,y,num; /* 初 始 化 */
char fname[20];
int gdriver = PC98, gmode=PC98C8;
if( registerfarbgidriver(PC98_driver)<0 ){
puts("ERROR ");
exit(1);
}
initgraph(&gdriver,&gmode,"");
buf3 =(char *)farmalloc( (unsigned long)0x10008 );
buf2 =(char *)farmalloc( (unsigned long)0x10008 );
buf1 =(char *)farmalloc( (unsigned long)0x10008 );
buf4 =(char *)farmalloc( (unsigned long)0x10008 );
buf6 =(char *)farmalloc( (unsigned long)0x10008 );
buf =(char *)malloc( (unsigned int)0x0a00 );
/*printf("main=%lu",(unsigned long) coreleft());*/
if( (buf==NULL) || (buf1==NULL) || (buf2==NULL) ||(buf3==NULL)){
printf("領域が確保できません\n");
exit(-1);
}
if (buf4==NULL){
printf("buf4:領域が確保できません\n");
exit(-1);
}
if (buf6==NULL){
printf("buf6:領域が確保できません\n");
exit(-1);
}
/* offset to zero オフセットアドレスを0にする*/
buf1=(unsigned long)(FP_SEG(buf1)+1)*(unsigned long)0x10000;
buf2=(unsigned long)(FP_SEG(buf2)+1)*(unsigned long)0x10000;
buf3=(unsigned long)(FP_SEG(buf3)+1)*(unsigned long)0x10000;
buf4=(unsigned long)(FP_SEG(buf4)+1)*(unsigned long)0x10000;
buf6=(unsigned long)(FP_SEG(buf6)+1)*(unsigned long)0x10000;
setvect(5,handler);
enable();
hname="CT Oparator";
fn=" V 1.0";
g_cls(); /* SCREEN 設定 */
page(0);
w_page(1);
menu_draw();
w_page(0);
menu_draw();
menu1();
while(1){ /* 主 循 環 */
a=fn_get(fname); /* read data name */
fn=fname; /*パラメータ*/
if (a == 1){
view_cls();
f_read(fname); /* read data */
hname=buf+1064;
*(hname+18)=0; /* enter hname 18 character */
/*delete noise*/
w_page(1);
view_cls();
mdd1((int)FP_SEG(buf6),(int)FP_OFF(buf6),0); /*原始小図像*/
for(y=200;y>0 && getpixel(LX+256,y)!=4;y--);
y-=2;
setfillstyle(SOLID_FILL,RED);
floodfill(LX+256,y+10,4); /* 求保留区域 */
setfillstyle(SOLID_FILL,WHITE);
floodfill(LX+256,y,1);
load1((int)FP_SEG(buf6),(int)FP_OFF(buf6)); /* 変換保存区域 */
view_cls();
w_page(0);
}
if (a == 0) break;
w_page(1); /* SCREEN 設 定 */
menu_draw();
mddata((int)FP_SEG(buf1),(int)FP_OFF(buf1),l_no);
w_page(0);
view_cls();
menu_draw();
page(0);
data_0=data_1=data_2=0;
while (program()<0){ /* 測量 */
w_page(0);
if(m==0)
mddata((int)FP_SEG(buf6),(int)FP_OFF(buf6),l_no);
else
mddata((int)FP_SEG(buf4),(int)FP_OFF(buf4),l_no);
page(0);
menu1();
function3(&num,7,m,0,46,32); /* 菜 単 選 択 */
if(num==3&&m_switch(&x,&y)==1)disp();
if(num==3&&m_switch(&x,&y)==2)disphist();
if(num==4)print();
if(num==5)hdisp();
while (num==1||num==3||num==4||num==5){
if(num==1){
if (m_switch(&x,&y)==1){
l_no+=2560; /* up display */
if(l_no>14336)l_no=14336;
}
if (m_switch(&x,&y)==2){
l_no-=2560; /* down display */
if(l_no<0) l_no=0;
}
/* 顕示選択 */
if(m==0)
mddata((int)FP_SEG(buf6),(int)FP_OFF(buf6),l_no);
else
mddata((int)FP_SEG(buf4),(int)FP_OFF(buf4),l_no);
}
menu1();
function3(&num,7,m,0,46,32); /* 菜 単 選 択 */
if(num==3&&m_switch(&x,&y)==1)disp();
if(num==3&&m_switch(&x,&y)==2)disphist();
if(num==4)print();
if(num==5)hdisp();
}
if(num==2){
w_page(1);
menu_draw();
w_page(0);
menu_draw();
}
else break;
}
if(num==6)break;
if (m_switch(&x,&y)==2)drvset();
while(m_switch(&x,&y)!=0);
}
g_cls();
closegraph();
}
hdisp()
{
int x,y;
if (m_switch(&x,&y)==1)name();
else hist();
}
hist()
{
int xa,ya,xb,yb,i,j,x,y,box;
double sp,q,r;
char far *p=(char *)malloc(10);
if(m==0)
mddata((int)FP_SEG(buf6),(int)FP_OFF(buf6),l_no);
else
mddata((int)FP_SEG(buf4),(int)FP_OFF(buf4),l_no);
while(box_sel(&xa,&ya,&xb,&yb)==-1);
setfillstyle(SOLID_FILL,BLACK);
bar(LX,0,xa-1,399);
bar(xb+1,0,519,399);
bar(LX,0,519,ya-1);
bar(LX,yb+1,519,399);
waku(xa,ya,xb,yb);
for (i=0;i<=255;i+=1) dot[i]=0;
for (i=xa-LX;i<=xb-LX;i+=2){ /* 統計 */
for (y=ya;y<=yb;y+=2){
if(m==0) j=*(buf6+y*128+i/2+l_no);
else j=*(buf4+y*128+i/2+l_no);
dot[j]+=1;
}
}
box=0; /* 直方図顕示高度変換 */
for(i=2;i<=253;i++)
box=(box>dot[i])?box:dot[i];
if(box==0)box+=1;
for(i=0;i<=255;i++)
dot[i]=(int)((float)dot[i]/(float)box*360);
setcolor(GREEN);
setwritemode(XOR_PUT);
for(i=0;i<=255;i++){
line(i*2+8,390-dot[i],i*2+8,390);
line(i*2+9,390-dot[i],i*2+9,390);
if(i-i/8*8==0){
setcolor(RED);
line(i*2+8,390,i*2+8,395);
line(i*2+9,390,i*2+9,395);
setcolor(GREEN);
}
}
setcolor(WHITE);
line(8,30,519,30);
line(8,120,519,120);
line(8,210,519,210);
line(8,300,519,300);
setcolor(YELLOW);
moveto(LX+4,16);
itoa((int)box,(char *)p,10);
outtext(p);
moveto(LX+4,106);
itoa((int)box*3/4,(char *)p,10);
outtext(p);
moveto(LX+4,196);
itoa((int)box/2,(char *)p,10);
outtext(p);
moveto(LX+4,286);
itoa((int)box/4,(char *)p,10);
outtext(p);
setcolor(WHITE);
moveto(LX+4,2);
outtext("総ドット数:");
moveto(LX+104,2);
ltoa((long)((yb-ya+2)/2)*((xb-xa+2)/2),(char *)p,10);
outtext(p);
sp=q=r=0;
for(y=ya/2;y<=yb/2;y++){
for(x=(xa-LX)/2;x<=(xb-LX)/2;x++){
if(m==0){
sp++;
q+=*(buf6+y*256+x+l_no);
r+=(double)(*(buf6+y*256+x+l_no))*(*(buf6+y*256+x+l_no));
}
else{
sp++;
q+=*(buf4+y*256+x+l_no);
r+=(double)(*(buf4+y*256+x+l_no))*(*(buf4+y*256+x+l_no));
}
}
}
q=q/sp;
r=sqrt((double)(r/sp-q*q));
moveto(LX+264,2);
outtext("均値:");
moveto(LX+320,2);
itoa((int)q,(char *)p,10);
outtext(p);
moveto(LX+364,2);
outtext("標準差:");
moveto(LX+432,2);
ltoa((long)r,(char *)p,10);
outtext(p);
while(m_switch(&x,&y)==0);
while(m_switch(&x,&y)!=0);
setwritemode(COPY_PUT);
if(m==0)
mddata((int)FP_SEG(buf6),(int)FP_OFF(buf6),l_no);
else
mddata((int)FP_SEG(buf4),(int)FP_OFF(buf4),l_no);
free(p);
return;
}
disphist()
{
int x,y,a,b,box,i;
char far *p=(char *)malloc(10);
double c;
mddata((int)FP_SEG(buf4),(int)FP_OFF(buf4),l_no);
test1();
page(1);
view_cls();
menu_draw();
while(m_switch(&a,&b)!=0);
a=(a-LX)/2;
b=b/2+l_no/256;
if(abs(b-(y1+y2)/2)>abs(a-(x1+x2)/2)){
for(y=b;y!=(y1+y2)/2;y+=(y>(y1+y2)/2)?-1:1){
dot[abs(y-b)]=*(buf4+y*256
+(a-(x1+x2)/2)*abs((y1+y2)/2-y)/abs(b-(y1+y2)/2)+(x1+x2)/2);
}
a=abs(b-(y1+y2)/2)-1;
}
else {
for(x=a;x!=(x1+x2)/2;x+=(x>(x1+x2)/2)?-1:1){
dot[abs(x-a)]=*(buf4+x+256*
((y1+y2)/2+(b-(y1+y2)/2)*abs(x-(x1+x2)/2)/abs((x1+x2)/2-a)));
}
a=abs(a-(x1+x2)/2)-1;
}
if(a>25){
for(i=0;i<=a && dot[i]<160;i++);
for(i=i;i<=a && dot[i]>90;i++);
if(i>a*2/3)i=0;
x=i;
for (i=0;i<=255;i+=1) dot[i+256]=0;
for (i=0;i<=255;i+=1) dot[i+512]=0;
for (i=0;i<=255;i+=1) dot[i+768]=0;
for (i=x;i<x+15&&i<=a;i++){ /* 統計 */
dot[256+dot[i]]+=1;
}
for (i=x+15;i<x+25&&i<=a;i++){ /* 統計 */
dot[512+dot[i]]+=1;
}
for (i=x;i<x+25&&i<=a;i++){ /* 統計 */
dot[768+dot[i]]+=1;
}
box=0; /* 直方図顕示高度変換 */
for(i=0;i<=255;i++)
box=(box>dot[i+768])?box:dot[i+768];
if(box==0)box+=1;
for(i=0;i<=255;i++){
dot[i+256]=(int)((float)dot[i+256]/(float)box*110);
dot[i+51