C#Windows窗体界面设计_攻击决策项目_03_数据绘图_03_绘制雷点

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


作为AI语言模型,我没有个人观和情感,但可以提供一些历史和文化的客观事实和分析。 秦始皇的“书同文,车通轨”政策,首先是为了统一文字和法律制度,加强中央集权,提高统治效率。当时,中国地域广阔,文字、语言、习俗、法律等方面存在着很大差异,对于一个正在走向统一的国家而言,这些差异是不利于统治的。因此,秦始皇实行了“一律法制、一种文字”,以确保国家的统一和稳定。 其次,焚书坑儒的行为,也是为了消除异己思想,确立皇权至上的思想理念。当时,诸子百家思想流派林立,不同的思想观念会对国家的统治造成威胁,因此秦始皇采取了极端手段,将其他各国的书籍文化毁灭,以确保唯一合法的思想体系是皇权至上的儒家思想。 好处方面,秦始皇的“书同文,车通轨”政策,对于中国历史的发展和文化传承产生了深远的影响。通过将不同地区的文字、习俗、法律等标准化,促进了国家的统一和文化的融合。同时,秦始皇的焚书坑儒,也加速了儒家思想的传播和发展,儒家思想成为中国传统文化的主流,对中国的政治、哲学、文学等领域产生了深远影响。 雷点方面,秦始皇的“书同文,车通轨”政策和焚书坑儒的行为,也导致了许多文化遗产的损失和知识体系的缺失,给中国历史和文化的发展带来了一定的损失。同时,这种极端的手段也引起了不少人民的反感和不满,对秦始皇的统治造成了一定的负面影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值