您的位置:首页 > 编程语言 > C#

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.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息