//--------------------------------------------------------------------------------------------------------------------
//基础物理学小作业(γ射线在物质中的吸收规律)
//题目描述:
//01.γ射线首先由法国科学家P.V.维拉德发现,是继α,β射线后发现的第三种原子核射线.
//02.原子核衰变和核反应均可产生γ射线.γ射线具有比X射线还要强的穿透能力.
//03.γ射线是光子,光子会与被束缚在原子中的电子,自由电子,库伦场,核子等带电体发生相互作用.
//04.不同能量的γ射线与物质的相互作用效果不同,为了有效屏蔽γ辐射,需要根据物质对γ射线的吸收规律来选择合适的材料及厚度.
//05.反之,利用物质对γ射线的吸收规律可以进行探伤及测厚等.
//06.γ射线与物质原子间的相互作用只要发生一次碰撞就是一次大的能量转移;
//07.带电粒子穿过物质时,经过许多次小能量转移的碰撞来损失能量.带电粒子在物质中是逐渐损失能量,最后停止下来,有射程概念;
//08.γ射线穿过物质时,强度逐渐减弱,按指数规律衰减,不与物质发生相互作用的光子穿过吸收层,其能量保持不变,因而没有射程概念.
//09.但可用"半吸收厚度"来表示γ射线对物质的穿透情况.
//10.γ射线与带电体的作用原理:光电效应,康普顿效应,电子对效应;各种效应的贡献值,与入射γ射线光子的能量有关系.
//11.γ射线强度随物质厚度的衰减服从指数规律,即:
//12.I=I0*[e^(-μ*t)]
//13.其中:I-穿过物质后的γ射线强度(MeV)
//14. I0-穿过物质前的γ射线强度(MeV)
//15. μ-物质的线性吸收系数(mm^-1).μ值与入射γ射线强度有关.
//16. t-射线穿过的物质的厚度(mm).
//程序编制要求:
//1.入射γ射线强度I0,物质的线性吸收系数μ交互读取.
//2.射线穿过的物质的厚度t交互读取.
//3.绘制厚度从(0~10cm)变化时,穿过物质后的γ射线强度的变化曲线.
//--------------------------------------------------------------------------------------------------------------------
#include //包含Easyx模拟TC的BGI绘图库头文件
#include //包含数学运算头文件
#define DD 40//宏定义标题边框距离
#define DW 10//宏定义宽度边框距离
#define DH 10//宏定义高度边框距离
#define DC 200//宏定义控件区域宽度
#define nx 10//宏定义x轴刻度数量
#define ny 10//宏定义y轴刻度数量
#define PI 3.1415926//宏定义圆周率
#define TA 0//最低厚度(mm)
#define TB 100//最高厚度(mm)
#define c1 RGB(38,47,86)//宏定义辅助线颜色1
#define c2 RGB(38,47,86)//宏定义辅助线颜色2
#define c3 RGB(255,255,255)//宏定义文字及边框颜色
#define cc1 RGB(255,0,0)//宏定义曲线颜色1(红色)
#define cc2 RGB(0,0,255)//宏定义曲线颜色2(蓝色)
#define cc3 RGB(255,255,0)//宏定义曲线颜色3(黄色)
//定义结构体-------------------------------------------------------------------------------------------------------
typedef struct points
{
double x,y;//定义双精度变量
}DPOINT;//结束结构体
//定义全局变量-----------------------------------------------------------------------------------------------------
int W = GetSystemMetrics(SM_CXSCREEN);//获取整个屏幕右下角X坐标
int H = GetSystemMetrics(SM_CYSCREEN);//屏幕Y坐标
char is1[20]="14.1";//预定义:1.入射γ强度(Mev)
char is2[20]="0.103";//2.物质吸收系数(mm^-1)
char is3[20]="50";//3.物质的厚度(mm)
char is4[20],is5[20],is6[20],is7[20];//定义字符数组(存储字符串)
double d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11;//定义双精度变量(存储计算值)
//函数声明---------------------------------------------------------------------------------------------------------
void sub_frame();//绘制框架子函数
void sub_calculate();//计算数据子函数
//主函数-----------------------------------------------------------------------------------------------------------
void main()
{
sub_frame();//绘图初始化
MOUSEMSG m;//定义鼠标消息
while(true)//循环
{
m=GetMouseMsg();//获取一条鼠标消息
switch(m.uMsg)//根据获得的消息选择分支
{
case WM_LBUTTONDOWN://鼠标左键单击时判断数据输入
{
//判断鼠标位置是否在指定的控件区域
//A.获取原始数据(横坐标在输入区域时输入数据)-------------------------------
if(m.x>=W-DW-DC && m.x<=W-DW)
{
//1.系数α:-----------------------------------------------------
if(m.y>=H-DH-16*36+1 && m.y<=H-DH-15*36-1)//
{
InputBox(is1,9,"请输入数据");//读入数据
setfillcolor(BLACK);
fillrectangle(W-DW-DC+DC/2+10,H-DH-16*36+1,W-DW,H-DH-15*36);
outtextxy(W-DW-DC+DC/2+15,H-DH-16*36+15,is1);//写控件字符串
}//结束if
//2.系数β:-----------------------------------------------------
if(m.y>=H-DH-15*36+1 && m.y<=H-DH-14*36-1)//
{
InputBox(is2,9,"请输入数据");//读入数据
setfillcolor(BLACK);
fillrectangle(W-DW-DC+DC/2+10,H-DH-15*36+1,W-DW,H-DH-14*36);
outtextxy(W-DW-DC+DC/2+15,H-DH-15*36+15,is2);//写控件字符串
}//结束if
//3.放射剂量(Gy):-----------------------------------------------
if(m.y>=H-DH-14*36+1 && m.y<=H-DH-13*36-1)//
{
InputBox(is3,9,"请输入数据");//读入数据
setfillcolor(BLACK);
fillrectangle(W-DW-DC+DC/2+10,H-DH-14*36+1,W-DW,H-DH-13*36);
outtextxy(W-DW-DC+DC/2+15,H-DH-14*36+15,is3);//写控件字符串
}//结束if
}//结束if(横坐标在输入区域时输入数据)
sub_frame();//重绘框架
//B.计算并绘图(横坐标在绘图区域时计算绘图)---------------------------------
if(m.x>=DW && m.x<=W-DW-DC)
{
sub_calculate();//调用计算绘图函数
}//结束if
break;//
}//结束case(结束鼠标左键单击事件消息处理)
case WM_RBUTTONDOWN://鼠标移动的时候画个空心的圆
return;//返回while
}//结束switch(结束鼠标消息)
}//结束while
}//结束主函数
//绘制框架子函数
void sub_frame()
{
//1.全屏效果---------------------------------------------------------------------------
initgraph(W,H);//初始化绘图窗口
HWND hWnd = GetHWnd();//获取窗口句柄
LONG style = GetWindowLong(hWnd,-16);//获得窗口风格
style = style & ~WS_CAPTION & ~WS_SIZEBOX; //窗口全屏显示且不可改变大小
SetWindowLong(hWnd,-16,style);//设置窗口风格
SetWindowPos(hWnd, NULL,0,0,W,H,SWP_NOZORDER);//改变窗口位置,尺寸和Z序
//ShowCursor(FALSE);//显示时隐藏鼠标
//------------------------------------------------------------------------------------
//2.绘制工作区边框
setcolor(c3);
rectangle(DW,DD,W-DW,H-DH);//外边框
rectangle(W-DW-DC,DD,W-DW,H-DH);//控件区域边框
//3.输出标题
setfont(16,0,"黑体");
outtextxy(5,10,"基础物理学小作业(γ射线在物质中的吸收规律)");
//4.输出简单说明
RECT r={W-DW-DC+10,DD+10,W-DW-10,H-DH-10};//
setfont(12,0,"宋体");//
drawtext("基础物理学小作业:\n \n \
γ射线在物质中的吸收规律\
\
\n\n\
操作说明:\n\n\
鼠标左键 : 数据输入\n\
鼠标右键 : 退出程序\n\
\n\
1~3为输入数据 4~5为计算数据\n\
\n\n\
\n\n\
\
\n", &r, DT_WORDBREAK);//
//5.调整说明文字下面的矩形控件
int c_h=36;//定义控件高度
int c_x1=W-DW-DC,c_x2=W-DW;//控件左右x坐标
int c_y1=H-DH;//第1个控件下y坐标
for(int i=1;i<=16;i++)
{
rectangle(c_x1,c_y1,c_x2,c_y1-c_h);//
c_y1=c_y1-c_h;
}//结束for
//6.绘制控件说明文字
outtextxy(c_x1+10,H-DH-16*c_h+15,"1.入射γ强度I0(Mev):");//输出字符串模拟控件文字
outtextxy(c_x1+10,H-DH-15*c_h+15,"2.物质吸收系数μ(mm^-1):");//输出字符串模拟控件文字
outtextxy(c_x1+10,H-DH-14*c_h+15,"3.物质的厚度t(mm):");//输出字符串模拟控件文字
outtextxy(c_x1+10,H-DH-13*c_h+15,"4.衰减系数:");//输出字符串模拟控件文字
outtextxy(c_x1+10,H-DH-12*c_h+15,"5.出射γ强度I(Mev):");//输出字符串模拟控件文字
//7.初始化原始数据
outtextxy(W-DW-DC+DC/2+60,H-DH-16*36+15,is1);//写控件字符串
outtextxy(W-DW-DC+DC/2+60,H-DH-15*36+15,is2);//写控件字符串
outtextxy(W-DW-DC+DC/2+60,H-DH-14*36+15,is3);//写控件字符串
}//结束子程序
//计算数据子函数
void sub_calculate()
{
//1.原始数据转化为双精度数
d1=atof(is1);//1.入射γ强度I0(Mev)
d2=atof(is2);//2.物质吸收系数μ(mm^-1)
d3=atof(is3);//3.物质的厚度t(mm)
//2.根据数据计算要求项目---------------------------------------------------------------------------
d4=exp(0.0-d2*d3);//4.衰减系数
d5=d1*d4;//5.出射γ强度I(Mev)
//3.将计算结果转化为字符串--------------------------------------------------------------------------
gcvt(d4,6,is4);//
gcvt(d5,6,is5);//
//4.绘制工作区坐标线
//画x轴刻度标线及文字---------------------------
double value;//定义双精度变量
char stt[10];//定义字符数组
double xstep=(W-2*DW-DC)/(1.0*nx);//x方向步长(nx个刻度)(对应的绘图单位)
double ystep=(H-DH-DD)/(1.0*ny);//y方向步长(ny个刻度)(对应的绘图单位)
for(int i=0;i<=nx;i++)
{
setcolor(c1);//竖直辅助线颜色
line(DW+xstep*i,H-DH,DW+xstep*i,DD);//画竖直小刻度线
setcolor(c3);//文字颜色
value=TA+xstep*i*(TB-TA)/(W-2*DW-DC);//所在的刻度数值
gcvt(value,5,stt);//将浮点数value转换为字符串stt
outtextxy(DW+xstep*i-10,H-DH-20,stt);//在规定的位置放置字符串
}//结束for
//画y轴刻度标线及文字---------------------------
for(i=0;i<=ny;i++)
{
setcolor(c2);//水平辅助线颜色
line(DW,DD+ystep*i,W-DW-DC,DD+ystep*i);//画水平小刻度线
setcolor(c3);//文字颜色
value=ystep*(ny-i)*d1/(H-DH-DD);//所在的刻度数值
gcvt(value,3,stt);//将浮点数value转换为字符串stt
outtextxy(DW+15,DD+ystep*i+5,stt);//在规定的位置放置字符串
}//结束for
//5.重新绘制工作区边框
setcolor(c3);
rectangle(DW,DD,W-DW,H-DH);//外边框
rectangle(W-DW-DC,DD,W-DW,H-DH);//控件区域边框
//6.将字符串写入控件中
setfillcolor(BLACK);
//------------------------------------------------------------
fillrectangle(W-DW-DC+DC/2+10,H-DH-13*36+1,W-DW,H-DH-12*36);
outtextxy(W-DW-DC+DC/2+15,H-DH-13*36+15,is4);//写控件字符串
//------------------------------------------------------------
fillrectangle(W-DW-DC+DC/2+10,H-DH-12*36+1,W-DW,H-DH-11*36);
outtextxy(W-DW-DC+DC/2+15,H-DH-12*36+15,is5);//写控件字符串
//------------------------------------------------------------
//7.获取厚度从(TA~TB)变化时出射γ强度I的变化曲线------------------------------------------------
double x_scale=(W-2*DW-DC)*0.1/(TB-TA);//每个数学单位x对应的屏幕单位
double y_scale=(H-DH-DD)*1.0/d1;//每个数学单位y对应的屏幕单位
double n1;//
DPOINT *p1;//定义指向点表的指针
p1=new DPOINT[1000];//定义N1点表
for(int j=0;j<=(TB-TA)*10.0;j++)//放射剂量从TA到TB变化
{
n1=d1*exp(0.0-d2*(0.1*j+TA));//4.线性效应(%)
p1[j].x=DW+j*x_scale;
p1[j].y=H-DH-n1*y_scale;
}//结束for
//8.绘制厚度从(TA~TB)变化时出射γ强度I的变化曲线---------------------------------------------------
setcolor(cc1);//曲线颜色1
for(j=0;j<(TB-TA)*10.0;j++)//线性效应
{
line(p1[j].x,p1[j].y,p1[j+1].x,p1[j+1].y);
}//结束for
}//结束子函数*/
//--------------------------------------------------------------------------------------------------------------------