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.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();
借鉴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