中子剂量减弱因子函数图像的绘制

2023-12-23 06:14:19
/*题目:函数绘图综合小练习
1.假设常用材料的中子剂量减弱因子f可以用下列近似公式表示:
2.水:f=e^(-0.11*d)
3.普通混凝土:f=e^(-0.083*d)
4.钢铁:f=e^(-0.063*d)
5.铅:f=e^(-0.042*d)
6.其中:d-材料厚度,单位:cm
7.要求:绘制1000mm材料内的中子减弱因子曲线,并能实时查询不同材料的对应值
*/
#include <graphics.h>//包含Easyx模拟TC的BGI绘图库头文件
#include <conio.h>//包含控制台输入输出头文件
#include <math.h>//包含数学运算头文件
#include <iostream.h>//包含输入输出流头文件
#define MAXPTS 1000//宏定义点的数量
#define W 1000//宏定义绘图窗口宽度
#define H 700//宏定义绘图窗口高度
#define DW 10//宏定义宽度边框距离
#define DH 10//宏定义高度边框距离
#define nx 10//宏定义x轴刻度数量
#define ny 10//宏定义y轴刻度数量
#define PI 3.1415926//宏定义圆周率
//结构体及全局变量------------------------------------------
struct PTS//定义结构体
{
	double x;//
	double y;//
};//结束结构体
struct PTS p_water[MAXPTS];//水的点表
struct PTS p_concrete[MAXPTS];//混凝土的点表
struct PTS p_steel[MAXPTS];//钢铁的点表
struct PTS p_lead[MAXPTS];//铅的点表
//函数原型声明----------------------------------------------
double func_water(double a);//水的减弱函数
double func_concrete(double a);//混凝土的减弱函数
double func_steel(double a);//钢铁的减弱函数
double func_lead(double a);//铅的减弱函数
void draw_water(void);//绘制水的减弱函数
void draw_concrete(void);//绘制混凝土的减弱函数
void draw_steel(void);//绘制钢铁的减弱函数
void draw_lead(void);//绘制铅的减弱函数
void draw_all(void);//绘制全部函数
//----------------------------------------------------------
//主函数
void main()
{
	//函数操作说明---------------------------------
	cout<<"函数操作说明:"<<endl;
	cout<<"鼠标左键选择材料厚度,右键退出"<<endl;
	cout<<"Press any key to continue..."<<endl;
	getch();//获取字符进入操作界面
	//---------------------------------------------
	initgraph(W,H);//初始化绘图区域
	HWND hwnd=GetHWnd();//获取窗口句柄
	SetWindowText(hwnd,"几种常用材料的中子减弱函数近似计算");//设置窗口标题文字	
	//绘制减弱函数-----------------------------------
	draw_all();
	//输出提示----------------------------------------
	MOUSEMSG m;//定义鼠标消息
	struct PTS p_cross1,p_cross2,p_cross3,p_cross4;//定义结构体变量(曲线上的坐标点)
	while(true)
	{
		m=GetMouseMsg();//获取鼠标消息
		switch(m.uMsg) 
		{
			case WM_LBUTTONDOWN://如果鼠标左键按下
			{
				//获取鼠标点选坐标------------------------------
				p_cross1.x=m.x;//获取鼠标位置的x坐标
				p_cross2.x=m.x;
				p_cross3.x=m.x;
				p_cross4.x=m.x;	
				p_cross1.y=func_water(p_cross1.x);//函数值
				p_cross2.y=func_concrete(p_cross2.x);//
				p_cross3.y=func_steel(p_cross3.x);//
				p_cross4.y=func_lead(p_cross4.x);//
				//说明文字------------------------------------------------------
				draw_all();//重绘
				char str1[20]="材料厚度(mm):",str2[20];//
				gcvt(p_cross1.x,3,str2);//
				strcat(str1,str2);
				outtextxy(W/2+100,DH+40,str1);//在规定的位置放置字符串	
				char str3[20]="水的减弱因子为:",str4[20];//
				gcvt(p_cross1.y,3,str4);//
				strcat(str3,str4);				
				outtextxy(W/2+100,DH+60,str3);//在规定的位置放置字符串	
				char str5[20]="混凝土的减弱因子为:",str6[20];//
				gcvt(p_cross2.y,3,str6);//
				strcat(str5,str6);				
				outtextxy(W/2+100,DH+80,str5);//在规定的位置放置字符串	
				char str7[20]="钢铁的减弱因子为:",str8[20];//
				gcvt(p_cross3.y,3,str8);//
				strcat(str7,str8);				
				outtextxy(W/2+100,DH+100,str7);//在规定的位置放置字符串
				char str9[20]="铅的减弱因子为:",str10[20];//
				gcvt(p_cross4.y,3,str10);//
				strcat(str9,str10);				
				outtextxy(W/2+100,DH+120,str9);//在规定的位置放置字符串	
				//转换曲线坐标-----------------------------------
				p_cross1.x = DW + (p_cross1.x)*(W-2*DW)/1000.0;//
				p_cross1.y = (H-DH) - (p_cross1.y)*(H-2*DH);//
				p_cross2.x = DW + (p_cross2.x)*(W-2*DW)/1000.0;//
				p_cross2.y = (H-DH) - (p_cross2.y)*(H-2*DH);//	
				p_cross3.x = DW + (p_cross3.x)*(W-2*DW)/1000.0;//
				p_cross3.y = (H-DH) - (p_cross3.y)*(H-2*DH);//	
				p_cross4.x = DW + (p_cross4.x)*(W-2*DW)/1000.0;//
				p_cross4.y = (H-DH) - (p_cross4.y)*(H-2*DH);//
				//绘制标线----------------------------------------------
				setcolor(RGB(0,225,130));//设置颜色
				line(p_cross1.x,DH,p_cross1.x,H-DH);//
				setcolor(RGB(255,0,0));//
				line(p_cross1.x-5,p_cross1.y,p_cross1.x+5,p_cross1.y);//
				line(p_cross2.x-5,p_cross2.y,p_cross2.x+5,p_cross2.y);//
				line(p_cross3.x-5,p_cross3.y,p_cross3.x+5,p_cross3.y);//
				line(p_cross4.x-5,p_cross4.y,p_cross4.x+5,p_cross4.y);//				
				break;//
				}//结束这个case
			case WM_RBUTTONUP://鼠标右键弹起
				return;//结束程序
		}//结束switch
	}//结束while
	getch();//获取字符
	closegraph();//关闭绘图区域
}//结束主函数
//----------------------------------------------
double func_water(double a)
{
	double b;
	b=exp(-0.11*a*0.1);
	return(b);
}//
//----------------------------------------------
double func_concrete(double a)
{
	double b;
	b=exp(-0.083*a*0.1);
	return(b);
}
//----------------------------------------------
double func_steel(double a)
{
	double b;
	b=exp(-0.063*a*0.1);
	return(b);
}
//----------------------------------------------
double func_lead(double a)
{
	double b;
	b=exp(-0.042*a*0.1);
	return(b);
}
//--------------------------------------------------------------------
void draw_water(void)//绘制水的减弱函数
{
	//获得点表-------------------------------------
    p_water[0].x=0;//x理论值
	p_water[0].y=1;//y理论值
	for(int i=1;i<MAXPTS;i++)
	{
		p_water[i].x=i;//x理论值
		p_water[i].y=func_water(i);//y理论值
	}//结束for
	//输出点表
    //for(i=0;i<MAXPTS;i++)
	//{
		//cout<<"x="<<p_water[i].x<<" "<<"y="<<p_water[i].y<<endl;
	//}//结束for
	//转换为绘图空间的点表
    for(i=0;i<MAXPTS;i++)
	{
		p_water[i].x = DW + (p_water[i].x)*(W-2*DW)/1000.0;//
		p_water[i].y = (H-DH) - (p_water[i].y)*(H-2*DH);//
	}//结束for	
	//绘制点表-------------------------------------
    for(i=0;i<MAXPTS-1;i++)
	{
		moveto(p_water[i].x,p_water[i].y);//
		lineto(p_water[i+1].x,p_water[i+1].y);//
	}//
}//结束子函数
//------------------------------------------------------------------
void draw_concrete(void)//绘制混凝土的减弱函数
{
	//获得点表-------------------------------------
    p_concrete[0].x=0;//x理论值
	p_concrete[0].y=1;//y理论值
	for(int i=1;i<MAXPTS;i++)
	{
		p_concrete[i].x=i;//x理论值
		p_concrete[i].y=func_concrete(i);//y理论值
	}//结束for
	//输出点表
    //for(i=0;i<MAXPTS;i++)
	//{
		//cout<<"x="<<p_concrete[i].x<<" "<<"y="<<p_concrete[i].y<<endl;
	//}//结束for
	//转换为绘图空间的点表
    for(i=0;i<MAXPTS;i++)
	{
		p_concrete[i].x = DW + (p_concrete[i].x)*(W-2*DW)/1000.0;//
		p_concrete[i].y = (H-DH) - (p_concrete[i].y)*(H-2*DH);//
	}//结束for	
	//绘制点表-------------------------------------
    for(i=0;i<MAXPTS-1;i++)
	{
		moveto(p_concrete[i].x,p_concrete[i].y);//
		lineto(p_concrete[i+1].x,p_concrete[i+1].y);//
	}//
}//结束子函数
//------------------------------------------------------------------
void draw_steel(void)//绘制钢铁的减弱函数
{
	//获得点表-------------------------------------
    p_steel[0].x=0;//x理论值
	p_steel[0].y=1;//y理论值
	for(int i=1;i<MAXPTS;i++)
	{
		p_steel[i].x=i;//x理论值
		p_steel[i].y=func_steel(i);//y理论值
	}//结束for
	//输出点表
    //for(i=0;i<MAXPTS;i++)
	//{
		//cout<<"x="<<p_steel[i].x<<" "<<"y="<<p_steel[i].y<<endl;
	//}//结束for
	//转换为绘图空间的点表
    for(i=0;i<MAXPTS;i++)
	{
		p_steel[i].x = DW + (p_steel[i].x)*(W-2*DW)/1000.0;//
		p_steel[i].y = (H-DH) - (p_steel[i].y)*(H-2*DH);//
	}//结束for	
	//绘制点表-------------------------------------
    for(i=0;i<MAXPTS-1;i++)
	{
		moveto(p_steel[i].x,p_steel[i].y);//
		lineto(p_steel[i+1].x,p_steel[i+1].y);//
	}//
}//结束子函数
//------------------------------------------------------------------
void draw_lead(void)//绘制铅的减弱函数
{
	//获得点表-------------------------------------
    p_lead[0].x=0;//x理论值
	p_lead[0].y=1;//y理论值
	for(int i=1;i<MAXPTS;i++)
	{
		p_lead[i].x=i;//x理论值
		p_lead[i].y=func_lead(i);//y理论值
	}//结束for
	//输出点表
    //for(i=0;i<MAXPTS;i++)
	//{
		//cout<<"x="<<p_lead[i].x<<" "<<"y="<<p_lead[i].y<<endl;
	//}//结束for
	//转换为绘图空间的点表
    for(i=0;i<MAXPTS;i++)
	{
		p_lead[i].x = DW + (p_lead[i].x)*(W-2*DW)/1000.0;//
		p_lead[i].y = (H-DH) - (p_lead[i].y)*(H-2*DH);//
	}//结束for	
	//绘制点表-------------------------------------
    for(i=0;i<MAXPTS-1;i++)
	{
		moveto(p_lead[i].x,p_lead[i].y);//
		lineto(p_lead[i+1].x,p_lead[i+1].y);//
	}//
}//结束子函数
//------------------------------------------------------------------
void draw_all(void)//
{
    cleardevice();//
	//绘图区间的内外框线----------------------------
	setcolor(RGB(255,0,0));//设置颜色为红色
	rectangle(DW,DH,W-DW,H-DH);//绘制外框线
	//setcolor(RGB(0,255,0));//设置颜色为绿色
	//line(W/2,DH,W/2,H-DH);//内框线竖直线
	//line(DW,H/2,W-DW,H/2);//内框线水平线
	//画x轴刻度标线及文字---------------------------
	double value;//定义双精度变量
	char stt[10];//定义字符数组
	double xstep=(W-2*DW)/nx;//x方向步长(nx个刻度)
	double ystep=(H-2*DH)/ny;//y方向步长(ny个刻度)
	for(int i=0;i<=nx;i++)
	{
		setcolor(RGB(255,255,255));//设置当前颜色为白色
		line(DW+xstep*i,H-DH,DW+xstep*i,H-DH-5);//画竖直小刻度线
		value=1000.0*i/nx;//所在的刻度数值
		gcvt(value,3,stt);//将浮点数value转换为字符串stt
		outtextxy(DW+xstep*i-10,H-DH-20,stt);//在规定的位置放置字符串
	}//结束for
	//画y轴刻度标线及文字---------------------------
	for(i=0;i<=ny;i++)
	{
		setcolor(RGB(255,255,255));//设置当前颜色为白色
		line(DW,DH+ystep*i,DW+5,DH+ystep*i);//画水平小刻度线
		value=1.0-1.0*i/ny;//所在的刻度数值
		gcvt(value,3,stt);//将浮点数value转换为字符串stt
		outtextxy(DW+15,DH+ystep*i,stt);//在规定的位置放置字符串
	}//结束for
	setcolor(RGB(0,225,130));//设置颜色
	draw_water();//绘制水的减弱函数
	setcolor(RGB(0,225,130));//设置颜色
	draw_concrete();//绘制混凝土的减弱函数
	setcolor(RGB(0,225,130));//设置颜色
	draw_steel();//绘制钢铁的减弱函数
	setcolor(RGB(0,225,130));//设置颜色
	draw_lead();//绘制铅的减弱函数
}//结束子函数

文章来源:https://blog.csdn.net/gisshow135540019/article/details/135099202
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。