# MiniMine **Repository Path**: solve_id22/mini-mine ## Basic Information - **Project Name**: MiniMine - **Description**: MiniMine数字矿山系统 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 3 - **Created**: 2022-06-17 - **Last Updated**: 2025-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
文档编号:_2022061601_
文档编号: 2022061601_
所属项目: MiniMine数字矿山
文件类别:详细说明书
版 本 号:01
编 写 者:未来无限公司项目组全体成员
审 核 者:
批 准 者:
目录
1 引言....................................................................... 1
1.1 编写目的............................................................... 1
1.2 背景................................................................... 1
1.3 参考资料............................................................... 3
2 程序系统的结构............................................................. 4
2.1 数据访问操作(DAO).................................................... 5
2.2 数据输入输出模块(DIO)................................................ 5
2.3 用户交互模块(UserInteraction)........................................ 6
2.4 三维建模模块(Modeling3D)............................................. 9
2.5 储量估算模块(ReserveEstimation)..................................... 12
2.6 VR三维矿山模块........................................................ 14
2.7 三维矿山APP模块...................................................... 14
2.8 数据结构设计.......................................................... 15
2.8.1 表项结构体.......................................................... 15
2.8.2 矿体图元数据结构.................................................... 17
3 数据访问操作(DAO)..................................................... 21
3.1 插入操作(insert).................................................... 21
3.2单用户查询(UserDao::selectOne)..................................... 23
3.3查询钻孔信息(selectAll)设计说明...................................... 25
4 数据输入输出(DIO)....................................................... 27
4.1 用户登陆/注册登陆..................................................... 27
4.2数据输入............................................................... 28
4.3 图层数据导出.......................................................... 32
4.4 钻孔数据EXCEL导出.................................................... 33
5 用户交互模块(DIO)....................................................... 34
5.1 数据输入输出模块交互(IOUI).......................................... 34
5.2 矿山边界表面模型交互(MineBoundarySurfaceUI)......................... 36
5.3 矿体面模型建立交互(OreDecentModelUI)................................ 36
5.4 块体模型交互(BlockModel)............................................ 36
6 三维建模模块(Modeling3D).................................................. 36
6.1 三维地表模型生成...................................................... 36
6.2 钻孔可视化模块(DrillingData3DModel)................................. 41
6.3 矿体边界表面模型...................................................... 46
6.4 块体模型.............................................................. 51
7 储量估算模块(ReserveEstimation)............................................ 57
7.1 机器学习品位估值...................................................... 57
7.2 IDW品位估值........................................................... 63
7.3 储量输出报表.......................................................... 67
8 VR三维矿山模块............................................................ 72
8.1 主相机漫游............................................................ 72
8.2 手柄按键监听和事件注册................................................ 73
9 三维矿山APP模块.......................................................... 75
9.1 矿山块体模型构建(Model)............................................. 75
9.2 放大缩小和旋转功能(Touch)........................................... 77
9.3 对象属性查看功能(AttributeView)..................................... 79
为推动甲方公司下属矿山的数字化、信息化、智能化工作,本项目拟在三维可视化环境下开发“MiniMine数字矿山系统”。在前期本项目已经完成了需求分析说明书的设计与撰写,对于用户的需求以及一系列亟待解决的问题有了更加清晰的认识。在此基础上,我们将编写详细设计说明书,将需求分析中得到的系统扩展用例图转换为软件结构和数据结构。
在本说明书中我们将对系统如何实现进行概括性的分析与阐述,从而规划出系统的总体设计方案,具体包括如下内容:
A. “MiniMine“数字矿山系统”的总体结构框架;
B.
“MiniMine”数字矿山系统”的模块层次划分;
C.
“MiniMine“数字矿山系统”各个模块应具有的详细功能要求、接口和数据库等方面的设计说明;
D. “MiniMine"数字矿山系统”各个模块之间的调用关系描述。
总而言之,在本说明书中会明确描述所有输入输出参数、类型逻辑算法以及调用关系,搭建出本系统的总体框架和设计蓝图,同时也后续的作为开发人员和测试人员进一步变成和编写测试用例依据。
读者:软件使用人员、开发人员。
数字矿山是以矿山系统为原型,以地理坐标为参考系,以矿山科学技术、信息科学、人工智能和计算科学为理论基础,可用多媒体和模拟仿真虚拟技术进行多维的数字化、网络化、可视化的技术系统,是对真实矿山的数字化再现。自1999年首届“国际数字地球大会”上提出了“数字矿山”概念以来。数字矿山的思想已经开始深入人心.数字矿山科学研究与技术攻关正在悄然兴起。国内外专家和学者在数字矿山或者智能矿山方面做了大量的研究工作,并取得了丰硕的成果。采矿业发达国家的矿山信息化改造已迈出了坚实的步伐,国际著名矿山企业——加拿大国际镍公司(Inco)从20世纪90年代初开始在数字化矿山的基础上研究遥控采矿技术,目标是实现整个采矿过程的遥控操作。现在Inco公司已研制出样机系统.并在加拿大安大略省的萨德泊里盆地的几家地下镍矿试用,实现了从地面对地下矿山远程控制。甚至可以从400km以外的多伦多对地下镍矿的采、掘、运等活动进行远距离控制。遥控采矿的核心部件是Inco公司开发的一个能在地下获取定位数据的名为“Horta”的装置。将该装置安装在地下观测车上,当观测车在地下或矿体内部巷道中漫游时,就会利用激光陀螺仪和激光扫描仪在水平和垂直面上扫描矿山巷道的断面,进而产生巷道的三维结构图,加拿大已经在数字矿山和遥控采矿方面取得了巨大的成就。澳大利亚CSIRO在2001年的项“勘探和采矿数据四维可视化”用VRML和Java实现了一个交互的、四维可视化平台,该平台主要目的是集成钻孔、三维地震、地质、测量、地震、重力、地球物理等真三维数据,低价、高效、快速和便捷地显示在Internet上,为用户提供一个交互、易理解的、与平台无关的煤矿虚拟环境,并实现了三维数据的解释、验证和认知。
地质工作计算机化要求的日益提高和三维地震勘探技术的发展,以及GIS向矿业领域的渗透为三维地质模拟的研究和软件开发提供了新的动力,促进了矿业信息化建设水平的提高。自20世纪80年代以来,围绕矿山、地质和岩土工程应用,国际上开发了多种三维地质软件。以1988年法国Nancy大学的J.L.Mallet教授推出GOCAD(地质对象计算机辅助设计)为例,其目的是满足地质、地球物理和油藏工程的三维模拟与辅助设计需要。在20世纪90年代,国际上许多著名地质采矿软件公司相继开发了地下三维可视化方面的软件,如英国的DataMine&Guiole,澳大利亚Maptek公司的Vulcan,加拿大Lynx公司的Lynx、Microlynx,美国Mirrison—knudson公司的地质软件包EAGKES,还有其他国家的如Micromine、Minescape、Suvcad、CRYSTAL、Mine—Pitopt、Geostart、Suiypac2000、GtPSS/H、Geocomp、Surpac[9]、Whitle3D和4D等地质采矿软件,这些软件从矿床模拟、开采评估、设计规划、空间数据库的建立、三角网生成方法、三角网面模型构建方法、地质体边界的圈定和连接、储量计算方法、生产管理等多方面对数字化矿山的建设起到了巨大地推动作用。我国矿山信息化建设的现状是总体水平不高,没有形成企业信息化决策和矿业信息产业化发展的规模优势,信息基础设施落后,可共享的信息量少,信息流向单一、无序,在矿山数字化技术水平方面与发达国家相比,还有很大的差距。近年来,我国矿山信息化、数字化、智能化建设进行了大量地研究工作:中国矿业大学等单位也相继开展了采矿机器人(MR)、矿山地理信息系统(MGIS)、三维地学模拟3DGM)、矿山虚拟现实(MVR)、矿山GPS定位等方面的技术开发与应用研究。随着实时矿山测量、CPS实时导航与遥控、GIS管理与辅助决策和3DGM的应用,一些大型露天矿山(包括平朔、霍林河矿区)已可在办公室里生成矿床模型、矿山采掘计划,并与采场设备相联系,形成动态管理与遥控指挥系统。
数字矿山于2008年末被列为国家"863计划"。数字矿山是以计算机及其网络为手段,把矿山的所有空间和有用属性数据实现数字化存储、传输、表述和深加工,应用于各个生产环节与管理和决策之中,以达到生产方案优化、管理高效和决策科学化的目的。
2017年国土部发文《建立完善推动绿色矿业发展的六大支撑体系》,其中明确指出科学技术是第一生产力。应将绿色发展的基点放在科技创新上,着力构建绿色技术支撑体系。一要大力实施“三深一土”战略,积极推展绿色矿业发展新空间。二要大力发展精细勘查、综合开采、节约集约、循环利用等新技术新工艺新装备。三要加快建设数字化、智能化、自动化矿山,大力发展互联网+矿业。
A.
待开发的软件系统的名称:MiniMine 数字矿山系统。
B.
项目的任务提出者:坤迪公司。
C.
项目的开发者:未来无限公司项目组全体成员。
D.
项目的用户:坤迪公司矿山工作者。
E.
实现该软件的计算中心或计算机网络:坤迪公司服务器及网络设备。
F.
该软件系统同其他系统或其他机构的基本的相互来往关系:在QuantyView4.0 软件基础上进行二次开发。
[1]李兆亮,王林飞,熊盛青,罗锋,闫浩飞,朱自强.
基于轮廓线三维矿体表面重建的一种改进算法[J].
物探与化探,2019,43(01):118-124.
[2]冀晓伟,卢才武,李海波.
三维矿体表面建模中的三角剖分技术及其应用[J].
金属矿山,2011,(02):106-110+114.
[3]张宝一,尚建嘎,吴鸿敏,刘修国,吴信才. 三维地质建模及可视化技术在固体矿产储量估算中的应用[J].地质与勘探,2007,(02):76-81.
[4]李章林,吴冲龙,张夏林,翁正平,王平.
IDW矿石品位估值结果的不确定性评价[J].
地球科学(中国地质大学学报),2015,40(11):1796-1801.
[5]谭正华,荆永滨,王李管,文中华,黄俊歆,陈建宏.基于空间变异性的IDW矿石品位估值改进方法[J].中国矿业大学学报,2011,40(06):928-932.
[6]魏一鸣,王志民,童光煦.神经网络在矿床品位估计中的应用研究[J].
中国锰业,1995
(05):9-13.
[7]李梅,杨帅伟,孙振明,吴浩.智慧矿山框架与发展前景研究[J].煤炭科学技术, 2017, 45(01):121-128+134.DOI:10.13199/j.cnki.cst.2017.01.021.
[8]唐庆腾.
数字矿山三维可视化及虚拟现实技术研究[D].
中国矿业大学,
2018.
本系统的设计主要包含了数据访问操作模块DAO,数据的输入输出模块,矿体图元模块,用户交互模块,三维建模模块,储量估算模块,VR三维矿山模块,Android
APP模块。整体框架图如下图2.1所示。每个模块的描述与包含元素如下。

