C#Windows窗体界面设计_攻击决策项目_03_数据绘图_03_绘制雷点
2013-10-26 21:47
585 查看
Author: binzhouweichao@163.com
Copyright (c) 2013, Liu Xiaojian@BIT, All Rights Reserved.
Date: 2013-10-26
声明:本程序供参考;允许二次开发,但不允许在毫无更改的情况下占为己有。
9. 绘制雷点。
虽然固定了雷点数目为7个(1个中央结点,即原点,六个攻击探测雷点),为了使得程序能够扩展,设定中央雷点不变,其余雷点按照以中央雷点为圆心的圆分布,第一个攻击雷点位于x轴正向(即0°),半径为通信距离(Communication Range)。
9.1 建立雷点数据属性结构
雷点数据结构在GlobalVars中建立。
雷点的属性包含雷点的坐标、电量等权值,这里先只包含坐标属性,其余的后续再添加。
9.2 建立雷点数据
因为雷点数据可能在其他地方也需要用到,所以设置全局变量,放在GlobalVars中,使用List创建数据的数组。
数组的具体大小,在用到的地方定义。
9.3 雷点数据赋值
需要开放ParamsForm的CommunicationRange的TextBox的Text属性,作为半径。
在ParamsForm.cs中,开放控件属性部分添加:
在MyFunctions中自定义函数,用于建立雷点的数据,命名为CreateMinePointData()。
入口形参为雷点数,也就是ParamsForm的MinePointCounts的Text。
注:如果对于雷点的数据属性做修改,添加某些属性的话,参考http://blog.dcdlike.com/?p=701,即某元素整体保存下来,添加后整体赋值过去,不能单独赋值某个属性,因为struct类型的原因,报不是变量的错误。
9.4 绘制雷点
在MyFunctions中自定义函数,自定义绘制雷点的数据,命名为PaintMines(),入口形参为雷点数据。
因为需要用到与绘制坐标轴相同的坐标系,所以,将gAxis保存为全局变量。
在GlobalVars中,定义全局变量gAxis,用于保存当前的坐标系:
修订MyFunctions中的CreateAxis()方法,将里面的gBAxis用全局变量Globalvars.gBAxis代替:
注:修订后,虽然一个是全局变量,一个是局部变量,但是当此处局部变量gBAxis改变时,GlobalVars.gBAxis也随着改变,也就是说,这两个里面的东西共同指向同一个地址单元,所以,如果释放gBAxis,相应的全局变量也被释放了。。
借鉴8.2的绘制原点的方法,将绘制雷点补充完整:
9.5 显示雷点
上述雷点与坐标轴在一个BMP图像上,所以显示图像的函数就是显示坐标轴的函数,只需要在显示之前添加上述函数即可。
这样,在MainForm窗体Load和点击Params的OK按钮后,加上绘制雷点的函数。
由于雷点数是Params的私有成员,需要对MainForm开放,打开ParamsForm,在开放控件属性处,将Communication
回到MainForm的Load事件:
同理,将上述显示雷点的过程修订到ParamsForm的OK按钮的Click事件中。
项目代码:
http://yunpan.cn/Q9KmgEZnSkSuv
Copyright (c) 2013, Liu Xiaojian@BIT, All Rights Reserved.
Date: 2013-10-26
声明:本程序供参考;允许二次开发,但不允许在毫无更改的情况下占为己有。
9. 绘制雷点。
虽然固定了雷点数目为7个(1个中央结点,即原点,六个攻击探测雷点),为了使得程序能够扩展,设定中央雷点不变,其余雷点按照以中央雷点为圆心的圆分布,第一个攻击雷点位于x轴正向(即0°),半径为通信距离(Communication Range)。
9.1 建立雷点数据属性结构
雷点数据结构在GlobalVars中建立。
雷点的属性包含雷点的坐标、电量等权值,这里先只包含坐标属性,其余的后续再添加。
//9.1 创建雷点的属性结构 public static struct minepoint { //坐标属性 PointF Location; //其他属性待续 };
9.2 建立雷点数据
因为雷点数据可能在其他地方也需要用到,所以设置全局变量,放在GlobalVars中,使用List创建数据的数组。
//9.2 创建雷点数据 private static List<minepoint> minepointdata; public static List<minepoint> minePointData { set { minepointdata = value; } get { return minepointdata; } }
数组的具体大小,在用到的地方定义。
9.3 雷点数据赋值
需要开放ParamsForm的CommunicationRange的TextBox的Text属性,作为半径。
在ParamsForm.cs中,开放控件属性部分添加:
//9.2 开放CommunicationRange的Text只读属性 public string comRangeText { get { return this.mineCommunicationTextBox.Text; } }
在MyFunctions中自定义函数,用于建立雷点的数据,命名为CreateMinePointData()。
入口形参为雷点数,也就是ParamsForm的MinePointCounts的Text。
//9.3 赋值雷点 public static void CreateMinePointsData(int minePointCounts) { GlobalVars.minePointData = new List<GlobalVars.minepoint>(minePointCounts - 1);//建立雷点数组,数目为雷点数-1(扣除中央结点) double radianInterval = 2 * Math.PI / (minePointCounts - 1);//定义圆上的弧度间隔 for (int i = 0; i < minePointCounts - 1; i++) { double currentRadian = i * radianInterval;//设置当前i下的弧度 GlobalVars.minepoint currentMinePointData = new GlobalVars.minepoint();//设置当前点的结构 currentMinePointData.Location.X = (float)(int.Parse(GlobalVars.mainForm.paramsForm.comRangeText) * Math.Cos(currentRadian));//当前点横坐标 currentMinePointData.Location.Y = (float)(int.Parse(GlobalVars.mainForm.paramsForm.comRangeText) * Math.Sin(currentRadian));//当前点纵坐标 GlobalVars.minePointData.Insert(i, currentMinePointData);//将当前点插入到List的i位置 } }
注:如果对于雷点的数据属性做修改,添加某些属性的话,参考http://blog.dcdlike.com/?p=701,即某元素整体保存下来,添加后整体赋值过去,不能单独赋值某个属性,因为struct类型的原因,报不是变量的错误。
9.4 绘制雷点
在MyFunctions中自定义函数,自定义绘制雷点的数据,命名为PaintMines(),入口形参为雷点数据。
因为需要用到与绘制坐标轴相同的坐标系,所以,将gAxis保存为全局变量。
在GlobalVars中,定义全局变量gAxis,用于保存当前的坐标系:
//9.4 全局坐标系 private static Graphics gbaxis; public static Graphics gBAxis { set { gbaxis = value; } get { return gbaxis; } }
修订MyFunctions中的CreateAxis()方法,将里面的gBAxis用全局变量Globalvars.gBAxis代替:
//9.4 修订坐标系全局变量 GlobalVars.gBAxis = gBAxis; //释放资源 pBAxis.Dispose(); //gBAxis.Dispose(); oBrush.Dispose(); xyBrush.Dispose(); myFont.Dispose();
注:修订后,虽然一个是全局变量,一个是局部变量,但是当此处局部变量gBAxis改变时,GlobalVars.gBAxis也随着改变,也就是说,这两个里面的东西共同指向同一个地址单元,所以,如果释放gBAxis,相应的全局变量也被释放了。。
借鉴8.2的绘制原点的方法,将绘制雷点补充完整:
//9.4 绘制雷点,入口形参为雷点数据 public static void PaintMines(List<GlobalVars.minepoint> minePointData) { SolidBrush mineBrush = new SolidBrush(Color.Black);//建立雷点画刷 //8.2 设定点的大小,带放大倍数 float pointSize = 5F / GlobalVars.scaleTimes; for (int i = 0; i < minePointData.Count; i++)//for循环描点,总点数为雷点数(不包含中央结点) { //8.2 填充点 //gBAxis.FillEllipse(oBrush, oAxis.X - pointSize / 2, oAxis.Y - pointSize / 2, pointSize, pointSize); GlobalVars.gBAxis.FillEllipse(mineBrush, minePointData[i].Location.X - pointSize / 2, minePointData[i].Location.Y - pointSize / 2, pointSize, pointSize); } //释放资源 mineBrush.Dispose(); }
9.5 显示雷点
上述雷点与坐标轴在一个BMP图像上,所以显示图像的函数就是显示坐标轴的函数,只需要在显示之前添加上述函数即可。
这样,在MainForm窗体Load和点击Params的OK按钮后,加上绘制雷点的函数。
由于雷点数是Params的私有成员,需要对MainForm开放,打开ParamsForm,在开放控件属性处,将Communication
//9.5 开放minePointCounts文本属性,只读 public string minePointCounts { get { return this.minePointCountsTextBox.Text; } }
回到MainForm的Load事件:
//7.2.4 使用默认值显示坐标轴 private void MainForm_Load(object sender, EventArgs e) { MyFunctions.CreateBAxis(); //MyFunctions.AxisShow(); //9.5 显示雷点 MyFunctions.CreateMinePointsData(int.Parse(GlobalVars.mainForm.paramsForm.minePointCounts));//创建雷点数据 MyFunctions.PaintMines(GlobalVars.minePointData);//绘制雷点 MyFunctions.AxisShow();//显示所有 }
同理,将上述显示雷点的过程修订到ParamsForm的OK按钮的Click事件中。
//7.2.5 重绘坐标轴 MyFunctions.CreateBAxis(); //MyFunctions.AxisShow(); //9.5 重新显示雷点 MyFunctions.CreateMinePointsData(int.Parse(GlobalVars.mainForm.paramsForm.minePointCounts));//创建雷点数据 MyFunctions.PaintMines(GlobalVars.minePointData);//绘制雷点 MyFunctions.AxisShow();//显示所有
项目代码:
http://yunpan.cn/Q9KmgEZnSkSuv
相关文章推荐
- C#Windows窗体界面设计_攻击决策项目_03_数据绘图_01_绘制坐标轴_修订ParamsForm
- C#Windows窗体界面设计_攻击决策项目_03_数据绘图_02_修订坐标轴和ParamsForm文本框数据
- C#Windows窗体界面设计_攻击决策项目_02_设计窗体_03_设置窗体弹出退出顺序
- C#Windows窗体界面设计_攻击决策项目_真实轨迹RealTrack
- C#Windows窗体界面设计_攻击决策项目_02_设计窗体_04_修订主窗体工具栏和状态栏
- C#Windows窗体界面设计_攻击决策项目_02_设计窗体_01_主窗体
- C#Windows窗体界面设计_攻击决策项目_01_系统架构
- C#Windows窗体界面设计_04_添加PictureBox控件绘图
- C#Windows窗体界面设计_06_通过调整坐标系来调整数据
- C#Windows窗体界面设计_01_绘制三角函数_附强制类型转换
- C#Windows窗体界面设计_01_绘制三角函数_五点作图法
- C#Windows窗体界面设计_攻击决策项目_02_设计窗体_02_子窗体
- C#Windows窗体界面设计_03_坐标系平移 旋转 镜像
- C#Windows窗体界面设计_02_绘制三角函数_多点作图法
- C#Windows窗体界面设计_01_绘制三角函数_五点作图法
- C#Windows 窗体设计-实现欢迎界面-显示About窗体-在托盘中写入应用程序图标
- C#Windows窗体界面设计_05_添加菜单栏 工具栏 状态栏 按钮
- C#Windows窗体界面设计_07_多窗体设计
- C#界面设计之窗体绘制
- C#Windows窗体界面设计_01_绘制三角函数_附强制类型转换