home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
ok_chem
/
ok_chem.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
7KB
|
245 lines
#include <stdio.h>
#include <stdlib.h>
#include <msdos.cf>
#include <string.h>
#include <math.h>
#include <EGB.h>
#include <MOS.h>
#include <MMI.h>
char work[1536];
char para[2048];
char mwork[4096];
char gra2[512]={ 0x49,0x49,0x2a,0x00,
0x08,0x00,0x00,0x00,
0x0f,0x00,
0xff,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x80,0x02,0x00,0x00,
0x01,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,
0x02,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x03,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x06,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x0a,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x11,0x01,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
0x12,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x15,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x18,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x19,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0xff,0x00,0x00,0x00,
0x1a,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,
0x1b,0x01,0x05,0x00,0x01,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,
0x1c,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00 };
/* ↑ TIFF 256色 のヘッダ */
char mes[]="O.K_CHEMISTRY_TOOL v0.1";
char mes2[]="水素原子の波動関数の三次元表示";
char moji[16][11]={"ψ1s","ψ2s","ψ2pz","ψ2px","ψ2py",
"ψ3s","ψ3pz","ψ3px","ψ3py",
"ψ3dz2","ψ3dxz","ψ3dyz","ψ3dx2-y2","ψ3dxy",
"画面セーブ","終了"};
char *gra;
FILE *fp;
double fai,a=1,r,r2,pi=3.1415;
double xx,yy,zz;
double ex,ey,ez,kizami=10,ka=10;
unsigned short x,y,col;
short c,o,ms;
int i,ki;
short miid[16];
short id,mid,cd;
POINT lu,rd;
COLOR wc;
POINT pos;
short sid;
int m1=0,m2,m3;
void pset(x,y,col)
unsigned short x,y,col;
{
EGB_color(work,0,col);
WORD(para+2)=x;
WORD(para+4)=y;
EGB_pset(work,para);
}
void main()
{
gra=(char *)malloc(307712); /* 画面セーブ用領域確保 */
if (gra==NULL)
exit(-1);
EGB_init(work,1536);
EGB_resolution(work,0,12); /* 画面モード12 */
for (c=0;c<256;c++)
{
o=8*c+4;
DWORD(para+o)=c;
BYTE(para+o+4)=c;
BYTE(para+o+5)=c;
BYTE(para+o+6)=c;
BYTE(para+o+7)=0;
}
DWORD(para+0)=256;
EGB_palette(work,1,para); /* パレットをモノクロ256段階に設定 */
EGB_writePage(work,0);
EGB_displayPage(work,0,1);
EGB_color(work,0,255);
EGB_color(work,1,0);
EGB_writeMode(work,2);
EGB_penSize(work,1);
MOS_start(mwork,4096);
MOS_resolution(0,12);
MOS_writePage(0);
MOS_color(0,0xff);
MOS_horizon(0,639);
MOS_vertical(0,479); /* マウス設定(おまじない) */
for (;;)
{
MMI_Open(32,2048,work,mwork); /* MMIライブラリ初期化 */
MMI_SetPixel(1);
MMI_FlsEvnt(MSALL,0);
lu.x=120; lu.y=16;
rd.x=519; rd.y=399;
wc.frame=0x7f; wc.back=0xff; wc.ch=0;
id=MMI_EtyWin(&lu,&rd,&wc); /* ウィンドウ定義 */
lu.x=4;lu.y=8;
wc.frame=0x7f; wc.back=0xff; wc.ch=0;
cd=MMI_EtyMsg(id,&lu,mes,&wc); /* メッセージをウィンドウ上に定義 */
lu.x=24;lu.y=32;
wc.frame=0x7f; wc.back=0xff; wc.ch=0;
cd=MMI_EtyMsg(id,&lu,mes2,&wc);
lu.x=0; lu.y=0;
wc.frame=0x7f; wc.back=0xff; wc.ch=0;
mid=MMI_EtyMenu(id,&lu,DVERT,FALSE,FALSE,&wc); /* 縦並びメニュー設定 */
for (i=0;i<16;i++)
{
miid[i]=MMI_EtyMItem(mid,TRUE,FALSE,0,moji[i]);
/* メニューの項目設定 */
}
MMI_DspWin(id,TRUE,TRUE); /* 上で定義したウィンドウ表示 */
lu.x=176; lu.y=64;
MMI_DspMenu(mid,&lu,TRUE,FALSE); /* メニュー表示 */
MOS_disp(1); /* マウス表示 */
pos.x=0; pos.y=0; m1=0; ms=0;
do
{
while ((m1&1)!=1)
MOS_rdpos(&m1,&m2,&m3);
pos.x=m2; pos.y=m3; /* マウスのクリックした場所 */
ms=MMI_MenuSelect(mid,&pos,&sid);/* のメニューの項目のID取得 */
}
while ( ENOSLCT==ms ); /* 何もセレクトしていないなら繰り返し*/
ki=0;
for (i=0;i<16;i++)
if (miid[i]==ms) ki=i; /* すなわちkiが選んだ項目の番号 */
MMI_ClsMenu(mid);
MMI_ClsWin(id); /* ウィンドウをクリアして下の画面に戻す */
MOS_disp(0);
if (ki==15) break;
if (ki!=14) /* 終了や画面セーブでなければ表示へ移る */
{
WORD(para+0)=1;
for (ez=0;ez<kizami*1.2;ez++)
{
zz=(double)(ez/kizami);
for (ey=0;ey<kizami*1.2;ey++)
{
yy=(double)(ey/kizami);
for (ex=0;ex<kizami*1.2;ex++)
{
xx=(double)(ex/kizami);
r2=(double)((ex*ex+ey*ey+ez*ez)/(kizami*kizami));
r=sqrt(r2);
switch (ki)
{
case 0:fai=exp(-r);
break;
case 1:fai=exp(-r/2)*(2-r)/2;
break;
case 2:fai=exp(-r/2)*zz/2;
break;
case 3:fai=exp(-r/2)*xx/2;
break;
case 4:fai=exp(-r/2)*yy/2;
break;
case 5:fai=(27-18*r+2*r*r)*exp(-r/3)/49.73;
break;
case 6:fai=(6-r)*exp(-r/3)*zz/4.973;
break;
case 7:fai=(6-r)*exp(-r/3)*xx/4.973;
break;
case 8:fai=(6-r)*exp(-r/3)*yy/4.973;
break;
case 9:fai=exp(-r/3)/1.407*abs(3*zz*zz-r*r);
break;
case 10:fai=exp(-r/3)/1.407*xx*zz;
break;
case 11:fai=exp(-r/3)/1.407*yy*zz;
break;
case 12:fai=exp(-r/3)/0.81216*abs(xx*xx-yy*yy);
break;
case 13:fai=exp(-r/3)/0.81216*2*xx*yy;
break;
defallt:fai=0.8;
}
x=(int)(320-ex*0.866*ka+ey*0.866*ka+ex);
y=(int)(240-ez*ka+ex/2*ka+ey/2*ka-ez);
col=(int)(fai*255);
pset(x,y,col);
}
}
} /* この上の処理は全く適当 誰かまともにしてください */
} /* ここでIFの処理は終わり ずっと下へ飛ぶ */
else
{
DWORD(gra2+0x01f0)=0x4b;
DWORD(gra2+0x01f4)=0x01;
DWORD(gra2+0x01f8)=0x4b;
DWORD(gra2+0x01fc)=0x01;
DWORD(gra2+0)=0x002a4949;
for (i=0;i<512;i++)
{
gra[i]=gra2[i];
}
DWORD(para+0)=(int)gra+512;
WORD(para+4)=getds();
WORD(para+6)=0;
WORD(para+8)=0;
WORD(para+10)=639;
WORD(para+12)=479;
EGB_getBlock(work,para); /* 画面を転送 */
fp=fopen("A:grp.tif","wb"); /* セーブ */
fwrite(gra,1,307712,fp);
fclose(fp);
}
/* IFの処理が終わったら全てここに来る */
do
{
MOS_rdpos(&m1,&m2,&m3);
}
while((m1&1)!=1); /* 左クリックするまで待つ */
MMI_Close(); /* MMIを終了 */
}
/* ここで大きなfor(;;)の無限ループ終了 break文はこの下へ来る */
free(gra); /* 領域の開放をお忘れ無く */
MOS_end();
exit(0); /* 一応これを付けておく(いらないかもしれない) */
}