图2.1
系统框架图
在DAO模块中,主要为各个表的增删改查,各个表的操作及其标识符如下表所示。
表2.1 DAO模块表项说明
|
用户表:UserDao |
插入:bool insert(User_ST user); |
|
查询:bool selectOne(User_ST& user); |
|
|
用户钻孔表:UserDrillDao |
插入:bool insert(User_ST user, DrillGeneral_ST st); |
|
查询:vector<DrillGeneral_ST>
selectExplor(User_ST user); |
|
|
钻孔概况表:DrillGeneralDao |
插入:bool insert(DrillGeneral_ST st); |
|
查询:vector<DrillGeneral_ST>
selectExplor(string kantanqu_no); |
|
|
钻孔斜侧表:DrillCexieDAO |
插入:bool insert(DrillCexie_ST st); |
|
查询:vector<DrillCexie_ST>
selectAll(string kantanqu_no,string zk_no); |
|
|
钻孔分层特征记录:DrillFloorDAO |
插入:bool insert(DrillFloor_ST st); |
|
查询:vector<DrillFloor_ST>
selectAll(string kantanqu_no, string zk_no); |
|
|
样品记录表:SampleDAO |
插入:bool insert(SampleRecord_ST st); |
|
查询:vector<SampleRecord_ST>
selectAll(string kantanqu_no, string zk_no); |
|
|
矿体样品记录表:OrebodyTypeDAO |
插入:bool insert(OreGrade_ST st); |
|
查询:vector<OreGrade_ST>
selectDrill(string kantanqu_no, string zk_no); |
在用户输入输出模块之中,主要为用户的登录注册函数、绑定函数和插入函数。本模块的主要功能需要调用DAO模块中的部分函数,对用户表、用户钻孔表以及钻孔数据进行相关操作。
1、注册函数(UserRegister)bool UserRegister(User_ST user):该函数执行用户注册功能,该功能调用DAO模块,对用户表(UserDAO)进行插入操作。
2、登陆函数(UserDAOerLogin)bool
UserDAOerLogin(User_ST
user):该函数执行用户登录功能,该功能调用DAO模块,对用户表(UserDAO)进行查询操作。若用户已在注册表中存在,则允许登录,否则提示用户进行注册或重新输入用户信息。
3、绑定函数(UserBind)bool UserBind(User_ST user, UserDrillDao drill):该函数执行用户与钻孔数据绑定操作,该功能调用DAO模块,对用户钻孔表(UserDrillDao)进行插入操作。
4、插入函数(UserInsert):该函数执行钻孔数据插入操作,该功能调用DAO模块,可对DMZK0202钻孔测斜记录表、DMZK0401钻孔概况表、DMZK0402钻孔分层特征信息表、DMZK0406钻孔样品记录、DMZK0406钻孔样品信息进行插入操作。
1、数据输入输出模块交互(IOUI):
该函数实现数据输入输出与用户的交互功能。注册登陆功能:根据用户的选择进行操作,并调用DAO模块,实现用户表的插入、查询;钻孔数据输入功能:在输入界面接收用户所输入的数据,并对数据进行格式检查。在此过程中根据用户输入向用户发出提示,便于用户的使用;数据文件导出:用户选择该功能,向用户提供选择文件路径的对话框,系统接收到文件路径之后便将数据存储到相应路径中,此过程中向用户发出导出失败或导出成功的界面提示。
2、矿山边界表面模型交互(MineBoundarySurfaceUI):
该函数实现建立矿山三维地表模型与用户的交互功能,需要用户选择gvp格式的等高线数据文件并且选择需要建立模型的等高线实现数据的输入,用户选择的等高线精度决定了建立的模型的精度,然后与系统依据用户选择的等高线数据调用三维建模板块的矿山地表模型建立模块建立矿山的三维地表模型。

图2.2 矿山边界表面模型交互流程图
3、钻孔数据三维模型交互(DrillingData3DModelUI):
该模块为用户提供三种可选择的功能,输出钻孔几何模型、输出地层模型、输出矿体模型。用户可以根据自身需求选择建模的不同勘探区,系统处理勘探区内的所有钻孔数据来进行分析建模。
4、矿体面模型建立交互(OreDecentModelUI
):
该函数实现用户选择矿体数据进行三维矿体表面模型建模功能,用户在用户交互界面中选择要建模的矿体数据,选择三维矿体表面模型建模功能,系统读取要建模的三维矿体点,运行系统输出目标矿体的面模型。

图2.3 矿体面模型建立交互流程图
5、块体模型交互(BlockModel):
本程序设计流程如下:用户在系统中选择块体模型创建功能,弹出块体模型创建的对话框,读取并输出功能三的三维矿体面模型,点击选择相应的面模型对该面模型进行填充和划分,点击生成即可产生三维矿体的块体模型及其划分后的结果。

图2.4 块体模型交互流程图
6、品位估值交互(GradeEstimationUI)
(1)IDW估值(IDWGradeEstimation):该功能需要用户选择参估样品点限制条件,用户点击IDW估值按钮,系统弹出对话框提示用户输入。
(2)机器学习估值(MLGradeEstimation):该功能需要用户进行预估区域选择与算法设置操作。
区域选择:用户通过选取钻孔样品信息表中的钻孔信息(如勘探区、钻孔编号等),会调用块体生成模块,提取矿体块体信息;同时,设置算法的参数。上述步骤均作为储量估算模块的输入内容。

图2.5 机器学习估值界面效果图
(3)储量报表输出(ReservesReportOutput):
该功能需要用户进行估测矿体的选择,并选择输出报表功能进行报表。同时如果未选择选择矿体模型或矿体模型未进行品位估值操作,进行相应提示。在报表界面,用户需要根据提示填写报表所需信息文本。
1、矿山地表模型建立(BuildMineSurface):
该模块需要完成对于矿山边界表面模型交互模块中用户选择的等高线数据建立矿山三维地表模型(MineSurfaceModel),是基于等高线上的点利用三角网生长算法生成的不规则三角网,利用polygon的形式存储,输出的是gvp格式的文件。

