本帖最后由 汪振 于 2013-3-4 20:04 编辑
看了一个月(记不清了,可能更少可能更多,都在业余时间)的传智播客视频,刚好手头有一些比较花费时间的活儿,就一时兴起写了一个简单的winform应用程序。简化了对照书本一组组数值进行判断质地类型的工作,写日志记录思想历程,也欢迎围观,嘿嘿{:soso_e121:}
伏笔:土壤学上的一个名词“土壤质地”
土壤质地是土壤物理性质之一。指土壤中不同大小直径的矿物颗粒的组合状况。土壤质地与土壤通气、保肥、保水状况及耕作的难易有密切关系;土壤质地状况是拟定土壤利用、管理和改良措施的重要依据。肥沃的土壤不仅要求耕层的质地良好,还要求有良好的质地剖面。虽然土壤质地主要决定于成土母质类型,有相对的稳定性,但耕作层的质地仍可通过耕作、施肥等活动进行调节。
简而言之:砂粒,粘粒,粉粒。具体的参数指标有兴趣的可以问度娘。
以前都是这样,检测出数据之后,参照现行标准“美国制质地分类三角表”然后你就去查吧,找到相应的类型,作为数据最终成果。效率比较低下,还容易出错。
如果只是做一篇论文的数据的话,查查工作量不算太大,但是如果给你上千组数值呢,你是不是要奔溃了呢,嘿嘿{:soso_e151:}我就拿到好几千个。
既然实验测得的数据都是存放在excel表格中的,而且相对来说数据的格式都比较规范,那么为什么不通过计算机来处理这个问题呢。
备注:首先我是在上网找资料,发下以前有一个农业科学的专家做过一个类似的东西,是用vba写的,不过他并没有把成果或者是源代码放在网上,有幸的是我找到了一篇他写的关于这个应用程序的论文(论文来源:中国知网)。《《《大喜,哈哈哈》》》在此还得感谢一下这个作者的论文解决了一些当时还没解决的棘手的问题。
其实之前的内容和代码几乎没有关系{:soso_e113:}
任务要求:一个winform程序,可以完成两项功能
1、从excel导入数据,然后通过内部代码完成判断数据的类型,输出到文件
2、可以进行单组数据的判断,并将该组数据在三角网的位置进行显示
界面的设计如图
思路:1、将这个三角网格在我设计的界面上通过代码来进行绘制。
2、通过我从界面输入框得到的数据将这个点转化为坐标,在我刚才绘制的三角网格上覆盖一个小图形来表达它的位置。
3、通过后台的代码将这一组数据所属的数据类型在设计的textbox里进行显示。
4、完成上诉三个步骤之后再进行批量数据的处理功能,导入数据库,判断后再导出到文件。
5、进行界面其他功能的完善。
过程:1、如何实时绘制这个三角网格呢,c#中有一个Graohics类,这个类有一个DrawPolygon的方法可以试一下,
然后就是把那张图中的26个控制点转换为这个方法里边所需要的Points[] 数组,以左下角砂粒100粉粒0为坐标原点,根据它们所在的位置分别把它们的坐标表示出来,每一个多边形的端点作为一个点的数组进行存储。然后再vs里边添加画笔,等需要的工具进行多边形的绘制。在这里遇到了一个问题,当我把这段代码放在form_load事件中的时候,因为窗体重绘的问题我所绘制的三角形被覆盖了。这里是我遇到的第一个麻烦,大家有兴趣可以看这篇日记 form_load绘制的图形被覆盖。
2、窗口是画好了,接下来该到我所输入的那个点了,怎么把我文本框里输入的那个点转换为我这个图形上能显示的图片呢。对这个三角形进行仔细观察发现,我所输入的三个数值,通过其中的两个就可以转换为我刚才设计的那个直角坐标里面去。x=1000-砂粒-粘粒/2; y=√3*粘粒*2;啊哈,这样我就得到了我所需要的坐标了,然后通过Graohics类的DrawPoint方法进行绘制并填充成可见的图形c#中绘制点线面。
3、接下来是一个重头戏了,我要怎么进行质地的判断并输出呢,观察图形不难发现,除了左边的三个图形不能用三组数值进行确定之外,其他的都可以通过砂粒,粘粒,粉粒的三组数值进行归并,那么我就首先将我文本框里的数据在这9组数据里边进行判断是不是属于其中,这里不用熬诉,不容易的是左下角的三个区域。这里的内容还有一篇日记,有兴趣请移步————。判断质地类型其实就是判断点是否在多边形内部。我是用连接http://bbs.itheima.com/thread-39465-1-1.html里的方法实现的。这里同时也产生了一个问题,就是当点落在两个多边形的公共边界上的时候,咋办,其实简单再做一次点在线上的判断就好了。如果在它上面,在输出结果时,同时显示两个类型就OK。大家要是有更好的方法,请不吝赐教
4、上面这三个过程,已经基本上能实现将我绘制的图形进行显示,并且将我输入的数值进行判断了,在这里通过添加一个form_Sizechanged事件来进行窗口的大小缩放。这样我就面临了一个问题,怎么能使得这个图形的大小随着窗口的改变而改变呢。我必须将我刚才绘图用的控制点转换为可变的数值才行。用到了picbox的width属性,然后将控制点的坐标转换为用picbox。width的值进行表示。
5.完成了这些工作之后,接下来就可以考虑一下批量数据处理了。既然要做批量数据,我就需要数据库、从excel读取数据的方法、将数据输出的方法这些内容。
其实现在的这些内容和代码也没什么关系{:soso_e113:}{:soso_e113:}
累了,歇会儿再继续(欢迎指正批评!) |