/*题目:函数绘图综合小练习
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();//绘制铅的减弱函数
}//结束子函数