图2.6 矿山地表模型建立流程图
2、钻孔可视化子模块(DrillVisual):
该模块完成钻孔的地层与数据样品可视化,主要包括钻孔模型、地层的岩性模型以及样品数据岩性。
(1)钻孔几何模型(DrillBuildModel):用户经过相关数据的导入,设计 getLine 函数通过计算起点深度与终点深度以及数据的使得使钻孔的模型初步显示出来。
(2)岩芯模型(CGV3dSurface):在钻孔的几何线条模型完成的基础上,可以建立三维的岩芯模型,模型建立完成后可以选择输出 CGV3dSurface 图层。
(3)矿体属性模型(BuildOreProperty):岩芯模型建立后,将钻孔数据中的矿体属性来与几何模型联系起来从而得到含矿图层。
(4)地层模型(BuildStratum):在岩芯模型建立的基础上,将钻孔数据中的岩性数据与岩芯模型组合,从而得到地层属性模型。
3、三维矿体块体模型建立(BlockModel):
(1)对所生成的表面模型数据进行处理和检测,并输出处理过后的三维矿体表面模型,对模型进行基本信息的判断(类型是否为多面体、数量是否为一个〉若输入的信息为一个多面体面模型数据,则继续进行三维矿体块体填充及分割程序,否则报错。
(2)对上一步所生成的三维矿体表面模型进行数据预处理,构建初始包围盒;
(3)运用算法构建三维矿体体模型并判断块体与包围盒的空间关系、矿体与面模型的空间关系;
(4)对构建出的体模型进行矿体填充;
(5)运用分割算法进行矿体分割;
(6)输出三维矿体模型,完成;

图2.7 三维矿体块体模型建立流程图
4、矿体面模型建立交互(OreDecentModelUI ):
该模块完成对钻孔数据可视化中的数据进行进一步操作处理,并将处理的数据供给块体模型建立使用。利用polygon的形式存储,输出为gvp文件。

图2.8 矿体面模型建立流程图
1、插值模块(Estimation):
(1)IDW插值:
实现IDW品位差值需要用户给出参估样品点限制条件(距待估值点距离),系统根据用户提供信息选取预估区域参估矿体块体信息数据(中心点坐标x,y,z;品位信息pt,px,pl),根据已有数据进行IDW品位估值,得到估值结果,从而得到未知矿体块体的品位信息。最后输出整个含全部品位信息的矿体块体模型。
实现本功能需要用到以下函数:
a、参数获取函数double GetIDWParameter():获取用户交互模块用户给出的样品点限制条件;
b、品位信息获取函数vector<vector<double>>
GetIDWGrade():获取参估区块体品位信息,包括中心点坐标x,y,z和品位信息pt,px,pl;
c、IDW算法实现函数vector<vector<double>>IDWEstimation(vector<vector<double>> Gradedata,vector<double> max_distance):根据参估样品点品位值进行IDW品位估值;
d、矿体块体图层输出函数void
OutPutIDWGrade():输出含全部品位信息的矿体块体模型。
(2)机器学习/人工智能插值:
机器学习插值部分的输入数据为用户交互模块输入的算法超参数以及选取区域的矿体矿体数据(包含该块体坐标点x、y、z,以及品位属性信息、品位含量信息),该程序接收到输入层的数据后,进行BP神经网络算法进行品位估值计算,将预估出的品位值赋给矿体块体图元。最终,该程序将完整的、含有全部品位信息的矿体块体图元图层输出。
本功能的实现需要四个函数,具体定义如下:
a、参数传递函数vector<double> GetBPParameter(double learning_rate,int
epoch):
该函数完成用户交互模块到储量估算模块的参数传递,该函数可获取BP神经网络算法所需要的学习率、训练步长。
b、训练区域数据传递函数vector<vector<double>>
GetBPTrainDataSet():
该函数将从用户交互模块获取到用户选择的预测区域,该函数将获取预测区域已知品位值的矿体块体图元的信息,包括中心坐标x、y、z,以及矿体块体的
品位信息。该信息将打包为一个vector对象,最终程序将返回vector<vector<double>>对象。
c、BP神经网络算法实现函数vector<vector<double>>
BPModel(vector<vector<double>> Gradedata,vector<double>
para):
该函数将接收训练区域数据传递函数得到的训练区域数据、参数传递模块得到的算法参数数据,从而为BP神经网络算法确定输入信息。接下来程序内将根据参数执行BP神经网络算法,预估未知品位信息的位置的品位值。最终程序将返回该图层块体的中心坐标、品位值数据,该数据将打包为vector<double>对象,最终程序返回vector<vector<double>>对象。
d、矿体矿体图层输出函数void
OutPutGrade(vector<vector<double>>
result):
该函数将BP神经网络算法的结果传入,获取到每一个矿体块体图元的位置信息和属性信息,接下来在矿体块体图层中遍历,将未具有品位值的矿体块体图元赋以品位值,最终将返回整个图层。
2、报表输出(Report):
该模块主要完成对于矿体的储量估计计算和统计,以及对获得的计算、统计结果进行报表输出。以标高划分统计输出数据,具体输出数据为:标高、平均品位、矿石量以及金属量。
首先,对于三维块体模型中的属性数据进行获取,再将这些数据进行储量计算。计算完毕后对获得的新数据进行统计,最后对统计结果进行报表输出。
报表输出模块需要调用插值生成的数据。生成的数据为矿体图元模块,主要是三维块体中包含的矿体信息。同时需要调用数据输入输出模块,输出相应的储量估计报表文档。需调用用户交互模块,需要用户选好需要估计储量的图层,点击报表输出的按键,以及点击选择报表按钮和填入提示文本。
报表输出的主要函数如下。根据流程特点,设计对应的函数以及辅助容器。
a、void CQuantyView3DView::onReport():该函数是数据的输入函数,选中矿体块体模型模块,将有效数据进行提取,存入新建容器中。设计全局变量三个vector<double>,用于作为存储数据的容器。
将数据进行统计以及计算,将计算结果输出至三个全局变量的vector中。
b、新建界面BOOL CMyRepor::OnInitDialog(),使用ListCtrl控件展示vector中的内容,即报表数据。实行界面交互,用户需要填写的信息在该界面编辑框内填写。
c、进行报表,此处为将ListCtrl控件内展示的储量信息进行输出。

图2.9 VR矿山模块
VR矿山模块的作用是提升矿山智能化和可视化管理水平,让用户在沉浸式的交互中更好地了解矿山的细节。
VR矿山模块的交互主要是用户通过手柄来完成,用户通过手柄上的按键来进行漫游方向的控制,通过手柄射线来与矿山进行交互。该模块包括三个功能:
(1)obj文件导入功能(FileImport):将三维矿山模型以obj的格式导入Unity3D,计算生成矿山虚拟场景。
(2)基本漫游功能(Roam):用户使用手柄在矿山中进行地面漫游和飞行漫游。
(3)属性查看功能(Interact):用户使用手柄射线与矿山交互,查看矿山的属性。

图2.10 三维矿山APP模块结构图
三维矿山APP模块是为了将建立的三维矿山场景搬运到 Android 手机平台上,从而方便查看矿山模型,该模块由obj文件导入、矿山的放大缩小、模型旋转和对象属性查看四个部分组成,因此程序系统的设计是基于各个功能来确立的,根据每个部分的需求,可划分为矿山块体模型的构建(Model),放大缩小和旋转功能(Touch)以及对象属性查看功能(AttributeView)的实现。
表2.2 三维矿山APP项目类和函数
|
矿山可视化:MineViewAPP; |
矿山块体模型构建:void Model(); |
|
放大缩小和旋转功能: void
touch(); |
|
|
对象属性查看功能:void AttributeView(); |
对每个表的各个表项进行一个简单的结构体定义,详细定义如下:
//用户结构体
struct User_ST
{
string
name;
string
password;
string
remark;
};
//钻孔概况结构体
struct DrillGeneral_ST
{
//勘探区编号
string
kantanqu_no;
//钻孔编号
string
drill_no;
//钻孔类型
string
type;
double
x, y, z;
//开孔日期
string
kaikong;
//终孔日期
string
zhongkong;
//终孔深度
double
deepth;
};
//测斜结构体
struct DrillCexie_ST
{
//勘探区编号
string
kantanqu_no;
//钻孔编号
string
drill_no;
//测点号
string
point_no;
//测点深度
double
point_depth;
//偏斜角采用值
double
point_pxangle_used;
//方位角检查值
double
point_fwangle_checked;
//方位角采用值
double
point_fwangle_used;
};
//钻孔分层特征记录结构体
struct DrillFloor_ST
{
//勘探区编号
string
kantanqu_no;
//钻孔编号
string
drill_no;
//岩层序号
string
rock_no;
//分层号
string
fenceng_no;
//岩石分层孔深
double
fenceng_rockdepth;
//分层岩心长度
double
fenceng_rockcoredepth;
//岩石全名
string
fenceng_rockname;
//备注信息
string
fenceng_note;
//岩层倾角
double
fenceng_rockangle;
};
//样品采样记录结构体
struct SampleRecord_ST
{
//勘探区编号
string
kantanqu_no;
//钻孔编号
string
drill_no;
//样品编号
string
sample_no;
//采样起始孔深
double
sample_begin;
//采样终止孔深
double
sample_end;
//样长
double
sample_length;
//岩矿心长度
double
samplecore_length;
//样品类型
string
sample_type;
};
//矿体样品记录结构体
struct
OreGrade_ST
{
//勘探区编号
string
kantanqu_no;
//钻孔编号
string
drill_no;
//样品编号
string
sample_no;
//样品起始孔深
double
sample_begin;
//样品终止孔深
double
sample_end;
//样长
double
sample_length;
//矿体名称
string
name;
//矿体品位值
double
grade;
};
对Quantyview中的个别图元进行继承,衍生出本系统中需要的对应图元,本次的矿体图元基类为含矿的一个数据结构,设计定义如下:
//矿体基类
class Mine
{
public:
Mine() {}
//输出到obj文件中
virtual
void outputToObj(ofstream& out,UINT
id) = 0;
//判断是否为矿
bool
isMine()
{ return grade > cutoffGrade; }
//设置品位
void
setGrade(double
grade__) { grade = grade__; }
//设置边界品位
void
setCutoffGrade(double cutoffGrade__) { cutoffGrade = cutoffGrade; }
//设置名称
void
setName(string
name__) { name = name__; }
//获取品位
double
getGrade()
{ return grade; }
//获取边界品位
double
getCutoffGrade(){ return cutoffGrade; }
//获取矿体名称
string
getName()
{ return name; }
protected:
//品位
double
grade;
//边界品位
double
cutoffGrade;
//矿体名称
string
name;
};
同时,我们还需要衍生出我们需要的块体,点,线,以及图层,各个图元与QuantyView中的图元继承关系,如下图所示。

图2.11 矿体图元类图
各个图元一次设计定义如下:
//含矿点
//继承于矿体和点
class MinePoint
:public Mine, public CGV3dPoint
{
public:
MinePoint()
{}
~MinePoint()
{}
virtual
UINT GetClass() { return CLASS_MINE_POINT; }
};
//含矿线
//继承于矿体和线
class MineLine
:public Mine, public CGV3dPolyline
{
public:
MineLine(){}
~MineLine()
{}
//获取所有含矿点
vector<MinePoint> getAllMinePoint();
virtual
UINT GetClass() { return CLASS_MINE_LINE; }
};
//含矿块体
//块体使用多面体来进行表达
class MineCube
:public Mine, public CGV3dPolyhedron
{
public:
MineCube()
{}
~MineCube()
{}
//通过块体的中心点和边长大小进行构建块体
void
setObject(XYZ
point, double a);
//获取体积
double
getVolume();
//获取矿体质量
double
getWeight();
//获取中心点坐标
XYZ
getCenter()
{ return center; }
//设置矿体密度
void setDensity(double density__)
{ density = density__; }
virtual
UINT GetClass() { return CLASS_MINE_CUBE; }
protected:
//边长
double
width;
//密度
double
density;
//中心点
XYZ
center;
};
//含矿图层
//继承于矿体和图层类
class MineLayer
:public Mine, public CGV3dLayer
{
public:
MineLayer()
{}
~MineLayer()
{}
//获取所有对象
vector<CGV3dObject*>
getAllObject();
//获取所有含矿点
vector<MinePoint*> getAllMinePoint();
virtual
UINT GetClass() { return CLASS_MINE_LAYER; }
};
本程序的主要目的为对数据库中的表进行一条记录的插入,本程序为数据操作的底层操作,无覆盖要求。对不同的表执行插入流程相同。
该程序的功能采用IPO图进行说明如下图所示:

图3.1 插入操作IPO图
要求在最多1s内将数据记录插入到数据库的用户表中。
每个表的输入项为每个表对应的结构体,以参数的形式传递,各个表对应的结构体名称如下表所示。
表3.1 表与结构体对应关系
|
表名 |
表标识符 |
结构体参数 |
|
用户表 |
User |
User_ST |
|
用户钻孔表 |
UserDrill |
User_ST,DrillGenral_ST |
|
钻孔概况表 |
DrillGenral |
DrillGenral_ST |
|
钻孔测斜记录表 |
DrillCexie |
DrillCexie_ST |
|
钻孔分层特征记录表 |
DrillFloor |
DrillFloor_ST |
|
样品采样记录表 |
SampleRecord |
SampleRecord_ST |
|
矿体样品记录表 |
OrebodyType |
OrebodyType_ST |
输出为返回结果值,为布尔类型结果。
表3.2 插入程序输出项说明表
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
返回值 |
return |
bool |
[0,1] |
返回值 |
本程序为数据的操作流程,重在流程逻辑,无算法。
本程序的主要流程为获取数据库,编写sql语句,执行sql语句,完成数据库的操作,根据数据库执行sql语句返回的值判断是否插入成功。流程图如下图所示。

图3.2 插入程序执行流程图
使用了各个表项对应的结构体,以及单例模式的数据库类指针,调用了数据库类中的sql执行语句函数,并获取返回值。
插入操作中,将给定的数据插入数据库,不需要多余的存储分配。
在首部,注释参数的意义,返回值意义,执行作用三个表项。
在调用其他模块部分注释说明调用了数据库的执行语句注释该操作。
程序运行的前提为必须成功连接了数据库,并数据库中含有该表项。
在测试数据库中进行100个数据的插入,测试70个应该插入成功的记录以及30个插入失败的记录进行测试。
本程序的主要目的为对数据库中用户表进行查询,查询出指定的用户名所对应的整个用户信息,可以被并发调用,是一个简单的查询函数。
查询出指定用户名的用户数据,返回查询结果,如果没有查询到对应的用户,则返回false。

图3.3 单用户查询IPO图
简单的查询操作,无特殊性能要求。
输入为用户名,说明如下表所示。
表3.3 单用户查询输入项说明表
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
用户名 |
name |
string |
无 |
参数传递 |
输出为查询结果以及对应用户信息,各个值的描述如下表所示。
表3.4 单用户查询输出项说明表
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
返回值 |
return |
bool |
[0,1] |
返回值 |
|
用户 |
user |
User_ST |
数据库来源 |
引用类型返回 |
功能性函数,无算法。
本程序的主要流程为获取数据库,编写sql语句,执行sql语句,完成数据库的操作,根据数据库执行sql语句返回的记录行数,获取相应的记录。流程图如下图所示。

图3.4 单用户查询执行逻辑流程图
使用了各个表项对应的结构体,以及单例模式的数据库类指针,调用了数据库类中的sql执行语句函数,并获取返回值。
查询过程,只查询一条记录,且空间由调用者分配,不占用存储分配。
在首部,注释参数的意义,返回值意义,执行作用三个表项。
在调用其他模块部分注释说明调用了数据库的执行语句注释该操作。
程序运行的前提为必须成功连接了数据库,并数据库中含有该表项。
在测试数据库中进行100个数据的查询,测试70个应该查询成功的记录以及30个查询失败的记录进行测试。
本程序的主要目的为在数据库中查询指定勘探区内钻孔号的信息。
查询勘探区号与钻孔号在数据库中相关的数据集,并将数据集进行返回。

图3.5 钻孔信息查询IPO图
简单的查询操作,无特殊性能要求。
输入为勘探区号和钻孔号,说明如下表所示。
表3.5
钻孔信息查询输入项说明表
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
勘探区号 |
kantanqu_no |
string |
无 |
参数传递 |
|
钻孔号 |
zk_no |
string |
无 |
参数传递 |
各个表项返回对应的结构体集合vector,各个表项对应的输出值描述如下表所示。
表3.6 钻孔信息查询输出项中表与结构体关系表
|
表名 |
表标识符 |
结构体参数 |
|
钻孔概况表 |
DrillGenral |
DrillGenral_ST |
|
钻孔测斜记录表 |
DrillCexie |
DrillCexie_ST |
|
钻孔分层特征记录表 |
DrillFloor |
DrillFloor_ST |
|
样品采样记录表 |
SampleRecord |
SampleRecord_ST |
|
矿体样品记录表 |
OrebodyType |
OrebodyType_ST |
功能性函数,无算法。
本程序的主要流程为获取数据库,编写sql语句,执行sql语句,完成数据库的操作,根据数据库执行sql语句返回的记录行数,获取相应的记录。流程图如下图所示。

图3.6 钻孔信息查询执行逻辑流程图
使用了User表项对应的结构体User_ST,以及单例模式的数据库类指针,调用了数据库类中的sql执行语句函数,并获取返回值。
插入操作中,将给定的数据插入数据库,不需要多余的存储分配。查询操作中,需要分配从数据库中查询出的结果集的存储大小,不超过对应的表的大小。
在首部,注释参数的意义,返回值意义,执行作用三个表项。
在调用其他模块部分注释说明调用了数据库的执行语句注释该操作。
程序运行的前提为必须成功连接了数据库,并数据库中含有该表项。
在测试数据库中进行100个数据的查询,对查询结果进行正确性的检查。
用户需要进行数据的相关操作时,需要进行登录操作。若用户未进行登录,便向用户提供注册功能。本程序常驻于内存内,可重入,无覆盖要求,在运行时要求程序顺序处理。
用户登陆程序接收用户所输入的账号和密码,然后将用户名与密码与DAO模块中所建立的用户表进行比对,若比对成功,则用户登入系统,反之则向用户发出注册提示,再进行登陆。
精度要求:无
灵活性要求:无
时间特性要求:登陆响应时间应小于1.5s,注册响应时间小于2s,用以提高用户使用感受。
对于用户登陆,该程序调用DAO模块,使用DAO模块中的查询功能(selectOne)对用户表(UserDAO)进行查询操作。
对于用户注册,该程序调用DAO模块,使用DAO模块中的插入功能(insert)对用户表进行插入操作。
下面的图4-1表示了用户在进行登陆/注册登陆过程中的流程。

图 4.1 用户登陆/注册登陆流程
在模块首部添加注释:登陆/注册登陆功能函数;在不同的结果后添加注释表示的的结果,结果有:登陆成功、注册成功、用户名或密码错误。
多次进行用户登陆操作、用户注册操作,检查其正确性以及响应速度。
本程序的主要目的为用户提供系统中的数据的输入功能,输入的数据可供系统中其他功能所使用。本程序常驻内存,可重入,无覆盖要求。
界面输入:用户通过键盘事件将钻孔数据输入界面,然后系统将输入的数据按照规定好的关系模式存储进入access数据库中。
文件导入:用户选择所要进行导入操作的数据表,调用DAO模块中的数据插入函数,将文件数据按照规定好的关系模式存储进入access数据库中。
精度要求:各项钻孔数据的精度为0.01。
时间特性:钻孔数据成功导入数据库的响应时间小于2s。
数据输入过程中,用户需要手动输入钻孔数据表格的各项内容,下面的表4-1、4-2、4-3、4-4、4-5是各项数据的输入名称、数据类型、格式、范围、输入方式以及来源表。
表4.1
钻孔概况表输入项属性描述
|
数据表 |
输入项 |
名称 |
数据类型 |
格式 |
范围 |
输入方式 |
来源 |
|
钻孔概况表DrillGenral |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKAA(钻孔类型) |
type |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKALE(开孔日期) |
kaikong |
string |
××××/××/×× |
无 |
用户手动输入 |
用户 |
|
|
TKALF(终孔日期) |
zhongkong |
string |
××××/××/×× |
无 |
用户手动输入 |
用户 |
|
|
GGHHAB(终孔深度) |
deepth |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
表4.2 钻孔测斜记录表输入项属性描述
|
数据表 |
输入项 |
名称 |
数据类型 |
格式 |
范围 |
输入方式 |
来源 |
|
钻孔测斜记录表DrillCexie |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
WTJDIH(测点号) |
point_no |
string
|
×××× |
无 |
用户手动输入 |
用户 |
|
|
WTHEBA(测点深度) |
point_depth |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
WTHGFC(偏斜角采用值) |
point_pxangle_used |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
WTHGFE(方位角检查值) |
point_fwangle_checked |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
表4.3 钻孔分层特征信息表输入项属性描述
|
数据表 |
输入项 |
名称 |
数据类型 |
格式 |
范围 |
输入方式 |
来源 |
|
钻孔分层特征信息表DrillFloor |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
MDBRAA(岩层序号) |
rock_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
MDLOA(分层号) |
fenceng_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCM(岩石分层孔深) |
fenceng_no |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
TKAJAM(分层岩芯长度) |
fenceng_rockdepth |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
YSEBZ(岩石全名) |
fenceng_rockname |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
MDLZZ(备注) |
fenceng_note |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
GCJLIJ(岩层倾角) |
fenceng_rockangle |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
表4.4 钻孔样品记录输入项属性描述
|
数据表 |
输入项 |
名称 |
数据类型 |
格式 |
范围 |
输入方式 |
来源 |
|
钻孔样品记录 SampleRecord |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
PKHFB(样品编号) |
sample_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCF(采样起始孔深) |
sample_begin |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCG(采样终止孔深) |
sample_end |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
TKBAML(样长) |
sample_length |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
GCLCAA(岩矿心长度) |
samplecore_length |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
HXGID(样品类型) |
sample_type |
string |
×××× |
无 |
用户手动输入 |
用户 |
表4.5 钻孔样品信息输入项属性描述
|
数据表 |
输入项 |
名称 |
数据类型 |
格式 |
范围 |
输入方式 |
来源 |
|
钻孔样品信息 OrebodyType |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
PKHFB(样品编号) |
sample_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCF(样品起始深度) |
sample_begin |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
TKACCG(样品终止深度) |
sample_end |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
GCLCAA(样品长度) |
sample_length |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
矿体名称 |
name |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
矿体品位值 |
grade |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
界面输入:用户在输入框中进行数据输入,当输入的数据符合格式要求时,经过用户确认后将数据存储到access数据库中。
文件导入:用户在选择好数据文件之后,系统将读取excel表中的数据,并核对数据格式,当数据格式正确时,便能将数据正确导入至数据库中。
本程序所隶属的上一层模块为用户登陆/注册登陆模块,隶属于本程序的下一层模块为数据访问操作(DAO)模块。下图4-2表示简单的模块关系。

图4.2 输入模块接口的简单表示
本程序进行数据的输入,需要为输入的数据文件机进行存储分配,数据存储位置为access数据库。
在模块首部添加注释数据输入,表明该模块执行系统中数据的输入;
在界面输入与文件输入首部添加各自输入方式;
在调用DAO模块内的函数时进行说明;
本程序需要在用户登陆/注册登陆程序完成之后才能开始执行,用提高数据的安全性。
在界面输入界面输入不符合格式的数据,测试系统是否检查数据格式以及报错功能是否正确运行。
在文件输入方式中输入不符合格式的文件,测试系统是否检查数据格式以及报错功能是否正确运行。
实现与MFC模块的良好接口。
本程序的主要目的是为用户提供一个图层导出功能,此功能可以根据用户选择的路径将图层文件保存,从而方便系统中其他需要图层文件的功能。该程序常驻内存,可重入,无覆盖要求,顺序处理。
下表表示了图层导出过程中的IPO过程。

图4.3 图层数据导出IPO图
灵活性要求:需根据用户选择输出的数据表进行输出。
时间特性要求:导出文件时间因小于2s。
本程序的输入项为用户所选择的图层以及存储文件的路径。
本程序的输出项为图层文件、用户输入成功的提示。
本程序输出的文件存储在计算机中,系统不分配存储空间。
本程序需要在用户登陆/注册登陆程序执行后进行。
实现与MFC模块的良好接口。
本程序的主要目的是为用户提供一个钻孔数据导出功能,此功能可以根据用户选择的路径将钻孔数据文件进行保存,从而方便用户对数据的转移使用。该程序常驻内存,可重入,无覆盖要求,顺序处理。
下图表示了文件导出过程中的IPO图。

图 4.4 文件数据导出IPO图
时间特性要求:查询access数据库响应时间小于0.5s,导出Excel响应时间小于2s。
用户选择所要输出的表,系统接收用户的选择。
本程序的输出项为Excel表格文件、输出成功提示。
在数据输入之后,选择不同的输出表,测试数据表的Excel文件输出是否成功运行。
下图5-1、5-2、5-3、5-4、5-5为注册和登陆界面、钻孔数据输入功能交互的UI界面设计。用户点击相应按钮,分别调用

图5.1 登陆主界面

图5.2 用户登陆界面

图5.3 用户注册登陆界面

图5.4 钻孔概况表输入界面设计

图5.5 钻孔测斜记录表等表输入界面设计
设置名为"打开等高线数据文件"的菜单项,用户点击按钮打开文件选择界面,需要用户选择gvp格式的等高线数据文件,如果不是gvp格式需要给用户以提示,如果打开文件失败也需要给用户提示,若打开文件成功,等高线数据会展示在图层中,用户需要按照自己的需求选择等高线,可以选择全部等高线也可以选择部分等高线。用户选择等高线后,点击"建立矿山三维地表模型"的菜单项,对选中的等高线进行建模,构建的三维地表模型展示在图层中,用户可以对建立的模型进行放大缩小旋转等操作。
在系统中设置在显示出钻孔可视化建模模块,用户看到显示出已经可视化的钻孔建模,有按钮点击选择可以生成三维矿体表面模型,用户自行选择要进行三维建模的矿体种类后点击按钮系统会自动将生成的三维矿体面显示在矿体图元模块上,用户可以选择生成的三维矿体表面模型显示其属性,并且可以对矿体模型进行旋转大小缩放等交互操型
设置名为“生成块体”的菜单项,用户导入三维矿体面模型数据文件后,在界面选择所要用的面模型,系统将确认所选择面模型是否为一个多面体模型,若是则继续进行下一步,若不是择报错提醒用户重新选择,选择完毕后用户需点击菜单项中的“生成块体”项完成块体建模,随后用户可在弹出的对话框中输入块体分割数据进行块体分割。
本程序功能是根据用户交互模块中的矿山边界表面模型交互中用户选择的等高线数据建立矿山表面模型,需要读取用户选择的等高线上点的数据,依据这些点根据三角网生长算法构建不规则三角网(TIN)构建三维表面模型,依据Polygon的格式存储,输出为gvp格式的文件。
表6.1 矿山表面模型功能描述表
|
功能名称:矿山三维地表模型生成 |
|
本模块调用的模块名称:用户交互模块、三维建模模块 |
|
输入:等高线数据(甲方提供),用户选择等高线 |
|
输出:三维地表模型 |
|
与本模块相直接关联的数据结构(数据库,数据文件):等高线数据文件 |
|
处理描述:用户打开等高线数据文件,选择等高线通过三角网生长算法建立三维地表模型 |

图 6.1矿山三维表面模型建立IPO图
(1)时间限制:要求能和用户实时交互并做出回应,用户点击建立模型按钮后能够实时生成矿山的三维地表模型。
(2)精度:x、y、z坐标信息保留小数点后两位。
(3)灵活性:随着用户提供的数据变化具有灵活性,并且用户可以选择全部等高线也可以选择部分等高线,用户选择的等高线精度决定了生成模型的精度。
输入是获取当前选中的对象,判断选中的对象是否是线对象,如果不是则提示出错,如果是线对象,则读取线对象上点对象的坐标,存储到点容器中。
表6.2 三维地表模型生成功能输入说明表
|
名称 |
标识 |
数据类型 |
有限范围 |
输入方式 |
输入来源 |
安全保密 |
|
等高线 |
lines |
Polyline |
-5000 ~ +5000 |
批量导入,用户点击选择 |
甲方提供数据 |
高 |
表6.3 三维地表模型生成功能输出说明表
|
名称 |
标识 |
数据类型 |
输出方式 |
输出信息 |
安全保密 |
|
三维地表模型 |
MineSurfaceModel |
Polygon |
系统输出 |
三维地表模型 |
高 |
生成不规则三角网具有多种算法,本程序选择的是三角网生成算法,这种算法思路比较简单,容易实现,并且时间复杂度适中,具体思路如下:
(1)以任一点为起始点;
(2)找出与起始点最近的数据点相互连接形成Delaunay三角形的 一条边作为基线,按Delaunay三角网的判别法则,找出与基线构成Delaunay三角形的第三点;
第三点需要满足的条件为:不是已经加入三角网的点,并且与原来两点形成的三角形的外接圆中没有其他的点。
(3)基线的两个端点与第三点相连,成为新的基线
;
(4)迭代以上两步直至所有点都被处理,算法结束。
本功能的实现流程如下:
(1)用户选择等高线数据;
(2)读取等高线数据上的点的x,y,z坐标;
(3)判断点的个数,小于2则提示报错算法结束,大于2进入下一步;
(4)任选一个点作为起始点;
(5)根据Delaunay法则找出第三个点;
(6)原来的两个端点与第三个点相连成为新的基线,并且生成三角形;
(7)判断是否所有的点都加入三角网中,如果是算法结束,如果不是则重复上面步骤直到所有的点都加入三角网中;

图6.2 三角网生成算法流程图
本功能通过用户交互模块选择等高线数据文件,用户点击选择等高线,调用三维建模模块建立矿山地表模型,并且展示在图层中。

图6.3 三维地表模型接口表示图
用polyline来存储等高线数据,三维地表模型用Ploygon来存储表示。
a.加在模块首部的注释:
*程序名称:矿山三维地表模型的建立
* 开发者:吕敏
* 创建日期:2022/6/15
* 程序说明:本程序通过对等高线数据上面的点利用三角网生长算法建立不规则三角网,构建矿山三维地表模型,使用户能直接从界面观察到矿山地形的起伏形况。
* 参数说明:参数类型多为double型参数
* 返回值:矿山三维地表模型的GVP文件
b.加在各分枝点处的注释;
c.对各变量的功能、范围、缺省条件等所加的注释;
d.对使用的逻辑所加的注释等。
////////////////////////////////////////////////////////////////////////////////
//函数名:BuildMineSurfaceModel
//功能:建立矿山三维地表模型
//参数:Polyline格式的等高线数据
//返回:TRUE或FALSE
//主要思路:根据等高线数据上的点利用三角网生长算法建立
必须打开正确的等高线文件,并且用户选择等高线。
程序测试计划如下:
(1)数据打开测试:测试数据是否能正确打开
(2)界面测试:测试界面反馈信息是否正常
(3)功能测试:是否能正确显示三维地表模型
(4)性能测试:是否能在预期数据量内以预期时间完成处理过程
当数据点数量很大时无法判断是否可以实时响应。
本程序功能是根据用户交互模块中的钻孔可视化模块,根据用户选择的勘探区范围,以及自身的需要来显示钻孔几何模型或地层模型或不同种类的采矿样品。模型图层,并可支持输出为gvp格式的文件。
表6.4 钻孔可视化模块功能表
|
功能名称:钻孔可视化模块 |
|
本模块调用的模块名称:用户交互模块 |
|
输入:勘探区钻孔数据(测斜记录表、钻孔概况表、钻孔分层特征表、钻孔样品信息表、钻孔样品记录表) |
|
输出:钻孔模型 |
|
与本模块相直接关联的数据结构(数据库,数据文件):钻孔数据文件 |
|
处理描述:用户打开勘探区钻孔数据文件,根据自身需要选择不同功能钻孔模型 |

图6.4 钻孔可视化的IPO图
(1)时间限制:要求能和用户实时交互并做出回应,用户点击建立模型按钮后能够实时生成相应功能钻孔模型。
(2)精度:x、y、z坐标信息保留小数点后两位。
(3)灵活性:随着用户选择的不同勘探区变化具有灵活性,并且用户可以选择生成的模型是钻孔几何模型还是地层模型还是采矿样品模型。
表6.5
钻孔可视化输入项表
|
数据表 |
输入项 |
名称 |
数据类型 |
格式 |
范围 |
输入方式 |
来源 |
|
钻孔概况表DrillGenral |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKAA(钻孔类型) |
type |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKALE(开孔日期) |
kaikong |
string |
××××/××/×× |
无 |
用户手动输入 |
用户 |
|
|
TKALF(终孔日期) |
zhongkong |
string |
××××/××/×× |
无 |
用户手动输入 |
用户 |
|
|
GGHHAB(终孔深度) |
deepth |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
钻孔测斜记录表DrillCexie |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
WTJDIH(测点号) |
point_no |
string
|
×××× |
无 |
用户手动输入 |
用户 |
|
|
WTHEBA(测点深度) |
point_depth |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
WTHGFC(偏斜角采用值) |
point_pxangle_used |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
WTHGFE(方位角检查值) |
point_fwangle_checked |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
钻孔分层特征信息表 DrillFloor |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
MDBRAA(岩层序号) |
rock_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
MDLOA(分层号) |
fenceng_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCM(岩石分层孔深) |
fenceng_no |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
TKAJAM(分层岩芯长度) |
fenceng_rockdepth |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
YSEBZ(岩石全名) |
fenceng_rockname |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
MDLZZ(备注) |
fenceng_note |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
GCJLIJ(岩层倾角) |
fenceng_rockangle |
double |
××.×× |
无 |
用户手动输入 |
用户 |
|
|
钻孔样品记录SampleRecord |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string
|
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
PKHFB(样品编号) |
sample_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCF(采样起始孔深) |
sample_begin |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCG(采样终止孔深) |
sample_end |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
TKBAML(样长) |
sample_length |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
GCLCAA(岩矿心长度) |
samplecore_length |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
HXGID(样品类型) |
sample_type |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
钻孔样品信息 OrebodyType |
MDBTAD(勘探区编号) |
kantanqu_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
GCJCBN(钻孔编号) |
drill_no |
string |
×××× |
无 |
用户选择已有项 |
数据库 |
|
|
PKHFB(样品编号) |
sample_no |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
TKACCF(样品起始深度) |
sample_begin |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
TKACCG(样品终止深度) |
sample_end |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
GCLCAA(样品长度) |
sample_length |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
|
|
矿体名称 |
name |
string |
×××× |
无 |
用户手动输入 |
用户 |
|
|
矿体品位值 |
grade |
double |
××.×× |
>0 |
用户手动输入 |
用户 |
表6.6 钻孔可视化输出项表
|
名称 |
标识 |
数据类型 |
输出方式 |
输出信息 |
安全保密 |
|
钻孔图层 |
Layer |
gvp |
系统输出 |
钻孔模型 |
高 |
本程序使用的采矿样品模型建立的单条矿线坐标计算公式为:
![]()
![]()
![]()
其中Δx是单条钻孔矿线的存在倾角时变化的横坐标;Δy是单条钻孔矿线的存在倾角时变化的纵坐标,Δz是单条钻孔矿线的存在倾角时变化的竖坐标。
本功能的实现流程如下:
(1)用户选择勘探区数据;
(2)读取钻孔数据的点的x,y,z坐标;矿线倾角、方向角;地层岩芯,起始点位置,终止点位置、采矿样品深度与品位数据。
(3)用户选择功能;
(4)钻孔几何模型需要通过公式计算各段的Δx,Δy,Δz;
(5)地层模型需要计算每段地层岩芯位置,并通过内部设置的相应标准来给每种岩芯赋予不同的RGB参数。
(6)样品品位模型需要统计出每种矿体的品位并排序,首先为某矿体选定一个RGB,根据最大值与最小值设计一个适度大小的RGB参数,通过调整该RGB颜色的深浅来显示矿体品位大小。
(7)输出图层。

图6.5 地层与样品数据建模功能实现流程图
本功能通过用户交互模块选择勘探区数据文件,用户点击选择勘探区,调用三维建模模块建立钻孔几何模型,并且展示在图层中。
用layer来存储图层数据,三维钻孔模型用gvp来存储表示。
a.加在模块首部的注释:
/矿山钻孔地层与样品数据模型的建立
l 开发者:徐雅文
l 创建日期:2022/6/15
l 程序说明:本程序通过对钻孔采样获得的地层与样品数据进行建模,预计实现多个钻孔可视化功能,包括钻孔几何建模,钻孔地层建模,钻孔含矿样品品位建模。其中钻孔含矿样品品位建模用户可以任意选择样品中矿物种类建模。
l 参数说明:参数类型多为double型参数
l 返回值:矿山钻孔模型GVP文件
b.加在各分枝点处的注释;
c.对各变量的功能、范围、缺省条件等所加的注释;
d.对使用的逻辑所加的注释等。
////////////////////////////////////////////////////////////////////////////////
//函数名:DrillingData3DModel
//功能:建立矿山钻孔可视化模型
//主要思路:通过计算钻孔线转折点的坐标以及根据岩芯种类填充不同的RGB参数来实现可视化
必须打开正确的勘探数据,并且用户选择勘探区以及用户根据实际需要选择的不同建模功能。
程序测试计划如下:
(1)数据打开测试:测试数据是否能正确打开
(2)界面测试:测试界面反馈信息是否正常
(3)功能测试:是否能正确显示钻孔可视化模型
(4)性能测试:是否能在预期数据量内以预期时间完成处理过程
根据功能二生成的可视化钻孔数据中离散的矿体点为系统的输入数据,将矿体点中符合要求的矿体点连接成线再连接成面,形成凸包来生成表面模型。
通过建立三维矿体面模型创建功能,使用户能根据钻孔可视化系统中的输出的矿体点数据作为初始数据,利用生成封闭面得到矿体面模型,输出的矿体面模型可以展示并且数据作为生成块体模型的输入数据。
程序特点:该功能不属于常驻内存、有子程序(钻孔可视化矿体点数据输入程序、三维矿体面模型生成程序、三维矿体面模型输出程序)、不可重入、有覆盖要求、属于并发处理。
表6.7 三维矿体面模型输入ipo表
|
功能名称:三维矿体面模型输入 |
|
本功能直接调用的模块:导入钻孔可视化矿体点功能 |
|
输入:钻孔可视化输出的矿体点数据文件 |
|
输出:所选择矿体的三维矿体点数据 |
|
与本模块直接相连的数据结构:数据库,数据文件 |
|
处理描述:输入文件中的矿体点数据,对导入的矿体点数量以及排列方式进行判断,判断矿体点数量是否足以生成表面模型(4个及以上),矿体点排列方式能否成体(两点不共点,三点不共线,四点不共面) |
表6.8 三维矿体面处理ipo表
|
功能名称:根据矿体点生成面模型 |
|
本功能直接调用的模块:三维矿体点生成面模型功能 |
|
输入:钻孔可视化输出的矿体点数据 |
|
输出:完成三维建模的矿体面模型 |
|
与本模块直接相连的数据结构:数据库,数据文件 |
|
处理描述:经过之前一步对所要处理的矿体点进行判断之后,对于符合建成面的矿体点,生成三维凸包将所有矿体点依次导入判断,直到所有的矿体点都被判断一遍,将最后符合条件的边界点输出并生成三维矿体表面模型。 |
表6.9 三维矿体面输出ipo表
|
功能名称:三维矿体面模型输出 |
|
本功能直接调用的模块:导出三维矿体面模型 |
|
输入:完成建模的三位矿体面模型 |
|
输出:可供块体模型构建的文件数据 |
|
与本模块直接相连的数据结构:数据库,数据文件 |
|
处理描述:在用户交互界面中可以显示生成的矿体面,并且生成新的面模型文件供后续使用. |

(1)时间限制:鼠标点击相应按钮及操作的响应时间不超过1s,三维矿体表面模型建立控制在3秒之内。
(2)精度:点的坐标(XYZ)精确到小数点后两位,建立三位矿体面模型误差不超过1米。
(3)灵活性:对于每一步骤的操作进行文字信息提示,进行简单的操作即可完成,可自行选择所要建立面模型的矿体点数据。
表6.10 三维矿体面输入数据表
|
输入 |
标识符 |
文件类型 |
范围 |
输出格式 |
|
钻孔可视化矿体图层矿体点数据 |
Layer |
GVP文件 |
无 |
GVP文件 |
输入的数据为钻孔可视化功能输出的部分数据文件,输入时要对所选数据进行初步判断,符合条件后在进入系统中工作。
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
矿体点边界点X坐标 |
xd |
double |
10~20000 |
从函数返回 |
|
矿体点边界点Y坐标 |
yd |
double |
10~15000 |
从函数返回 |
|
矿体点边界点Z坐标 |
zd |
double |
10~10000 |
从函数返回 |
表6.11 三维矿体面输出数据表
生成最小凸包:首先选择四个不共面的点形成一个四面体,然后每次增加一个新的点,分成两种情况:当新点在当前凸包内部时,忽略该点;当新点在当前凸包外部时,找到从该点可以“看见”的面,将这些面删除,然后对于这些面的每条边进行判断,看该点能否看见这些边的另一侧的面,若不行,则将该边与这个点相连构成新的面。
判断一个点P在凸包内还是凸包外,这里利用有向体积的方法。在存储面时,保证面的法线方向朝向凸包外部,若存在某一平面和点P所组成的四面体的有向体积为正,则P点在凸包外部,并且此面可被P点“看见”。

图6.7 凸包算法图例解析

图6.8 三维地质体建模算法流程
除开基本的判断之外,本流程最重要的部分是如何判断新的点是否在凸包内部以及判断该点符合条件之后如何将他构建进入凸包之中然后生成新的凸包。

图6.9 凸包内外位置判断函数解析
通过有限体积法用来判断点与面的方向。该函数的输入为所需判断的三维点和面,先得到面上的两个向量m、n,连接三维点和面上任意一点为向量t,通过m与n的叉乘得到面的法向量,再将其与向量t点乘判断两者的方向关系。如果函数返回的值为正,则点与面的法向量同向,由于在存储面时,保证面的法线方向朝向凸包外部,因此可以知道该点在凸包外部,并且此面可被P点看见。

图6.10 凸包生成与删除解析
更新凸包:当判断得到点q在凸包外并能“看见”面时,先删除该面,然后对剩下的三条边与要判断的点进行判断,这里就有三次判断。首先通过面上的两点a、b组成的边找到与当前面共边的另一个面(对于两个共边的三角形,知道一条公共边就能知道另一个三角形的位置),如果这个面为凸包表面,判断点q能否“看到”该面,若可以,则将该面删除,若不可,将该点q与输入的另外两点a、b组成一个新的三角形作为面。因为每个三角形的的三边是按照逆时针记录的,所以把边反过来后对应的就是与ab边共线的另一个面。
该功能需要首先调用钻孔可视化中的输出数据,得到已经经过处理的矿体点数据,然后根据这些要处理的矿体点数据进行处理加工,得到的输出数据也就是矿体面数据再交给后面的块体模型建立来作为输入数据。

图6.11 三维地质体面模型接口流程
该过程需要调用数据库数据,具体使用数据库多少经由用户选择的矿体点数量来定。
a.加在模块首部的注释:
/************三维矿体面模型创建************
* 开发者:刘家宁
* 创建日期:2022/6/15
* 程序说明:输入钻孔可视化功能输出的矿体点数据,处理后经由增量法生成可交互可处理的三维矿体表面模型。
* 参数说明:参数类型多为double型参数
* 返回值:三维矿体的块体模型GVP文件
********************************************/
b.加在各分枝点处的注释;
c.对各变量的功能、范围、缺省条件等所加的注释;
d.对使用的逻辑所加的注释等。
////////////////////////////////////////////////////////////////////////////////
//函数名:AutoBuildOreBoundary
//功能:自动根据所要建立矿体的矿体点建立三位矿体面模型
//参数:ptof,deal,dfs
//返回:TRUE或FALSE,点数据,面数据
//主要思路:采用增量法对所选矿体点进行构建,由初始四个点进行扩建,每个点进行判断后加入模型内部,对所有的点都进行判断之后生成最终符合条件的面模型。
对于生成三维矿体表面模型来说可能会出现由于矿体点不足,导致的所建模的面模型形态不会趋近于原本矿体形态,会有很多棱角,同样的由于矿体实际上是有些许突出凹陷的,增量法造出的凸包不会体现出矿体的凹陷和突出。
(1)技术要求:有一定数据结构和C++基础并能编写测试代码,对三维建模面模型数据掌握而且知道其含义。
(2)输入数据:矿体的矿体点坐标;
(3)预期效果:用户在交互界面上选择要建模的矿体后,选择建成,并进行成功判断之后,生成新的图层文件,显示出生成的三维矿体表面模型,并且能够导出生成的gvp文件,在块体生成测试中可以直接作为输入数据使用。
(4)进度安排:6.22前完成测试工作;
(5)测试设备:
操作系统:Windows10
编译器:visual
studio 2010
二次开发平台:QuantyView3D
对于生成面模型的算法还没有进行大量数据进行比较那个比较贴近于现实生活中实际的矿体模型。
根据功能三生成的三维矿体面模型数据,使用层面和侧面构建三维矿体的体模型,通过使用块体填充的算法构建八叉树分割初始包围盒来实现块体模型的生成,将体模型内部填充并运用分割算法,对块体进行循环切割,将该体模型划分成多个小块,最终输出与相应数据匹配的三维矿体填充模型。
通过建立三维矿体的块体模型创建功能,使用户能凭借建立三维矿体的面模型功能产生的三维矿体面模型,运用填充和分割算法,生成三维矿体的体模型,方便之后的IDW储量估算。
程序特点:该功能不属于常驻内存、有子程序(三维矿体面模型数据输入程序、三维矿体块体填充及分割程序、三维矿体的块体输出程序)、不可重入、有覆盖要求、属于并发处理。
本程序功能为通过矿体三维面模型生成矿体三维块体模型,实现可视化观察。其IPO表如下:
表6.12 三维矿体面模型数据输入程序IPO表
|
功能名称:三维矿体面模型数据输入 |
设计人:董含笑 |
|
本模块直接调用的模块名称:三维矿体的面模型创建模块 |
|
|
输入:三维矿体的面模型数据 |
|
|
输出:所选中矿体三维面模型的判断结果 |
|
|
与本模块相直接关联的数据结构(数据库,数据文件):数据库、数据文件 |
|
|
处理描述:在系统中选择已生成的矿体三维面模型,对模型进行基本信息的判断(类型是否为多面体、数量是否为一个)若输入的信息为一个多面体面模型数据,则继续进行三维矿体块体填充及分割程序,否则报错。 |
|
表6.13 三维矿体块体填充及分割程序IPO表
|
模块名称:三维矿体块体填充及分割 |
设计人:董含笑 |
|
本模块直接调用的模块名称:三维矿体块体填充及分割模块 |
|
|
输入:三维矿体的面模型数据 |
|
|
输出:含有块体填充及划分模型数据的三维矿体的块体模型 |
|
|
与本模块相直接关联的数据结构(数据库,数据文件):数据库、数据文件 |
|
|
处理描述:对三维矿体面模型进行点集合的遍历,构建矿体的AABB包围盒,计算包围盒在x、y、z轴方向上最大最小点位,由该六个点位形成一个包围矿体的多面体,设定为最小矿体。生成八叉树模型,进行矿体与面模型空间关系判定,若相离则不再细分,若不相离则按照构建块段模型进行细分,划分为最小块体保留,完成块体分割。 |
|
表6.14 三维矿体的块体输出程序IPO表
|
模块名称:三维矿体面模型数据输出 |
设计人:董含笑 |
|
本模块直接调用的模块名称:三维矿体的块体输出 |
|
|
输入:三维矿体的填充及划分模型数据 |
|
|
输出:三维矿体的块体模型GVP文件 |
|
|
与本模块相直接关联的数据结构(数据库,数据文件):数据库、数据文件 |
|
|
处理描述:将输入程序的三维矿体的填充及划分模型数据进行判断,若符合要求则进行图像输出 |
|

图6.12 三维矿体的块体创建IPO图
(1)时间限制:鼠标点击相应按钮及操作的响应时间不超过1s,矿体块体模型建立控制在3秒之内。
(2)精度:点的坐标(XYZ)精确到小数点后两位,建立三维矿体块体模型误差不超过1米。
(3)灵活性:对于每一步骤的操作进行文字信息提示,操作方式较简单;可自由选择面模型进行块体填充及分割操作。
表6.15 数据输入表
|
输入 |
标识符 |
文件类型 |
范围 |
输出格式 |
|
三维矿体的面模型文件 |
Layer |
GVP文件 |
无 |
GVP文件 |
输出数据为生成的三维矿体的块体模型数据,及相关文件。输出块体模型属性数据如表所示。
表6.16 数据输出表
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
块体中心点X坐标 |
xd |
double |
10~20000 |
从函数返回 |
|
块体中心点Y坐标 |
yd |
double |
10~15000 |
从函数返回 |
|
块体中心点Z坐标 |
zd |
double |
10~10000 |
从函数返回 |
构建八叉树块体算法:
对三维矿体面模型进行点集合的遍历,构建矿体的AABB包围盒,计算包围盒在x、y、z轴方向上最大最小点位,由该六个点位形成一个包围矿体的多面体,设定为最小矿体。
空间关系判断:判定矿体与包围盒的相交情况,从而对八叉树结点进行细分。先生成八叉树模型,依序将单位元元素放入能被包含且没有子结点的立方体中,若没有达到最大递归深度,再细分为八等份,再将单位元元素全部分担给八个子立方体。
进行矿体与面模型空间关系判定,若相离则不再细分,若不相离则按照构建块段模型进行细分,划分为最小块体保留,完成块体分割。
伪代码如下所示:
//构建填充矿体的八叉树
FillBlock(OcTree Block,CGVedpolyhedron Ore)
{
If(Block尺寸小于最小设定尺寸)Return(直接存储)
If(Block与Ore不相交)Return(放入到无相交的最小存储尺寸中)
Else
{
If(Block在Ore内部)CreteOctree(Block)
Else
{
将Block平均划分为八个子块(即八叉树划分法,将立方体划分为八个体积相等的立方体,进行块体的存储等功能)
For(i从0到7)
{
FillBlock(Block[i])
}
}
}
}
本功能的实现流程如下:
①导入三维矿体面模型
②选取面模型
③判断模型数量及类型
④创建AABB包围盒
⑤构建八叉树,进行包围盒划分
⑥判断矿体、包围盒位置
⑦进行块体填充及分割
流程图如图所示:

图6.12 逻辑流程图
该功能需要先读取上一功能结果(功能三生成的三位矿体的表面模型),进行三维矿体模型化后(包括块体填充以及块体划分),将生成的三维矿体的块体模型存入数据库,在程序运算和操作后生成的块体模型GVP文件输出到IDW储量估算功能,进行下一步计算。

图6.13 三维矿体块体接口图
该程序在运行过程中需要占用一部分内存,在运行结束后输出的数据需要存入数据库,占用一部分存储空间,具体大小根据用户选择情况而定。
a.加在模块首部的注释:
/************三维矿体块体模型创建************
* 开发者:董含笑
* 创建日期:2022/6/15
* 程序说明:输入功能三生成的三维矿体的面模型,计算包围盒,进行矿体填充及分割,输出矿体文件,便于IDW储量估算
* 参数说明:参数类型多为double型参数
* 返回值:三维矿体的块体模型GVP文件
********************************************/
b.加在各分枝点处的注释;
c.对各变量的功能、范围、缺省条件等所加的注释;
d.对使用的逻辑所加的注释等。
////////////////////////////////////////////////////////////////////////////////
//函数名:InterDetectin
//功能:八叉树结点与表面模型相交检测
//参数:OctreeNode 八叉树结点 ,OBBTree
Tree OBB树
//返回:TRUE或FALSE
//主要思路:八叉树结点与OBB相交,则取出包围盒中三角面片与八叉树结点做相交检测,相交则返回TRUE,其他则返回FALSE。
对于三维矿体的面模型的选择,在类型和数量方面都有所限制(须是一个多面体面模型),且该功能对于模型的划分,仅能根据系统默认划分方式划分。
(1)技术要求:有一定数据结构和C++基础并能编写测试代码,熟悉三维矿体块体模型创建的整个流程;
(2)输入数据:面数目,各个面终包含点数最大值,X,Y,Z坐标;
(3)预期效果:用户在建立三维矿体的面模型的基础上,选择该模型的图层,创建包围盒模型,设置块体长宽高,然后选择该包围盒模型图层对块体模型进行约束,在弹出的对话框内可设置子块体的长宽高等数据。之后可以为每个块体设置矿体的属性信息。
(4)进度安排:6.22前完成测试工作;
(5)测试设备:
操作系统:Windows10
编译器:visual
studio 2010
二次开发平台:QuantyView3D
该功能用户无法自定义三维矿体的块体模型划分方式以及初始包围盒位置和尺寸等。
该程序的设计目的是解决客户对于储量估算方面的需求,即通过给定区域内已有的钻孔样品品位数据,估计该区域内其他未知位置的品位值。该程序属于非常驻程序,仅在用户使用储量估算界面时,确定好算法计算区域与参数后,才执行该程序;该程序属于不可重入程序,只支持顺序处理,不支持并发处理。
(1)参数传递函数vector<double>
GetBPParameter(double learning_rate,int
epoch):
该程序的输入参数为用户交互模块中用户输入的学习率、训练步长。该函数将算法所需参数传递到vector<double>类型的对象中,最终函数返回BP神经网络算法所需要的学习率、训练步长。

图7.1 参数传递函数IPO图
(2)训练区域数据传递函数vector<vector<double>>
GetBPTrainDataSet():
该函数的输入参数为用户选择的预测区域信息,即包含矿体品位信息的图元集合。程序将从中提取每一个矿体块体的位置信息以及品位信息,并将其存入vector<double>类型的对象中。最终函数将返回处理过程中得出的vector<vector<double>>对象。

图7.2 训练区数据传递函数IPO图
(3)BP神经网络算法实现函数vector<vector<double>>
BPModel (vector <vector <double>> Gradedata,vector<double>
para):
该函数的输入参数为训练区域数据vector<vector<double>>对象、算法参数数据vector<double>对象,上述参数将作为BP神经网络算法的输入参数。该函数的处理过程为执行BP神经网络算法,根据前向传播算法和反向传播算法进行参数迭代与调优,训练出最佳模型。最终用该模型预估位置区域的品位值,最终返回该区域全部的矿体块体信息数vector<vector<double>>
对象。

图7.3 BP神经网络算法函数IPO图
(4)矿体图层输出函数void OutPutGrade(vector<vector<double>>
result):
该函数的输入参数为BP神经网络算法中得出的已经过预估的矿体块体信息参数vector<vector<double>> 对象,该函数会扫描矿体图层对象中的未知品位属性的块体,将已经预估出的品位结果赋给未知的块体。最终将返回矿体块体图层。

图7.4 矿体图层输出函数函数IPO图
(1)参数传递函数vector<double>
GetBPParameter(double learning_rate,int
epoch):
该函数完成用户交互模块到储量估算模块的参数传递,该函数可获取BP神经网络算法所需要的学习率、训练步长。
(2)训练区域数据传递函数vector<vector<double>>
GetBPTrainDataSet():
该函数对精度没有要求,不具有灵活性,只是获取到用户所选区域中包含的矿体块体图元数据;该函数是后续模型训练的数据源,需要实时响应。
(3)BP神经网络算法实现函数vector<vector<double>>
BPModel(vector<vector<double>> Gradedata,vector<double> para):
该函数主要进行数据处理,数据精度取决于矿体块体对象信息的精度;该函数只进行数据的计算操作,由于算法的参数由用户自定义,因而具有一定灵活性;该函数需要实时响应。
(4)矿体矿体图层输出函数void OutPutGrade(vector<vector<double>>
result):
该函数进行图层位置属性赋值,由于矿体坐标精度、矿体品位值精度有明确要求,该函数有一定的精度要求,但不具有灵活性,需要实时响应。
本程序输入项及详细信息见下表。
表7.1 机器学习品位估值模块输入项
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
学习率 |
learning_rate |
double |
[0,1] |
从用户交互界面传入 |
|
训练步长 |
epoch |
int |
无 |
从用户交互界面传入 |
|
品味数据集 |
Gradedata |
vector<vector<double>> |
无 |
从函数传入 |
|
算法参数集 |
para |
vector<double> |
无 |
从函数传入 |
|
运算结果集 |
result |
vector<vector<double>> |
无 |
从函数传入 |
本程序输出项及详细信息见下表。
表7.2 机器学习品位估值模块输出项
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
算法参数集返回值 |
return |
vector<double> |
无 |
从函数返回 |
|
品味数据集返回值 |
return |
vector<vector<double>> |
无 |
从函数返回 |
|
运算结果集返回值 |
return |
vector<vector<double>> |
无 |
从函数返回 |
BP 算法的主要思想是把学习过程分为两个阶段:第一阶段 (正向传播过程)
:给出输入 信息通过输入层经隐含层逐层处理并计算每个单元的实际输出值。第二阶段 (反向传播过程)
:
若在输出层未能得到期望的输出值, 则逐层递归地计算实际输出与期望输出之差值 (即误 差)
,
以便根据此差调节权值。这两个过程的反复运用使得误差信号最小, 当误差达到人们 所希望的要求时学习结束。

图7.5 BP神经网络算法示意图

图7.6 用户交互模块流程图

图7.7 BP算法模块流程图
该功能的数据输入来源于用户交互模块,得到的数据在储量估算模块进行处理,最终在矿体图元模块进行显示,具体关系如图所示。

图7.7 机器学习算法与各模块调用关系图
(1)参数传递函数vector<double>
GetBPParameter(double learning_rate,int
epoch):该函数需为两个传入参数动态开辟一个vector<double>类型的对象,分配到堆区。
(2)训练区域数据传递函数vector<vector<double>>
GetBPTrainDataSet():该函数需为两个训练区数据动态开辟一个vector<vector<double>>类型的对象,分配到堆区。
(3)BP神经网络算法实现函数vector<vector<double>>
BPModel(vector<vector<double>> Gradedata,vector<double>
para):该函数需为两个训练区数据动态开辟一个vector<vector<double>>类型的对象,分配到堆区。
A.模块首部注释说明本模块开始编写的时间,编写人员,及其基本功能;
B.加在各分枝点的注释说明算法执行所要具备的条件;
C.在各个变量后注释变量的实际含义以及约束条件
D.对使用的逻辑前注释该逻辑结构的编写目的,运行逻辑的文字描述,以及实现效果。
算法参数方面,学习率和训练步长有设定范围,程序需相对输入参数进行检测,不在此范围内的数据将终止运算。
训练区域方面,若用户选择的训练区包含的数据过少,则终止程序运行。
将预测区域不同矿种的所有数据进行算法测试,将矿体数据按照6:2:2的比例划分为训练集、验证集、测试集,设定不同的学习率和训练步长进行算法测试,具体设计如下:
表7.3 机器学习品位估值测试设计
|
算法 |
BP神经网络 |
|||
|
训练策略 |
直接训练 |
使用预训练模型 |
||
|
超参数 |
epoch ≤ 200 |
epoch≤200 |
||
|
learning rate=0.00001 |
learning rate = 0.00001 |
|||
|
精度评价方法 |
准确率 |
精确率 |
准确率 |
精确率 |
|
召回率 |
F1-score |
召回率 |
F1-score |
|
该程序是对矿体进行品位估值分析,解决客户对于储量估算方面的需求,为储量估算提供可靠的数据。
特点:非常驻内存、是子程序、可重入程序、无覆盖要求、顺序处理。
(1)参数获取函数double
GetIDWParameter():获取用户交互模块用户给出的样品点限制条件;

图7.8 参数获取函数IPO图
(2)品位信息获取函数vector<vector<double>>
GetIDWGrade():获取参估区块体品位信息,包括中心点坐标x,y,z和品位信息pt,px,pl;

图7.9 品位信息获取函数IPO图
(3)IDW算法实现函数vector<vector<double>>IDWEstimation(vector<vector<double>> Gradedata,vector<double> max_distance):根据参估样品点品位值进行IDW品位估值。
图7.10 IDW算法实现函数IPO图
(4)矿体块体图层输出函数void OutPutIDWGrade():输出含全部品位信息的矿体块体模型。

图7.11 矿体块体图层输出函数IPO图
(1)精度:数据精确到小数点后三位;
(2)时间特性要求:预计反应时间在1s内。
表7.4 IDW品位估值模块输入项
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
样品点限制条件 |
max_distance |
double |
>0 |
从函数传入 |
|
品位数据 |
Gradedata |
vector<vector<double>> |
无 |
从函数传入 |
表7.5 IDW品位估值模块输出项
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
样品点限制条件 |
max_distance |
double |
>0 |
从函数返回 |
|
品味数据 |
Gradedata |
vector<vector<double>> |
无 |
从函数返回 |
|
运算结果 |
return |
vector<vector<double>> |
无 |
从函数返回 |
IDW插值算法:设某一矿化区域内:z(x)表示待估点x的品位值;z(xi)为第i个样品点x的品位值,di和λi分别表示这一样品点与待估点x之间的距离和分配到的权值;n为用于估值的样品个数,则IDW法计算估计值z*(x)的表达式:

其中,计算第i个参估样品分配到的权值λi的经典公式为:

上式中,距离参数di的幂指数p可以是任意自然数或小数,通常的取2.0。
整个功能逻辑流程如下图7.12所示:

图7.12 流程逻辑图
IDW品位估值功能所需要用户交互模块提供的样品点限制条件和三维建模模块提供的矿体块体模型及数据输入输出模块提供的坐标及品位数据,本模块为后面储量输出报表模块提供数据,如下图7.13所示:

图7.13
模块接口图
A.模块首部注释说明本模块开始编写的时间,编写人员,及其基本功能;
B.加在各分枝点的注释说明算法执行所要具备的条件;
C.在各个变量后注释变量的实际含义以及约束条件;
D.对使用的逻辑前注释该逻辑结构的编写目的,运行逻辑的文字描述,以及实现效果。
参与估值样品点过少则提示错误。
(1)技术要求:有一定数据结构和C++基础并能编写测试代码,对IDW品位估值掌握而且知道其含义。
(2)输入数据:样品点数。
(3)预期效果:用户在矿体块体图层上,选择IDW品位估值,生成新的图层文件,点击块体可显示品位信息。
(4)进度安排:6.22前完成测试工作。
(5)测试设备:
操作系统:Windows10
编译器:visual
studio 2010
二次开发平台:QuantyView3D
该程序主要负责矿体的储量计算以及报表,完成对矿山矿体储量的统计,完成用户对矿山矿体储量上的需求。该程序是非常驻内存,仅在用户选择报表功能时执行;非子程序;不可重入,且需要顺序处理,不可并发处理。
(1)void
CQuantyView3DView::onReport():该函数是数据的输入函数,选中矿体块体模型模块,将有效数据进行提取,存入新建容器vector<vector<double>>中。设计3个全局变量vector<vector<double>>,用于作为存储有效数据的容器。将数据进行统计以及计算,将计算结果输出至三个全局变量的vector中。
[QC3]
图7.14输入及统计函数IPO图
(2)新建界面BOOL
CMyRepor::OnInitDialog(),使用ListCtrl控件展示vector中的内容,即报表数据。实行界面交互,用户需要填写的信息在该界面编辑框内填写。
图7.15界面展示函数IPO图
(3)BOOL
CMyRepor::OnBnClickedButtonReportExcel():进行报表,此处为将ListCtrl控件内展示的储量信息进行输出,输出至本地Excel格式。
图7.16输出报表IPO图
(1)void
CQuantyView3DView::onRepor():该函数精度取决于品位估值以及块体模型的精度为0.001,在计算储量时,保持精度不变。
(2)新建界面BOOL
CMyRepor::OnInitDialog(),该功能的统计不改变原有数据的精度。
(3)BOOL
CMyRepor::OnBnClickedButtonReportExcel():该功能的输出不改变原有数据的精度。
上述功能能与用户实现实时交互,同时对于数据量小的报表输出所需时间更少。
表7.6 储量输出报表输入项
|
名称 |
标识符 |
数据类型 |
范围 |
输入方式 |
|
图层矿体数据 |
MineData |
vector<vector<double>> |
除了标高外所有数据大于或等于0 |
程序从图层中自动获取 |
|
全局铜块体有效数据存储容器 |
GlobalMineCu |
vector<vector<double>> |
除了标高外所有数据大于或等于0 |
程序自动处理 |
|
全局锌块体有效数据存储容器 |
GlobalMineZn |
vector<vector<double>> |
除了标高外所有数据大于或等于0 |
程序自动处理 |
|
全局硫块体有效数据存储容器 |
GlobalMineS |
vector<vector<double>> |
除了标高外所有数据大于或等于0 |
程序自动处理 |
|
间隔高度 |
MyParaHeight |
CString |
无 |
用户手动输入 |
|
起始高度 |
MyStartHeight |
CString |
无 |
用户手动输入 |
表7.7 储量输出报表输出项
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
铜储量统计结果 |
ReservesOfCu |
vector<vector<double>> |
除了标高外各项数据大于等于零 |
从函数返回,输出至表格 |
|
锌储量统计结果 |
ReservesOfZn |
vector<vector<double>> |
除了标高外各项数据大于等于零 |
从函数返回,输出至表格 |
|
硫储量统计结果 |
ReservesOfS |
vector<vector<double>> |
除了标高外各项数据大于等于零 |
从函数返回,输出至表格 |
主要涉及矿山储量计算相关算法,计算结果按标高进行统计(块体中心的坐标)主要公式为:C=∑VWρ。其中,C代表储量,V代表块体体积,W代表块体品位,ρ代表矿山密度。

图7.17整体框架流程
图7.18
数据处理流程
估值模块与该模块的接口为图层中的矿体块体数据。由于该模块不存在向下模块,故不存在向下接口。模型内部接口设计为全局矿体信息容器。
图7.19接口示意图
全局铜块体有效数据存储容器、全局锌块体有效数据存储容器、全局硫块体有效数据存储容器vector<vector<double>>GlobalMineCu、vector<vector<double>>GlobalMineZn、vector<vector<double>>GlobalMineZnS存储在静态区,其余的容器都存储在堆区;
A.模块首部注释说明本模块开始编写的时间,编写人员,及其基本功能;
B.加在各分枝点的注释说明算法执行所要具备的条件;
C.在各个变量后注释变量的实际含义以及约束条件
D.对使用的逻辑前注释该逻辑结构的编写目的,运行逻辑的文字描述,以及实现效果。
该程序在使用前必须进行要选择所含块体模型的界面。如果没有来到对应的界面,则会提示选择图层不在正确,也无法获得相应块体模型信息。同时,在使用该程序前,必须先进行品位估值,否则同样不能进行程序运行。
该程序进行测试时先自己设计输入的数据集。按照程序输入的数据格式,编写代码先填充容器,对这些容器中的设计数据进行运行操作。预期在运行过程中,找出如界面错误、结果错误等问题,对代码进行优化改进。
该程序设计的目的是控制主相机的移动方向、移动速度和旋转速度,来实现地面漫游和飞行漫游。在用户按下手柄按键时调用主相机的脚本函数进行移动。
图8.1
主相机漫游IPO图
(1)精度要求:x,y,z坐标精度为float类型。
(2)灵活性:具备较强的灵活性。
(3)时间特性:程序响应时间应小于10ms,用户按下方向键后能够做到实时移动。
表8.1 主相机漫游输入项
|
名称 |
标识符 |
数据类型 |
范围 |
输入方式 |
|
主相机原坐标 |
camerax cameray cameraz |
float |
无 |
从文件中获取 |
表8.2 主相机漫游输出项
|
名称 |
标识符 |
数据类型 |
范围 |
输出形式 |
|
变换后坐标 |
cameraxx camerayy cameraz |
float |
无 |
从函数返回 |
本程序仅涉及简单的代数运算,不涉及复杂的算法。

图8.2 主相机漫游流程图
本程序与其他模块之间不存在接口调用。
脚本唤醒分配内存,将对象的引用存储在对象的组件管理数组中,直到脚本的一个生命周期结束。
a:加在模块首部的注释,说明功能的要求,编写的时间;
b:加在各分枝点处的注释,说明每一步流程的划分;
c:对各变量所加的注释,说明变量具体的含义;
无
在Unity3D中设置主相机的初始位置,并执行一个脚本周期,观察相机位置的变化。
该程序设计的目的是获取手柄按键是否被按下,并注册相关的事件来做出相应的操作。

图8.3 手柄按键监听和事件注册IPO图
(1)精度要求:暂无。
(2)灵活性:该程序具备较强灵活性。
(3)时间特性:程序响应时间应小于10ms,用户按下手柄按键后能够做到实时交互。
表8.3
手柄按键监听和事件注册输入项
|
名称 |
标识符 |
数据类型 |
范围 |
输入方式 |
|
按键按下 |
GetButtonDown |
boolean |
无 |
从外界输入 |
|
按键抬起 |
GetButtonUp |
boolean |
无 |
从外界输入 |
表8.4 手柄按键监听和事件注册输出项
|
名称 |
标识符 |
数据类型 |
范围 |
输出方式 |
|
事件处理 |
ControllerEvent |
void |
无 |
从函数返回 |
本程序仅涉及逻辑判断和函数调用,不涉及算法。

图8.4 手柄按键监听和事件注册流程图
本程序与其他模块之间不存在接口调用。
脚本唤醒分配内存,将对象的引用存储在对象的组件管理数组中,直到脚本的一个生命周期结束。
a:加在模块首部的注释,说明功能的要求,编写的时间;
b:加在各分枝点处的注释,说明每一步流程的划分;
c:对各变量所加的注释,说明变量具体的含义;
需要连接手柄并配置相关适用平台。
连接手柄后按下手柄上的每一个按键,来测试相关事件是否被执行。
矿山块体模型构建函数部分,是基于自主设计的模型文件,在Unity3D软件内生成矿山整体的块体模型。此部分函数是后续所有功能函数的基础,每一个功能的实现都是建立在改部分生成的模型对象上的。

图9.1 矿山块体模型构建IPO图
对整个矿山块体模型的生成需要在用户打开APP的5s内构建完成。
矿山块体模型构建的每一个输入项如表所示。
表9.1 矿山块体模型构建程序输入项
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
块体中心点坐标 |
cubex cubey cubez |
double |
无 |
从文件中获取 |
|
块体边长 |
length |
double |
无 |
从文件中获取 |
|
模型ID |
ID |
int |
无 |
从文件中获取 |
|
模型颜色 |
ColorR ColorG ColorB |
int |
无 |
从文件中获取 |
|
属性名称 |
Mine |
char |
无 |
从文件中获取 |
|
属性值 |
MineContent |
double |
无 |
从文件中获取 |
矿山块体模型构建过程的输出项为矿山每一个块体对象的模型,每一个块体对象都是一个立方体,然后生成完整的矿山对象。
矿山块体模型的构建是在Unity3D中完成的,所有的函数功能实现均来自于开发软件自带的库,因此不存在算法的使用。

图9.2 矿山块体模型构建流程图
该部分成语需要使用到输入输出模块所输出的自定义模型文件。
Model()函数运行的存储分配方式为栈式存储。
a:加在模块首部的注释,说明功能的要求,编写的时间;
b:加在各分枝点处的注释,说明每一步流程的划分;
c:对各变量所加的注释,说明变量具体的含义;
所生成的模型完全取决于输入的数据集,需要数据集至少包含输入项所规定的所有数据项,才能够构建出正确的矿山整体模型。
该部分程序在测试时,首先输入部分数据集,记录模型生成的时间和呈现的效果,如果效果不好,则对块体生成过程进行优化修改,在,满足要求后,就可以使用完整的数据集,来生成需要的矿山块体模型。
放大缩小和旋转功能部分,这两个功能的实现都基于手机屏幕的触摸点。该程序设计的目的是帮助用户全面的观察整体的矿山块体模型,即通过缩放和旋转操作,观察到模型的每个方面,获取到更多信息。该程序属于常驻程序,用户随时可以通过手指触及来操作缩放和旋转的功能。该程序属于可重入程序,同一时间,仅支持单个功能的操作,不支持并发处理。

图9.3 缩放和旋转功能IPO图
程序对手指触摸移动的响应在0.5s之内,用户的操作需要APP能够做出实时的响应。
放大缩小和旋转功能的输入为矿山的块体模型,是矿山的整体,并非单个的块体对象。
该部分功能的输出已矿山整体的形态来呈现,用户进行操作,APP就可以实时反应出矿山整体缩放和旋转之后的状态。
放大缩小和旋转功能的实现是借助于Unity3D中的UnityEngine资源包完成的,所有的函数功能实现均来自于该资源包,因此不存在算法的使用。

图9.4 缩放和旋转功能流程图
放大缩小和旋转功能部分程序的操作,依赖于前一部分矿山块体模型构建出的矿山模型。
Touch()函数运行的存储分配方式为栈式存储。
a:加在模块首部的注释,说明功能的要求,编写的时间;
b:加在各分枝点处的注释,说明每一步流程的划分;
c:对各变量所加的注释,说明变量具体的含义;
缩放功能和旋转功能都是对矿山整体模型进行的操作,实现功能的前提是构建好了矿山的块体模型。
将项目发布到手机上,测试数据集生成的整体模型能否进行双指缩放和但只旋转的操作,测试缩放和旋转的速度,找到最适合用户操作的变化值。
对象属性查看功能部分。该程序设计的目的是帮助用户得到矿山更加具体的属性信息,即通过该部分功能,了解到矿山部分矿体位置的矿物名称和相应的品味值信息。。该程序属于非常驻程序,用户需要在选中想要查看的属性的对象后,点击查看属性按钮,APP才能弹出所选中对象的属性。该程序属于不可重入程序,选中物体后如果进行其他操作,需要重新进行选择,仅支持单个功能的操作,不支持并发处理。

图9.5 对象属性查看IPO图
用户在点击查看属性的按钮后,APP需要在1s内弹出属性信息。
该部分程序的输入项为已选中模型对象的唯一ID值。
表9.2 对象属性查看程序输入项表
|
名称 |
标识符 |
数据类型 |
范围 |
方式 |
|
模型ID |
ID |
int |
无 |
从所选中对象获取 |

图9.6 输出项展示图
该部分的输出项以弹窗的形使展现,弹窗里包含了模型ID值、属性名称和品味值。
对象属性查看功能的实现是借助于Unity3D中的UnityEngine资源包完成的,所有的函数功能实现均来自于该资源包,因此不存在算法的使用。

图9.7 对象属性查看流程图
对象属性查看功能使用的前提,需要先选中相应的对象,因此需要矿山块体模型构建出的模型,作为操作对象。
AttributeView()函数运行的存储分配方式为动态存储区的栈式存储,只有在运行的时候才能确定数据对象的存储分配结果。
a:加在模块首部的注释,说明功能的要求,编写的时间;
b:加在各分枝点处的注释,说明每一步流程的划分;
c:对各变量所加的注释,说明变量具体的含义;
该部分程序只有才选中对象之后,并点击按钮才会进行,未选中对象时点击按钮,或选中对象后不点击按钮,均不会进行响应。
对测试集建立的模型进行对象属性查看测试,观察能否找到所选中对象对应的属性信息。