生物材料の観察に適した原子間力顕微鏡の開発
著者 安藤 敏夫
著者別表示 Ando Toshio
雑誌名 平成5(1993)年度 科学研究費補助金 一般研究(B) 研究成果報告書
巻 1991‑1993
ページ 63p.
発行年 1995‑01‑01
URL http://hdl.handle.net/2297/46866
Creative Commons : 表示 ‑ 非営利 ‑ 改変禁止 http://creativecommons.org/licenses/by‑nc‑nd/3.0/deed.ja
lIll・1
付 録 B
スファイル)
(プログラムソ−
:
!
1
付録Bプログラムソースフアイル
B.1MenuProgramFiles
B.2HeaderProgramFiles B・SSensorProgralnFiles
B.4MotorPrOgramFiles B.5ScanProgramFiles B.611nageProgramFiles B.7EditProgramFiles B.8CommonProgramFiles
1
プログラムファイル
(B。1 M e n u PrOgramFiles)
』
i
}
if(!̲̲̲DiamondKey){
.KeyChange=1;
̲̲̲pushskey();
}
intgetftime(char*fname,unsigned*date,unsigned*time)
{
FILE*fp;
inthd;
}
if((fp=fopen(fname,''r''))==NULL) return(1);
hd=fileno(fp);
̲dos̲getftime(hd,date,time);
fcIose(fp);
return(O);
intsetftime(char*fname,unsigneddate,unsignedtime)
{
}
FILE*fp;
inthd;
if((fp=fopen(fname,''a''))=NULL) return(1);
hd=fileno(fp);
dos̲setftime(hd,date,time);
fclose(fp);
return(O);
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑.‑‑‑‑‑.‑‑‑.‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑.‑‑‑‑.‑‑‑‑‑+
{
}
関 数 名 引 数
返 値 コ メ ン ト
DIR int
intget̲file̲name(char*file̲path,char*name,char*slct̲name)
char char char
*file̲path:検索するファイルのパス
*name: 検索するファイルの名前(ワイルドカード)
*slctname:選択されたファイルのフルパス名 選 択 し た フ ァ イ ル の 数 何 も 選 択 し な か っ た 場 合 O
引数で指定されたパスから、ファイルを選択する。
buf[1];
flag;
strcat(file̲path,''*.*");
flag=dir̲select(buf,file̲path,name,slct̲name,1,0,
POPUP1̲X1,4,POPUP1̲Yl,POPUPl̲Y2);
strcat(sIct̲name,buf[O].name);
return(flag);
関 数 名 引数
FILE*open̲file(FILE**f̲ptr,char*search̲path,char*wild̲name) オープンするファイルを示すポインタ
検 索 す る フ ァ イ ル の パ ス
検索するファイルの名前(ワイルFカード)
FILE char char
**f̲ptr:
*search̲path:
*wildname:
返 値 コ メ ン ト
オーフ。ンしたファイルのポインタ何も選択しなかった場合NULL 引 数 で 指 定 さ れ た パ ス か ら 、 引 数 で 指 定 さ れ た 名 前 の フ ァ イ ル (ワイルドカードを含む)をオープンする。
+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一*/
FILE*open̲file(FILE**f̲ptr,char*fname)
{
if(getftime(fname,&fdate,&ftime)==1){
/*ファイルをオープンできない*/
charmsg[200];
strcpy(msg,fname);
strcat(msg,''¥nがオープンできません¥n'');
errer̲msg(msg);
putchar('¥a');
return(NULL);
}
*f̲ptr=fopen(fname,''r+b");
return(*f̲ptr);
}
関数名FILE*open̲temp̲file(FILE*fp,char*prmfile̲name,intpart)
引 数 フ ァ イ ル ポ イ ン タ ー
A F M の パ ラ メ ー タ フ ァ イ ル 名 パ ラ メ ー タ フ ァ イ ル 内 の パ ー ト FILE*fp:
char*prmfile̲name:
intpart:
選 択 し た フ ァ イ ル を 指 す フ ァ イ ル ポ イ ン タ ー NULL:何も選択しなかった、エラー
返 値
ス キ ャ ン の デ ー タ フ ァ イ ル を パ ラ メ ー タ フ ァ イ ル で 指 定 さ れ た 、 パスから選択すし、指定された名前でラムディスクにコピーし、
そのファイルをオープンし、ファイルポインタを返す。
コ メ ン ト
γノ*
一︑ノ8t一r一a一p
−0t−Ⅱ一・一︐一e一Ⅷ一a一︑一一一e−l−・一ハーー肌一r・︐一pe−*肌
a一rn−a一︲Ⅱe一Cl一︐.l一pか1.1−ハー*︲t一*︐l可﹄u一両姑︵US一−︺4△e−T1rLr一両I1J︐一/1︿0肌一eqUr−lrLp一・1r一一ハーef4−一︲tO一pe一一ⅢⅢr一eae一︲Ir︲0−一aⅢ一npu
一e︑
一pr−0a→し一*hnC・一P︺一vL−I+nrfi
number̲of̲prm=read̲prm̲file(prmfile̲name,parameter,part);
get̲file̲name(parameter[O+number̲of̲prm],''*.d*'',file̲name);
/*スキャンデータファイルのデフォルトの拡張子*.dat*/
result=̲spawnl(̲P̲WAIT,''a:¥¥afm¥¥afm̲menu¥¥image¥¥movefile・bat",
"a:¥¥afm¥¥afm̲menu¥¥image¥¥movefile.bat'',
}
file̲name,parameter[9+number̲of̲prm], parameter[10+number̲of̲prm],NULL);
/*ラムデイスクにファイルをコピーするバッチファイルを立ち上げる*/
strcat(parameter[9+number̲of̲prm],parameter[10+number̲of̲prm]);
if((fp=fopen(parameter[9+number̲of̲prm],''rb"))=NULL){
/*テンポラリーファイルをオープンできない*/
charmsg[200];
strcpy(msg,parameter[9+number̲of̲prm]);
strcat(msg,''¥nがオーフ。ンできません¥n'');
errer̲msg(msg);
putchar('¥a');
return(NULL);
}
return(fp);
関 数 名 引 数
コ メ ン ト
voiddel̲temp(char*prmfile̲name,intpart) char*prmfile̲name:AFMのパラメータファイル名
i n t p a r t : パ ラ メ ー タ フ ァ イ ル 内 の パ ー ト パ ラ メ ー タ フ ァ イ ル で 指 定 さ れ た 名 前 の ラ ム デ ィ ス ク を 消 去 す る バ ッ チ フ ァ イ ル を 起 動 す る 。
+‑‑‑‑一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一*/
voiddel̲temp(char*prmfile̲name,intpart)
{
charparameter[30][40];
intnumber̲of̲prm,result;
number̲of̲prm=read̲prm̲file(prmfile̲name,parameter,part);
strcat(parameter[9+number̲of̲prm],parameter[10+number̲of̲prm]);
result=̲spawnl(̲P̲WAIT,''a:¥¥afm¥¥afm̲menu¥¥image¥¥del̲temp.bat", ''a:¥¥afm¥¥afm̲menu¥¥image¥¥del̲temp.bat",
parameter[9+number̲of̲prm],NULL);
/ * テ ン ポ ラ リ フ ァ イ ル を 削 除 す る バ ッ チ フ ァ イ ル を 立 ち 上 げ る * /
} /*
+‑.‑‑‑‑..‑.‑.‑‑‑‑.‑‑.‑‑.‑.‑‑‑‑.‑.‑‑.‑‑.‑..‑‑‑‑‑‑.‑.‑.‑‑.‑.‑‑.‑‑.‑.一一・‑.‑.‑‑‑‑..‑.‑..‑‑.‑‑‑..‑.‑‑‑.‑.‑.‑..‑一一・・‑.‑‑‑.‑‑..‑.‑.‑..‑‑.‑‑‑..‑..‑‑.‑.+
終 わ り
+‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑.‑‑‑.‑.‑‑.‑‑‑.‑‑‑‑‑.‑‑‑.‑‑‑‑‑.‑‑‑‑‑‑‑‑.一一一一‑‑‑‑‑‑‑.−−‑一一・‑‑‑.‑‑.‑‑‑‑−一・一・一一‑‑‑.‑‑..‑‑‑‑‑.‑‑+
*/
+llllll+
しj
一ユ
︾ンモブサのE肌鮒一
・の一Uそ一
Nと一
一E義一
一C一M一帷一一●一一5−一睡一剛ウーー印一A一一一川一妬叩一
鮒剛一︐
朧A一h・
︐h
うぅclhhbb
環−︐..it一htyly尚ノ・reSeOCkbkユ一︒y士yryTYt−dbbbb一一一口↑Ⅱし●90凸●GIB●1Ⅱ凸●︒ⅡJSllll︐メ一くくくくくのMeeeeeF|ddddduuuuuA|lllll
︵0︶ハⅡ︶ハⅡ︶ハ︲︶︵日︶︽叩︵叩皿︑叩n叩一両叩出
塾︾︽.一一〃″″″●︒Ⅱ凸●aⅡ凸●■Ⅱ且OQ1A●00a
〃″″グ︲や00ⅡⅡ0.1日100IHI11110110−80000︸0.︾︽で叩や恥や叩刷や妙叩鈴川や叩叩寺叩守叩岬一m冬Ⅲ
#include''popup.h''
externinthorizonal̲select(int*,int,int,int,int,int,unsigned,unsigned);
+十
一一角ソーーユ一
一一一一一メー
*一〃ノ+十
*/
MenuDef(Help,''ヘルプ'') {8100,''1:バージョ
{8200, 2:項目別 MenuEnd;
/*−−ヘルプ−−*/
NULL}, NULL}, ン
'9
,
MenuDef(Kakutyou,''拡張機能'') {7100,''l:摩擦力'',NULL}, {7200,''2:力測定'',NULL}, MenuEnd;
/*−−拡張機能一一*/
MenuDef(Hensuu,"変数設定'')
{6100,''l: 参 照
{6200,''2: 変 更
{6300,''3:パラメータファイル"' MenuEnd;
/*−−変数設定−−*/
NULL}, NULL}, NULL},
/*−−終了‑‑*/
NULL}, NULL}, MenuDef(Syuuryou, 終了")
{2200, ''l:ウイズドロー D
{5200, 2 : ,終 了 MenuEnd;
/*−−色‑‑*/
NULL}, NULL}, MenuDef(Zahyou,''座標")
{4141,''l:広さ表示'',
{4142,''2:範囲表示", MenuEnd;
MenuDef(Houhou,"方法'')/*‑‑方法‑‑*/
{4110,"l:ワイヤーフレーム",NULL}, {4120,"2:クイックペイント'',NULL}, {4130,''3:シェーデイング'',NULL}, {4140,''4:トツプビユー '',Zahyou},
MenuEnd;
{2200, {2300, {2400, {2500, MenuEnd;
"2:ウイズドロー ,
"3:フォースカーブ",
" 4 : ジ ョ グ ,
" 5 : 一 時 退 瀞 ,
NULL}, NULL}, Jog}, NULL},
/*子メニューはジョグ(Jog)*/
MenuDef(Senser,''センサー'') {llOO,''l:センサー'',NULL},
/*−−センサー−−*/
MenuEnd;
+十十
一
一
一吟卜一一一一一コ一
一
一
*一一〃ノ*〃ノ+十*〃ノ
関数名 引 数
intparent̲menu̲sct(int*selected,intmenu̲max) 現 在 選 択 さ れ て い る メ ニ ュ ウ の 番 号 選 択 で き る メ ニ ュ ウ の 個 数
*selected:
menumax:
返 り 値 C R , E S C , D O W N
コ メ ン ト メ ニ ュ ウ バ ー を 表 示 し 、 選 択 す る 関 数 を 呼 ぶ 。
+‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑.‑‑‑‑‑‑‑.‑‑‑‑.‑‑一一一一一一一一一一一一一一一一一一・‑‑.‑‑*/
intparent̲menu̲sct(int*selected,intmenu̲max)
{
intimput̲key̲no;
disp(MENU̲Xl+MENU̲DX*O,MENU̲Y,MENU̲COLOR,''センサー");
disp(MENU̲Xl+MENU̲DX*l,MENU̲Y,MENU̲COLOR,''モーター'');
disp(MENU̲Xl+MENU̲DX*2,MENU̲Y,MENU̲COLOR,''スキャン'');
disp(MENU̲Xl+MENU̲DX*3,MENU̲Y,MENU̲COLOR,''画像'');
disp(MENU̲Xl+MENU̲DX*4,MENU̲Y,MENU̲COLOR,"終了");
disp(MENU̲Xl+MENU̲DX*5,MENU̲Y,MENU̲COLOR,''変数設定'');
disp(MENU̲Xl+MENU̲DX*6,MENU̲Y,MENU̲COLOR,''拡張機能'');
disp(MENU̲Xl+MENU̲DX*7,MENU̲Y,MENU̲COLOR,''ヘルプ'');
imput̲key̲no=horizonal̲select(selected,menu̲max,MENU̲Xl,MENU̲X2 MENU̲Y,MENU̲DX,MENU̲COLOR,MENU̲SELECT̲COLOR);
return(imput̲key̲no);
}
/*‑‑‑‑‑.‑‑‑‑‑‑‑‑‑.‑‑‑.‑‑‑‑‑‑‑一一一一一一一一一一一一一一一一一一一一一一・・‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑+
関 数 名 引 数
intselect̲from̲menu()
現 在 選 択 さ れ て い る メ ニ ュ ウ の 番 号 選 択 で き る メ ニ ュ ウ の 個 数
*selected:
menumax:一
返 り 値 コ メ ン ト
C R , E S C , D O W N
メ ニ ュ ウ バ ー を 表 示 し 、 選 択 す る 関 数 を 呼 ぶ 。
+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/
intselect̲from̲menu()
{
staticintparent̲menu=1;
intimput,menu̲number;
do{
imput=parent̲menu̲sct(&parent̲menu,MENU̲MAX);
if(imput==ESC) return(O);
while(1){/*リターンか、エスケープを押すまで抜けない*/
intx;
switch(parent̲menu){
casel:
imput=MenuSelect(Senser,&menu̲number,1,2);
break;
case2:
imput=MenuSelect(Motor,&menu̲number,5,2);
break;
case3:
imput=MenuSelect(Scan,&menu̲number,12,2);
break;
case4:
imput=MenuSelect(Gazou,&menu̲number,28,2);
break;
case5:
imput=MenuSelect(Syuuryou,&menu̲number,36,2);
break;
case6:
imput=MenuSelect(Hensuu,&menu̲number,43,2);
break;
case7:
imput=MenuSelect(Kakutyou,&menu̲number,59,2);
break;
case8:
imput=MenuSelect(Help,&menu̲number,65,2);
break;
}
/ * メ ニ ュ ウ を ポ ッ プ ア ッ プ し た 状 態 で 左 右 の カ ー ソ ル キ ー が 押された場合、親メニュウのNoを変えて、選択を示す反転表示を 隣に移す。*/
}
if(imput==LEFTllimput==RIGHT){
x=(parent̲menu‑l)*MENU̲DX;
color̲(MENU̲Xl+x,MENU̲Y,MENU̲X2+x,MENU̲Y,MENU̲COLOR);
if(imput==LEFT) parent̲menu‑‑;
else
parent̲menu++;
if(parent̲menu<lllparent̲menu>MENU̲MAX) parent̲menu=MENU̲MAX;
x=(parent̲menu‑l)*MENU̲DX;
color̲(MENU̲Xl+x,MENU̲Y,MENU̲X2+x,MENU̲Y,MENU̲SELECT̲COLOR); }else{
break;
}
}while(imput!=CR);
return(menu̲number);
}
/*
+・‑.‑.‑‑‑‑‑.一一一一一・・一・‑−−−−−−..−−−一・‑‑‑‑‑‑一一・一一一一一一一一‑−−−.−−−−−−−..−−.−.−−−一一一一一一一・‑‑‑‑‑‑‑..‑一一一一・一一・‑一一・一一+
menuslct.c
I A F M の メ ニ ュ ウ 環 境 を 提 供 す る A F M ̲ M E N U . E X E の サ プ モ ジ ュ ー ル | メ ニ ュ ウ 選 択 を 行 う 3 つ の 関 数 か ら な る 。
+一一一一一−..−..−−−−−‑一一一一一‑‑‑‑‑‑.‑‑.‑‑‑‑‑一一一・一一一一−−.−−−−−−−−−.−−一一一・一一−一一・一一・一・一一一一一・‑−−−.−−‑一一一一一一一+
*/
#include<string.h>
#include<lib¥crt.h>
#include<lib¥key.h>
#include<lib¥bslib.h>
#include<lib¥keytbl.h>
#include<lib¥window.h>
#include''popup.h''
+十+十十
︒︐.
●0ヶ︑Ⅱ日″〃︑ノー090ee︑︑ggi︒SS︑︑uⅡ︐︐︒000eennggi︒SSⅡ︑uu︐︐→し→し︑n.1
■Q○■且︐
一言一L成
一一旦一.m・狐一吟トーープ一心吐.︐一一一一イ︲一m・狐︑︺一コーーターL雌︑一︲トーm・狐4﹄一ロ一L城︑一プーm・訓氷
●夕︒︾︽ロ.︾︽.+口I︾
︲守Ⅱし孟叩
︲↑し︻叩000凸
面叩皿●●0凸0″
■GIA/″Ⅱ1︐.斗︽Ult︲ICwUCeN邸elEleMeSr︑S一︲t−lClaeanlCOe・1Z︹︒→︾・urrneOeV0nM肥ttt*一一ノノn︑n*一一ノ″*〃ノ+十*・1.1.1〃/+十*ノノ
intvertical̲select(int*no,intmax,intxl,intx2,intyl, intdy,unsignedatrl,unsignedatr2) 関 数 名
現 在 選 択 さ れ て い る メ ニ ュ ウ の 番 号 選 択 で き る メ ニ ュ ウ の 個 数
初 め の メ ニ ュ ウ の 左 x 文 字 座 標 初 め の メ ニ ュ ウ の 右 x 文 字 座 標 メ ニ ュ ウ の y 文 字 座 標
l メ ニ ュ ウ の 文 字 数 非 選 択 色
選 択 色 引 数
■●●●●●●og190X・・・.・・・・rrnal91聖y→し︲t*ⅢXXydaa
返 り 値 コ メ ン ト
C R , E S C , L E F T , R I G H T
縦 方 向 に 並 ん だ メ ニ ュ ウ を カ ー ソ ル キ ー で 選 択 す る
〃ノ*一︐一y一○.
一→し一︑一・1−P
−.1−y
−0t−︑一・
一一︐
一一○ムーX
一→し一n一・1−︐
一1八一Xj−→し?︺一Ⅱr一・1→﹀a一︐90−Xe一an一Ⅲg
●●■■凸一→︺S一︑n一・1u一19−0.1−nr−*jta−→し一︑0−.1e一/I︑
|︲tg
一C・一eS−ln−eu−S−l−a
一ハ0︶
一G9Ⅱ8
−︲TI︺一r一e一V
一→し一n+・
{
registerint int
unsigned
ch,y;
Cursor Color
/*カーソル属性*/
/*カレントアトリビュート*/
cursormode();
currentcolor();
一一一一
if(*no<lll*no>max)*no=l;
cursor(CURSORoff);
while(1){
y=(*no‑1)*dy+yl;
color̲(xl,y,x2,y,atr2);
ch=inkey();
color̲(xl,y,x2,y,atrl);
switch(ch){
caseUP:*no二(*no>l)?*no‑l:max;break;
caseDOWN:*no二(*no〈max)?*no+l:l;break;
caseLEFT:break;
caseRIGHT:break;
default:if(ch>='l'&&ch<=max+'O')*no=ch‑'O';break;
}
if(ch=CRIIch==ESCIIch==LEFTllch==RIGHT)break;
}
color̲(xl,y,x2,y,atr2);
color(Color);
cursor(Cursor);
return(ch);
}
/*‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑.‑.‑‑‑‑‑.‑一一一一一一一一一一一一一‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑.‑‑‑‑‑‑‑‑+
関 数 名 inthorizonal̲select(int*no,intmax,intxl,intx2, inty,intdx,unsignedatrl,unsignedatr2) 引 数 現 在 選 択 さ れ て い る メ ニ ュ ウ の 番 号
選 択 で き る メ ニ ュ ウ の 個 数 初 め の メ ニ ュ ウ の 左 x 文 字 座 標 初 め の メ ニ ュ ウ の 右 x 文 字 座 標 メ ニ ュ ウ の y 文 字 座 標
1 メ ニ ュ ウ の 文 字 数 非 選 択 色
選 択 色
●●◆●○●●●91ワ0X・・・...rrna︐19﹈..X→し→し*ⅢXXy︲︒aa
返 り 値 コ メ ン ト
C R , E S C , D O W N
横 方 向 に 並 ん だ メ ニ ュ ウ を カ ー ソ ル キ ー で 選 択 す る
ノノ*一︐一X一0
−一n一・一︐一y
一→し一n一・一︐
一︑ムーX
一→し一︑−.1−︐
一利1−X
−nt︑ノーnoムー・rt−︐a一X○0−ae−Ⅲng−︲t・一nS
−●91A︻叩型
叩皿哩一7
︐一0−︑利1−*rt−→︺a一n一・100−/1e一→し︑一Cg−e・l−lS−en−Su−lla一n一0−Z|・一r一0−︲n−t−命叩型
十︐G9I8
{
/*register*/intch i n t C u r s o r unsignedColor
X;
cursormode();
currentcolor();
/*カーソル属性*/
/*カレントアトリビュート*/
一一一一
if(*no<lll*no>max)*no=max;
cursor(CURSORoff);
while(1){
x=(*no‑1)*dx;
color̲(xl+x,y,x2+x,y,atr2);
ch二inkey();
color̲(xl+x,y,x2+x,y,atrl);
switch(ch){
caseLEFT:*no二(*no>l)?*no‑l caseRIGHT:*no二(*no〈max)?*no+1
break;
break;
max;
l;
default:if(ch>='l'&&ch<=max+'O')*no=ch‑'O';
.}
if(ch==CRIIch==ESCllch==DOWN)break;
}
color̲(xl+x,y,x2+x,y,atr2);
color(Color);
cursor(Cursor);
return(ch);
}
/*‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑...‑.‑‑‑‑.‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑−‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑.‑‑..‑‑‑‑‑‑‑‑+
intMenuSelect(MENU*m,int*no,intx,inty) 関 数 名
引 数 メ ニ ュ ー 構 造 体
現 在 選 択 さ れ て い る メ ニ ュ ウ の 番 号 ポ ッ プ ア ッ プ メ ニ ュ ウ の 左 上 x 文 字 座 標 ポ ッ プ ア ッ プ メ ニ ュ ウ の 左 上 y 文 字 座 標
●︒..0Ⅲ︑︒.:
**Xy
返 り 値 コ メ ン ト
CR,ESC,LEFT,RIGHT
ポップアップメニューを表示し、選択する。
+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑..‑‑.‑‑‑‑‑‑‑‑.‑‑.‑‑‑*/
intMenuSelect(MENU*m,int*no,intx,inty)
{
,flagl,flag2,len=0;
l; m;
registerint int
MENU WINDOW
int unsigned
X三二raor
Ⅲ→しr・︐SOCtハーrl1lpuu01S*0︐︹しr︺
/*カーソル属性*/
/*カレントアトリビュート*/
cursormode();
currentcolor();
=
=
for(;ptr‑>item;ptr++)
if(len<(int)strlen(ptr‑>item))len=strlen(ptr‑>item);
max=ptr‑m‑l;
if(max<1)return(‑l);
for(i=1;i<=max;i++)if(m[i].code==*no)slct=i;
WINopen(&buf,x,y,x+len+3,y+max+1,0,MENU̲BACK̲COLOR,MENU̲FLAME̲COLOR); WINtitle(&buf,0,0,MENU̲TITLE̲COLOR,m[O]・item);
color(MENU̲BACK̲COLOR);
for(i=1;i<=max;i++){
dputf(x+2,y+i,''%3,m[i].item);
} do{
flag2=CR;
flagl=vertical̲select(&slct,max,x+1,x+len+2,y+1,1, MENU̲BACK̲COLOR,MENU̲SELECT̲COLOR);
if(flagl=CR&&m[sIct].sub)
flag2=MenuSelect(m[slct].sub,no,x+3,y+3);
else
*no=m[slct].code;
}while(flag2==ESC);
WINclose(&buf);
color(Color);
cursor(Cursor);
return(flagl);
} /*
+‑‑‑‑‑‑..‑.‑・ −.−.−−.−‑.‑‑.‑‑‑.'‑.一一一一一一一一一一‑‑‑‑−−−.−..−−.−−・・・−−.−.−.−−−−−..−.−−.−−−.−−.−−‑一一一・・‑一一・一一・一・一 ‑.‑..‑,‑‑.‑.‑‑‑+
終わり
+−.− −.−−.−−−..−.−.−‑.‑.‑‑‑‑‑‑.‑.‑‑−..−.−.− ‑.‑.‑.一一一一一・一・一一一一・‑−−−‑.‑.‑‑...‑.‑‑−一一・‑一一一一一一‑.‑..・・・ ‑‑‑‑‑‑.‑..‑.一・一一一・・一・・・−.−.−+
*/
プログラムファイル
(B.2 HeaderProgramFiles)gra
ウ 可
可『
'1
プログラムファイル
Files)
(B。3 SenSorProgram
I
■凸ⅡⅡⅡqⅡ■■■67lbⅡJⅡHl10bJIIllUj
3 U o 岨 ら U H U 5 G o
●
︒ r
1
Ill41ll
ザ
111lゞ4︲岬昨岫州皿晒恥恥賑岬!衙届且側ⅡI酬加酬副祁蜘剛圃一コg副画馴勵副剛献訓馴剛郡91トドI卿8即恥即畔gEIHLⅦⅧⅢ蛆側朋椚1脚MFNm1
プログラムファイル
MotorProgramFiles)
(B.4 gra
4
四F面E■Ⅲ凹面閑ロー匿い砂匠F︑眠卜町汀○日1︐0Ⅱ帥︲小1胴POI0かにI
4
も
a自画﹃凹面刀蝉畑︒暁匠皿︒■d到削
巳
I
↓
プログラムファイル
ScanProgramFiles)
(B。5 rOg
砧■■戻殖■F1で口早ⅡlBIll0111114 孟緊
+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/
voidlast̲job(no) shortno;
{
}
piezo̲set(Y,last̲drive̲v[Y],(float)(t̲start[Y]+d̲displace*no), (float)0.0,(float)MAX̲SCAN̲SIZE/2);
piezo̲set(X,last̲drive̲v[X],(float)t̲start[X],
(float)0.0,(float)MAX̲SCAN̲SIZE/2);
piezo̲drive(Z,(float)0.0,last̲drive̲v[Z],(short)SAFE̲DRIVE̲Z);
last̲drive̲v[Z]=drive̲v[Z];
voidf̲drive(ch,i) shortch,i;
/*ver.4.6*/
{
}
drive̲v[ch]=detv̲ex(ch,start̲v[ch],(float)t̲start[ch],
d̲displace*i+(float)t̲start[ch]);
piezo̲drive(ch,drive̲v[ch],last̲drive̲v[ch],t̲div̲times[ch]);
last̲drive̲v[ch]=drive̲v[ch];
voidb̲drive(ch,i) shortch,i;
/*ver.4.6*/
{
}
drive̲v[ch]=detv̲sh(ch,reverse̲v[ch],(float)t̲start[ch]+t̲scan̲size, d̲displace*i+(float)t̲start[ch]);
piezo̲drive(ch,drive̲v[ch],last̲drive̲v[ch],t̲div̲times[ch]);
last̲drive̲v[ch]=drive̲v[ch];
/*‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑.‑‑‑.‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑..‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑+
関 数 名 voidmain()
+‑‑.‑‑‑‑.‑‑‑‑‑‑‑.‑‑‑‑.‑‑‑‑‑‑‑‑‑..‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑.‑‑.‑‑‑‑‑‑‑‑‑‑.‑.‑‑‑‑.‑‑.‑‑‑‑.‑‑‑‑..‑*/
voidmain() /*ver.4.6*/
{
shorty,xl,x2,i=0,j=0,repeat;
registerfloat*dp,*sp,*rp,*srp,*dq,*sq,*rq,*srq;
init();
init̲loop(Y);
init̲loop(X);
for(y=0;y<=t̲number̲of̲samples‑1;y++){
f̲drive((short)Y,y); /*y軸スキャン*/
dq=&t̲height[j][O];sq=&t̲subdat[j][O];
rq=&t̲rev[j][t̲number̲of̲samples‑1];
srq=&t̲subrev[j][t̲number̲of̲samples‑l];
repeat=t̲repeat;
for(xl=0;xl<=t̲interval‑1;xl++){
/*行き*/dp=dq;sp=sq;
for(x2=0;x2<=t̲number̲of̲samples‑l;x2++){
if(x2==t̲interval*i+xl){
f̲drive((short)X,x2);
sampling(dp,sp);
i++;
畷
プログラムファイル
mFiles)
(B.6 1 mageProgra f
1 1
U
/*
+一一一一一一・一一一・−−−−−−.−−一・‑一一一一一一一一‑‑‑‑一一一一一一一一一一一一一‑−.−.−−−−−.−.−−−−−−−.−−−−−‑一一一一一一一一一・‑‑.‑‑‑‑‑‑+
vmath.c
ベ ク ト ル 演 算 パ ッ ケ ー ジ . C プ ロ グ ラ ム ブ ッ ク 2 参 照
+一一・‑‑‑‑‑‑‑‑‑‑‑‑‑‑一一一一一一一一一‑−−−−−−.−−−−−−.‑‑‑‑‑‑‑‑一‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑..‑一一一・・一・一・‑‑‑‑‑‑‑‑.‑‑.‑.一一一・‑一・‑−−−−−+
*/
#include<stdio.h>
#include<math.h>
#include<process.h>
#include''vmath.h'' Vectorvzero={
0.0,0.0,0.0 }
;
Matrixmunit l.0,0.0, 0.0,l.0, 0.0,0.0, }
;
二{
0.0, 0.0, 1.0
#defineSTKMAX300
staticElementStk[STKMAX];
Element*stkpnt;
voidsinit(void)
{
stkpnt二stk+STKMAX;
}
voidprints(void)
{
}
Element*p;
inti;
i=0;
printf(''¥n‑‑stacktop‑‑¥n'');
for(p=stkpnt;p<stk+STI
for(p=stkpnt;p<stk+STKMAX;++p){
printf(''%‑10g'',*p);
if(++i>=3){
i = 0 ;
putchar('¥n');
}else
putchar(',');
}
printf(''¥n‑‑stackbottom‑‑¥n¥n'');
voidvpsh(Vectorvct)
{
+lllll+
合
し一J一
一ユ一寸ン一モ一Cる一巳す一
一狐を一 一帥グ一
ン一イ一一プ一
一エ一︑ン一
︐一クh一︒︑︒う0︐0Ⅲ・000︑.︑0.1︑e0nl・llhdt−O090jtaa−→し→しa.︑ⅢSS川SV
一一くくくeeeee
−の一0000.0000duuuuu
llllll
CCCCCnnnn︑*一一jiii・lij+lllll+*#####
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑Externfunctions‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/
externdoublegetdata(int,long,long);
externvoidviewedge(void);
externvoidpxIset(void);
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑ExternVariables‑‑‑‑‑‑‑‑‑‑−一‑‑‑‑‑‑‑‑‑*/
externVectoreye,view;
externMatrixlens,inv;
externintpx,py;
externdoublewindow,sx,sy,hd,hv;
〃/*
一三口一旦プイタト
ロプル
ー●B・ローロⅡ︺●︑〃
一︑画u■″クハ叩叩︑︑日″〃一︵︾︶●90凸︽恥F︾
−1︐1
−00e○︐一ulu一0900−00u00−︐0︐一gdg一n/1n一0V.︐0−101ノー︒︐一ypd︐︑ノーgiigd−Ⅱ0n.一OeVOO−llrKlV−flby/lfl−eupⅢV−000︐rW−a0aOe一︐︑Cn.一SCS︽IV
e9Ⅱ4−90tしgo0000−.1a・1.1.1*0→し000ノ/VSVVV
/*‑・・‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑・‑‑‑‑・‑Public‑‑‑‑‑・‑‑‑‑‑・‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑・‑*/
サンプル表面の性質*/
拡 散 反 射 係 数 R , G , B 鏡 面 反 射 係 数 R , G , B 小 面 分 布 関 数 の パ ラ メ ー タ
{ 0.0}, 0.0},
/* /* /* /* Surfacesurf=
{0.0,0.5, {0.0,1.5, 500,
}
;
*/
*/
*/
lllumlampO={
NULL,
{0.0,‑l.0,l.0},/*光源の向き*/
{10.0,10.0,10.0},/*光源の色R,G,B*/
}
;
Vectornorm;
Colorccolor; /*ペイントする伝.のR,G,B成分*/
Surface*s=&surf;
Illum*l=&lampO;
〃/+*一一一一一一一一一一一一一一一
一一一一一一○一一一一一一
一一一一一一一一一一一一一一一一一一一一一一
一一一一
一一一一一一一一トトー
ーーコ一一一一一一一一一
一一一一一一一一一一一一
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
一一一一一一**ノグ〃ノ
staticdoubleipow(doublea,intn) 関 数 名
+十一C一●|
e一一n|
︒一一
一●
*一〃/︐/+十*
#include<stdio.h>
#include<stdlib.h> /*abs()*/
#include
#include
''afmdef.h'' ''vmath.h''
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑Externfunctions‑‑‑‑‑‑‑‑‑−−‑‑‑‑‑‑‑‑‑‑‑*/
voidedge(long,long);
voidshade(long,long,double);
voidpxIset(void);
voidscanpy(void);
voidviewv(void);
doublegetdata(int,long,long);
eXtern eXtern extern extern eXtern extern
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑プロトタイプ宣言‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑*/
voidline(long,long,long,long);
voidpoint(long,long);
intcomp(long,long);
/*proto*/
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑・‑‑‑‑Public‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑・‑‑‑‑‑・‑‑*/
Vectoreye,view;
Matrixlens,inv;
intpx,py,mode;
shortnumber̲of̲samples;
doublewindow,sx,sy,data̲min,hight̲scale;
FILE*fp;
extern eXtern extern extern extern eXtern
doublehd,hv;
/*‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑.‑‑‑‑‑‑‑‑‑‑コーーーーーーーーーーーーーーーーーー・‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑*/
/*‑‑‑‑‑.‑‑‑‑‑‑‑‑‑.‑‑.‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑.‑‑‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+
yl,longx2,longy2) ine(longxl,long
関 数 名 引 数
voidl
longxl:視点から眺めたときの手前のデータの端のx座標 longyl:視点から眺めたときの手前のデータの端のy座標 longx2:視点から眺めたときの奥のデータの端のx座標 longy2:視点から眺めたときの奥のデータの端のy座標
引数で指定される2点間を 離散データであるスキャンデータを、
結ぶ直線に沿って順に進めてゆく C プ ロ グ ラ ム ブ ッ ク 1 参 照 コ メ ン ト
+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑.‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑.‑‑‑‑‑‑‑‑‑‑*/
voidline(longxl,longyl,longx2,longy2)
{
1 .
longx,y,dx,dy;
longe,cl,c2,inc;
x=xl;y=yl;
edge(x,y); /*視界の最下点の処理*/
=labs(x2‑xl);
=labs(y2‑yl);
(dx>dy){
c2=2*dy;
e=c2‑dx;
cl=e‑dx;
if(yl<y2) inc=l;
else
inc=‑l;
y=yl;
dx dy if
if(x2‑xl+y2‑yl<O
II(x2‑xl+y2‑yl==O&&
for(x=xl‑l;x>二x2;x‑‑){
if(e>0){
y+=inc;
e+=cl;
}else
e+=c2;
point(x,y); /*描画処理*/
} }else{
for(x=xl+1;x<=x2;x++){
if(e>0){
y+=inc;
e+=cl;
}else
e+=c2;
point(x,y); /*描画処理*/
}
}
x2‑xl>0)){
}else{
c2=2*dx;
e=c2‑dy;
cl=e‑dy;
if(xl<x2) inc=1;
else
inc=‑l;
x二Xl;
llll︲llIllIli1I1lIIIIIIIj
if(x2‑xl+y2‑yl<O
││(x2‑xl+y2‑yl==O&&x2‑xl>0)){
for(y=yl‑l;y>=y2;y‑‑){
if(e>0){
x+=inc;
e+=cl;
}else
e+=c2;
point(x,y); /*描画処理*/