CN107680154B - 基于视图的体素几何参数提取方法 - Google Patents
基于视图的体素几何参数提取方法 Download PDFInfo
- Publication number
- CN107680154B CN107680154B CN201710896904.0A CN201710896904A CN107680154B CN 107680154 B CN107680154 B CN 107680154B CN 201710896904 A CN201710896904 A CN 201710896904A CN 107680154 B CN107680154 B CN 107680154B
- Authority
- CN
- China
- Prior art keywords
- list
- line
- ixd
- turning
- point
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/10—Geometric effects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/20—Design optimisation, verification or simulation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/08—Volume rendering
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T17/00—Three dimensional [3D] modelling, e.g. data description of 3D objects
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Geometry (AREA)
- Computer Graphics (AREA)
- Computer Hardware Design (AREA)
- Evolutionary Computation (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Image Generation (AREA)
- Apparatus For Radiation Diagnosis (AREA)
Abstract
本发明针对模型引导的三维重建问题,提出基于三视图的人机结合的体素几何参数提取方法。该方法以记录一个组合体三视图的数据文件为输入,通过图线分类读取、视图分割和投影坐标转换得到以两个坐标形式表示的组合体的三个投影图,接着在搭建的四视区图形平台的左上、左下和右上视区分别显示主视图、俯视图和左视图,然后利用图形平台的交互技术并结合人读图的优势人机交互描绘非拉伸体素的三个投影或拉伸体素的基图形实形及拉伸线,最后由计算机识别出体素类型并输出体素的几何参数。本发明的体素几何参数提取方法具有简单高效、运算量小、可靠并且很实用等优点,可用于逆向工程中的三维建模、基于草图的产品三维设计和制图课程中读组合体视图的计算机辅助教学。
Description
技术领域
本发明属于计算机图形学技术领域,涉及三维几何模型重建中体素几何参数提取所用的方法,具体地说是基于视图的体素几何参数提取方法,可用于逆向工程中的三维建模、基于草图的产品三维设计和制图课程中读组合体视图的计算机辅助教学。
背景技术
随着计算机技术的不断发展和CG/CAD/CAM在制造业领域的不断推广,现在CAD/CAM正朝着智能化和集成化方向发展,出现了一些新的制造模式。在这些新模式中,数据模型起到了关键作用,产品数据模型由机械工件的几何模型加上有关工件的技术信息和装配构成,有了产品模型,既可以通过各种造型加上有关工件的技术实现对产品的直观了解,也可以对产品的装配过程和方式进行规划和模拟。在传统的制造系统中,工程视图作为一种以投影原理表达空间三维形体的有效手段。但是在目前的集成制造系统中,三维数据是产品数据模型的几何核心,以工程图的形式表达的信息并不能直接用于CAD/CAM的集成化制造过程中,而在长期的实践中,积累了大量的二维工程图纸,因此,如何通过三维重建技术在采用三维数据模型的新技术和采用二维表达的工程图之间架起一座联系的桥梁,是一个迫切需要解决的问题。
工程三视图是以正投影的原理表达三维零件的一种有效手段。它广泛应用于机械零件设计领域。自Idesawa于20世纪70年代首次发表关于由工程三视图重建三维物体的论文以来,这一课题的研究受到普遍重视,其研究动因主要来自两个方面:一是人工智能领域的研究工作者试图解决工程三视图的机器解释问题,从而拓宽计算机视觉和机器人视觉功能的应用范围;二是从事CAD/CAM的科技人员则以此作为计算机辅助几何造型的一种新的方法来研究。基于多个视图进行三维几何造型进入本世纪后,愈发受到研究人员的重视,其新的应用主要有:①3D打印模型的获得。如用户购买的产品零件坏了,不想购买或买不到,可以通过3D打印得到。若用户没有该零件的3D模型,可以拍照零件的几个典型视图图片并经矢量化软件处理,借助三维重建软件就可建立该零件的3D模型,然后用3D打印机打印出该零件;②基于草图的产品设计代表一种产品设计方法,人们可以勾画零件视图草图、装配体视图草图进行产品设计,而不是直接建三维模型设计,有了视图草图,再经过视图规整处理,利用三维重建软件就可方便地得到零件的三维模型;③制图课程中读组合体视图的计算机辅助教学。可以依据课程教学中的“形体分析法”,按照人识图的思路,辅助人机交互操作研制三维重建软件,作为读图教学通用软件平台使用。
基于工程三视图的三维重建核心在于对三视图几何信息的提取,由于工程三视图具有很大的灵活性、人为性、模糊性、经验性,因而很难找到一种十分精确、严密,同时计算效率高的数学模型对三维重建问题进行求解。文献“A System to Generate a SolidFigure from Three view”(JSME Bulletin,1973(2):216-255,作者:Idesawa M)提出了一种基于三维平面形体三个正交投影图的数学处理方法,运用一些简略的判定规则,自底向上处理图形,由二维顶点转换成空间顶点,再由空间顶点生成空间边,每一步计算产生的不属于实际形体的顶点、边、面称为虚假元素,算法提出用一定的规则将这些元素剔除,但此算法只适用于非常简单的实体的重建,对于数学模型中出现的病态解和多解不能进行相应的处理;文献“Fleshing Out Wire Frames”(IBM J.RES.DEVELOP,1981,24(5):582-597,作者:George Markowsky,MichaelA.Wesley)提出了基于精确的数学模型,对三维重建的平面实体进行求解。该算法首先针对输入的二维顶点进行三维转化,进而得到三维的线框,三维线框再生成潜在平面,对内部相交的平面通过引入“切割边”将其分割成更小的面,然后进行组合,生成三维实体,但该算法计算量偏大,每一步都要计算和去除虚假元素(点、线、面、体);文献“基于三视图的三维形体重建技术”(计算机学报,2000,23(2):141-146,作者:刘世霞,孙家广等)提出了三维形体重建算法,该算法首先根据三视图生成形体的线框图,然后应用左邻边搜索策略求出线框图内的所有面及相应的极小环,最后利用Moebius规则(即正则形体中的每一条边属于两个面,且其在两个面环中的方向相反)及工程图的性质(即组成正则形体的任意两个面除了构成它们的边之外,不能再有任何交线),删除重建过程中生成的非法元素;文献“On Automatic Reconsitution of 3D Structures from 2DRepresentations”(Computer Aided Design,1983,15(02):59-64,作者:Aldefeld B)提出模型引导的三维重建算法,该算法认为三维实体可由若干个体素(或称为基本体)通过布尔运算(主要为并、差运算)得到,运用模式识别的匹配思想,对三视图中图元信息进行匹配得到各个体素,再通过CSG树并利用布尔运算将体素组合起来便得三维实体。该算法最为关键之处在于视图中体素的识别(因CSG树构建并不难,三维布尔运算已很成熟),体素识别不正确的话,整个模型重建结果的正确性无从谈起。但是该算法要求体素在投影图中的投影必须完整且每一个体素都要等厚,否则不能进行正确的识别,而工程中大量出现视图上存在截交线、相贯线将视图上环交织在一起而导致体素投影不完整的问题,不等厚体素也经常出现,因此该方法可识别的情况非常有限,离实用有较大的差距。可以看出,已有研究成果存在以下问题:(1)算法效率不高,由于反复执行投影匹配操作和复杂的几何运算,需要较长的处理时间;(2)算法计算量大,每一步都要通过大量的运算,排除每一步中的虚假元素;(3)要求苛刻,要求实体经过投影后,每一条轮廓边都要出现在相应的视图当中,计算和对输入视图的要求都非常苛刻;(4)自动识别方法适用面很有限,离实用有较大的差距。
发明内容
本发明的目的在于克服上述已有技术的不足,针对模型引导的三维重建问题,提供一种简单高效、运算量小、可靠并且很实用的基于视图的体素几何参数提取方法。
本发明的目的是这样实现的:基于视图的体素几何参数提取方法,其特征是:至少包括如下步骤:
步骤101:打开一个三视图数据文件;三视图数据文件是在X轴水平朝右、Y轴竖直朝上、原点在左下角这样的二维直角坐标系下描述的一个组合体图形文件,其中,组合体的主视图、俯视图和左视图之间严格符合“长对正、高平齐、宽相等”的投影规律且视图按1:1的比例绘制,视图中的图线包括直线段、圆和圆弧,图线的线型包括粗实线、细虚线和细点画线,直线段用其两个端点和线型描述,圆用其圆心、半径和线型描述,圆弧用其圆心、半径、起始角度、终止角度和线型描述;
步骤102:从打开的文件中读取图线信息,将读取到的直线段数据存入链表Line_list,圆数据存入链表Circle_list,圆弧数据存入链表Arc_list中;
步骤103:遍历链表Line_list,Circle_list,Arc_list,找出三视图分割线,从三视图图形中分割出主视图、俯视图和左视图;
步骤104:将分割出的主视图构成信息按直线段、圆和圆弧类型分别存入链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中,将分割出的俯视图构成信息按直线段、圆和圆弧类型分别存入链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中,将分割出的左视图构成信息按直线段、圆和圆弧类型分别存入链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中;
步骤105:建立投影坐标系,求出组合体的三个投影坐标;
步骤106:利用VC++6.0和OpenGL搭建一个图形平台,该图形平台具有左上、左下、右上、右下四个视区,其中左上视区用于绘制主视图,建立的二维直角坐标系的原点在视区的右下角,X轴正向水平朝左,Z轴正向竖直朝上;左下视区用于绘制俯视图,建立的二维直角坐标系的原点在视区的右上角,X轴正向水平朝左,Y轴正向竖直朝下;右上视区用于绘制左视图,建立的二维直角坐标系的原点在视区的左下角,Y轴正向水平朝右,Z轴正向竖直朝上;右下视区用于显示重建的三维模型,坐标系为常见的三维右手直角坐标系;该图形平台能绘制线型为粗实线、细虚线、细点画线的直线段、圆和圆弧,具有用于体素信息提取的主视图、俯视图、左视图切换按钮和非拉伸体素投影描绘按钮、提取拉伸体素按钮、体素提取结果按钮,具有用于体素信息提取的延伸线绘制、特征点捕捉和投影关联功能,具有每个视区内的图形屏幕缩放功能;非拉伸体素是指长方体、楔形体、圆柱体、圆锥体和圆球体,楔形体是由一个长方体沿表面对角线切分得到的全等的两个立体之一;拉伸体素是由一个平行于某个坐标平面的基图形沿坐标轴正方向等厚度拉伸形成的一个立体;基图形是最靠近原点的用于拉伸形成一个体的平面上的封闭图线,是由纯直线段、纯圆弧段或直线段、圆弧混合构成的首尾相连的图线;延伸线是指以视图上已有或描绘的直线段端点、中点、圆或圆弧的圆心、直线段交点等为起点,以鼠标移动方向为方向的水平或竖直射线,延伸线以点线型绘出;特征点捕捉就是抓取视图上直线段的端点、中点,抓取圆、圆弧的圆心,抓取两直线段或直线段、延伸线的交点,抓取就是当移动的鼠标光标位置与这些特征点的距离小于0.001时,这些特征点就以小尺寸的特殊符号显示出来,端点符号为“□”,中点符号为“△”,圆心符号为“●”,交点符号为“×”,当这些特征点的显示符号出现后,按下或松开鼠标器拾取键后就把这些特征点作为要输入的点;投影关联是指在一个视图上描绘出体素一个投影后,在其他两个视图上将满足“长对正、高平齐、宽相等”约束关系的图线上的端点、圆心以绿色小圆圈醒目显示;
步骤107:在搭建的图形平台左上视区绘出链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,得到主视图;在图形平台左下视区绘出链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,得到俯视图;在图形平台右上视区绘出链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,得到左视图;
步骤108:判断是否按下提取拉伸体素的按钮,若是则转至步骤116,若不是则转至步骤109;
步骤109:点击视图切换按钮,分别在主视图、俯视图、左视图上描绘直线段、圆、圆弧等图线,若描绘的直线段不是视图本身的线段,则将其按所在的视图分别存入链表FrontViewData.Line_list、TopViewData.Line_list、SideViewData.Line_list中,描绘的图线以红色绘出;描绘图线是指利用特征点捕捉、延伸线和投影关联工具沿视图上的轮廓线进行绘制或利用图线端点、中点、圆心、交点等特征点进行绘制;描绘直线段的方法是:移动鼠标光标到某一特征点并按下鼠标左键,然后按住鼠标左键不放并移动鼠标光标到另一特征点时松开鼠标左键,则在此两个特征点之间描绘一条直线段;描绘圆、圆弧的方法是:移动鼠标光标到某一圆或圆弧的圆心并按下鼠标左键,然后按住鼠标左键不放并沿半径方向移动鼠标光标到弧上时松开鼠标左键,若原视图图线为圆则描绘出圆,若原视图图线为圆弧则描绘出圆弧;
步骤110:分别在三个视图中提取体素投影图元信息,并将其保存在各自的图元信息链表中;图元信息是指构成体素投影的单元信息,包括直线段、圆、圆弧;
步骤111:对主视图体素投影特征进行识别,并对识别结果进行标记;
步骤112:对俯视图体素投影特征进行识别,方法为执行步骤111,将步骤111中的链表FrontViewData.IXD.Circle_list替换为TopViewData.IXD.Circle_list、链表FrontViewData.IXD.Line_list替换为TopViewData.IXD.Line_list,投影特征为圆时标记为T_C,投影特征为三角形时标记为T_T,投影特征为矩形时标记为T_R;
步骤113:对左视图体素投影特征进行识别,方法为执行步骤111,将步骤111中的链表FrontViewData.IXD.Circle_list替换为SideViewData.IXD.Circle_list、链表FrontViewData.IXD.Line_list替换为SideViewData.IXD.Line_list,投影特征为圆时标记为S_C,投影特征为三角形时标记为S_T,投影特征为矩形时标记为S_R;
步骤114:识别体素类型并提取体素参数,并将识别出的体素三个投影以蓝色绘出;
步骤115:输出体素类型和参数,体素类型为长方体、楔形体、圆柱体、圆锥体和圆球体之一,长方体的参数为定位点和长、宽、高尺寸,楔形体的参数为定位点、三个轴向尺寸和厚度方向的三个方向角,圆柱体的参数为定位点、底面半径、高度和轴线方向的三个方向角,圆锥体的参数为定位点、底面半径、高度和轴线方向的三个方向角,圆球体的参数为球心和半径;将链表FrontViewData.IXD.Line_list、FrontViewData.IXD.Circle_list、TopViewData.IXD.Line_list、TopViewData.IXD.Circle_list、SideViewData.IXD.Line_list、SideViewData.IXD.Circle_list清零;
步骤116:按照步骤109的方法,在反映拉伸体素基图形实形的视图上描绘基图形实形,在反映拉伸体素厚度的视图上描绘拉伸线,描绘的图线以红色绘出;拉伸线是反映拉伸厚度的一条直线段;
步骤117:参照步骤110,提取基图形实形信息和拉伸线信息并进行保存,若在主视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表FrontBaseGraph.IXD_list中,若在俯视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表TopBaseGraph.IXD_list中,若在左视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表SideBaseGraph.IXD_list中;若在主视图上描绘了拉伸线,则拉伸线的两个端点保存在链表FrontExt.IXD_list中,若在俯视图上描绘了拉伸线,则拉伸线的两个端点保存在链表TopExt.IXD_list中,若在左视图上描绘了拉伸线,则拉伸线的两个端点保存在链表SideExt.IXD_list;基图形实形链表FrontBaseGraph.IXD_list、TopBaseGraph.IXD_list和SideBaseGraph.IXD_list中的每个元素包括线类型和几何参数,直线段的线类型为LIN,几何参数为直线段的起点和终点;圆弧的线类型为ARC,几何参数为圆心、半径、起始角度、终止角度;参照步骤111中三角形封闭性检查的方法,若链表FrontBaseGraph.IXD_list或TopBaseGraph.IXD_list或SideBaseGraph.IXD_list中的元素遍历完后,所存储的图线是首尾相连的,则该链表中的基图形实形合法,否则提示不合法,需要进行重新描绘直至合法为止;
步骤118:输出基图形实形数据和拉伸厚度,将体素提取过程中使用的临时链表清零;
步骤119:重复步骤108~步骤118,直到三视图中可提取的体素提取完为止。
所示的步骤103中遍历链表Line_list,Circle_list,Arc_list,找出三视图分割线,从三视图图形中分割出主视图、俯视图和左视图,包括以下步骤:
步骤201:遍历图线链表Line_list、Circle_list、Arc_list,找出整个三视图上x坐标值最大的点(X_max,y)和y坐标值最小的点(x,Y_min);
步骤202:在x坐标值最大的点(X_max,y)中找出y坐标值最小的点,则过该点平行于X轴的直线就是初始水平分割线,其y坐标值记为Y_Sepa,并令Ymin=Y_Sepa;
步骤203:在y坐标值最小的点(x,Y_min)中找出x坐标值最大的点,则过该点平行于Y轴的直线就是初始竖直分割线,其x坐标值记为X_Sepa,并令Xmax=X_Sepa;
步骤204:遍历图线链表Line_list、Circle_list、Arc_list,找出与分割线Y_Sepa相交的图线,并在相交图线中找出y坐标值最小且小于Y_Sepa的点,记这个最小y坐标值为Ymin;图线与分割线相交包含有重合和相切特殊情况;
步骤205:判断Y_Sepa与Ymin是否相等,若相等则转至步骤207,若不相等则转至步骤206;
步骤206:令Y_Sepa=Ymin,转至步骤204;
步骤207:遍历图线链表Line_list、Circle_list、Arc_list,找出与分割线X_Sepa相交的图线,并在相交图线中找出x坐标值最大且大于X_Sepa的点,记这个最大x坐标值为Xmax;
步骤208:判断X_Sepa与Xmax是否相等,若相等则转至步骤210,若不相等则转至步骤209;
步骤209:令X_Sepa=Xmax,转至步骤207;
步骤210:遍历图线链表Line_list、Circle_list、Arc_list,将点坐标满足x≤X_Sepa同时y≥Y_Sepa的图线归入主视图,将点坐标满足y<Y_Sepa的图线归入俯视图,将点坐标满足x>X_Sepa的图线归入左视图。
所示的步骤105中建立投影坐标系,求出组合体的三个投影坐标,包括以下步骤:
步骤301:遍历主视图链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,求出视图的最大x坐标值Fxmax、最小y坐标值Fymin;遍历俯视图链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,求出视图的最大y坐标值Tymax;遍历左视图链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,求出视图的最小x坐标值Sxmin;
步骤302:令D=1/2Min(Sxmin-Fxmax,Fymin-Tymax),x0=Sxmin-D,y0=Tymax+D,在三视图平面上建立展开后的投影坐标系O′-X′-Y′-Z′,其中投影坐标系的原点为O′(x0,y0),X′轴正向水平朝左,Z′轴正向竖直朝上,Y′轴正向分别与X′轴正向、Z′轴正向相反;
步骤303:遍历主视图链FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令x′=x0-x,z′=y-y0,用点(x′,z′)替换这三个链表中的点(x,y);
步骤304:遍历俯视图链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令x′=x0-x,y′=y0-y,用点(x′,y′)替换这三个链表中的点(x,y);
步骤305:遍历左视图链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令y′=x-x0,z′=y-y0,用点(y′,z′)替换这三个链表中的点(x,y)。
所示的步骤110中分别在三个视图中提取体素投影图元信息,并将其保存在各自的图元信息链表中,包括以下步骤:
步骤401:判断哪个视图切换按钮被按下,若按下主视图切换按钮并描绘图形,则转至步骤402;若按下俯视图切换按钮并描绘图形,则转至步骤409;若按下左视图切换按钮并描绘图形,则转至步骤416;
步骤402:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤403:遍历链表FrontViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤404,若不是则转至步骤406;
步骤404:将以P0、P1为端点的直线段存入链表FrontViewData.IXD.Line_list中;
步骤405:是否结束描绘图形,若不结束则转至步骤402,若结束则主视图体素投影图元信息提取完成;
步骤406:遍历链表FrontViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤407,若没有则转至步骤408;
步骤407:将圆心、半径存入链表FrontViewData.IXD.Circle_list中,转至步骤405;
步骤408:本次投影信息提取失败,转至步骤402;
步骤409:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤410:遍历链表TopViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤411,若不是则转至步骤413;
步骤411:将以P0、P1为端点的直线段存入链表TopViewData.IXD.Line_list中;
步骤412:是否结束描绘图形,若不结束则转至步骤409,若结束则俯视图体素投影图元信息提取完成;
步骤413:遍历链表TopViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤414,若没有则转至步骤415;
步骤414:将圆心、半径存入链表TopViewData.IXD.Circle_list中,转至步骤412;
步骤415:本次投影信息提取失败,转至步骤409;
步骤416:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤417:遍历链表SideViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤418,若不是则转至步骤420;
步骤418:将以P0、P1为端点的直线段存入链表SideViewData.IXD.Line_list中;
步骤419:是否结束描绘图形,若不结束则转至步骤416,若结束则左视图体素投影图元信息提取完成;
步骤420:遍历链表SideViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤421,若没有则转至步骤422;
步骤421:将圆心、半径存入链表SideViewData.IXD.Circle_list中,转至步骤419;
步骤422:本次投影信息提取失败,转至步骤416。
所示的步骤111中对主视图体素投影特征进行识别,并对识别结果进行标记,包括以下步骤:
步骤501:判断链表FrontViewData.IXD.Circle_list中的元素个数是否为1,若为1则转至步骤502,否则转至步骤503;
步骤502:主视图体素投影特征为圆,标记其投影特征为F_C,结束;
步骤503:判断链表FrontViewData.IXD.Line_list中的元素个数是否为3,若为3则转至步骤504,否则转至步骤511;
步骤504:取链表FrontViewData.IXD.Line_list中第一条直线段为查找边,保存此线段起始点并设该起始点为查找点,令查找次数为0;
步骤505:判断查找次数是否为3,若为3则转至步骤509,否则转至步骤506;
步骤506:判断在链表FrontViewData.IXD.Line_list中是否存在某个端点与查找点重合的直线段,若存在则转至步骤507,否则转至步骤519;
步骤507:判断新边与旧边是否共线,若共线则转至步骤519,否则转至步骤508;新边是指找到的端点与当前查找点重合的边,旧边是指当前查找点所在的边;设新边矢量为旧边矢量为若的值为1或-1,则新边与旧边共线;
步骤508:将新边作为下一轮的查找边,令新边重合点之外的端点为下一轮的查找点,令查找次数加1;
步骤509:判断当前查找点与保存的起始点是否重合,若重合则转至步骤510,否则转至步骤519;
步骤510:主视图体素投影特征为三角形,标记其投影特征为F_T,结束;
步骤511:判断链表FrontViewData.IXD.Line_list中的元素个数是否为4,若为4则转至步骤512,否则转至步骤519;
步骤512:取链表FrontViewData.IXD.Line_list中第一条直线段为查找边,保存此线段起始点并设该起始点为查找点,令查找次数为0;
步骤513:判断查找次数是否为4,若为4则转至步骤517,否则转至步骤514;
步骤514:判断在链表FrontViewData.IXD.Line_list中是否存在某个端点与查找点重合的直线段,若存在则转至步骤515,否则转至步骤519;
步骤516:将新边作为下一轮的查找边,令新边重合点之外的端点为下一轮的查找点,令查找次数加1;
步骤517:判断当前查找点与保存的起始点是否重合,若重合则转至步骤518,否则转至步骤519;
步骤518:主视图体素投影特征为矩形,标记其投影特征为F_R,结束;
步骤519:主视图体素投影特征识别失败。
所示的步骤114中识别体素类型并提取体素参数,并将识别出的体素三个投影以蓝色绘出,包括以下步骤:
步骤601:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤602,否则转至步骤604;
步骤602:体素类型为正放的长方体;正放是指体素的棱边或主要棱边分别与坐标系的坐标轴平行,或者体素的轴线与某一坐标轴平行;
步骤603:求出长方体的定位点和长、宽、高尺寸,转至步骤634;长方体的定位点取最靠近原点的顶点,长、宽、高尺寸分别为长方体沿坐标轴方向的棱边长度;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表TopViewData.IXD.Line_list,求出4条线段的ymin、ymax,则长方体的定位点为(xmin,ymin,zmin),长方体的长、宽、高尺寸分别为xmax-xmin、ymax-ymin、zmax-zmin,长、宽、高为正值时表示沿坐标轴正向生成长方体;
步骤604:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_T、左视图特征为S_R,若同时满足则转步骤605,否则转至步骤607;
步骤605:体素类型为正放的厚度方向沿Z轴的楔形体;楔形体的厚度方向是指垂直于靠近坐标平面的底面三角形且沿坐标轴正向的矢量方向;
步骤606:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;楔形体的定位点取最靠近原点的底面直角三角形的直角顶点,轴向尺寸为沿三个坐标轴方向的棱边长度,方向角是指厚度方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表TopViewData.IXD.Line_list,求出3条线段的ymin、ymax及直角顶点(xsq,ysq),则楔形体的定位点为(xsq,ysq,zmin);当xmax>xsq同时ymax>ysq时,楔形体沿X轴、Y轴的轴向尺寸分别为xmax-xsq、ymax-ysq;当xsq>xmin同时ymax>ysq时,楔形体沿X轴、Y轴的轴向尺寸分别为xmin-xsq、ymax-ysq;当xsq>xmin同时ysq>ymin时,楔形体沿X轴、Y轴的轴向尺寸分别为xmin-xsq、ymin-ysq;当xmax>xsq同时ysq>ymin时,楔形体沿X轴、Y轴的轴向尺寸分别为xmax-xsq、ymin-ysq;楔形体沿Z轴的轴向尺寸为zmax-zmin;轴向尺寸为正值时表示沿坐标轴正向生成楔形体,轴向尺寸为负值时表示沿坐标轴负向生成楔形体;厚度方向的方向角分别为90°、90°、0°;
步骤607:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_T,若同时满足则转步骤608,否则转至步骤610;
步骤608:体素类型为正放的厚度方向沿X轴的楔形体;
步骤609:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表SideViewData.IXD.Line_list,求出3条线段的ymin、ymax及直角顶点(ysq,zsq),则楔形体的定位点为(xmin,ysq,zsq);楔形体沿X轴的轴向尺寸为xmax-xmin;当ymax>ysq同时zmax>zsq时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymax-ysq、zmax-zsq;当ysq>ymin同时zmax>zsq时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymin-ysq、zmax-zsq;当ysq>ymin同时zsq>zmin时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymin-ysq、zmin-zsq;当ymax>ysq同时zsq>zmin时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymax-ysq、zmin-zsq;厚度方向的方向角分别为0°、90°、90°;
步骤610:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤611,否则转至步骤613;
步骤611:体素类型为正放的厚度方向沿Y轴的楔形体;
步骤612:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出3条线段的zmin、zmax及直角顶点(xsq,zsq),遍历链表TopViewData.IXD.Line_list,求出4条线段的xmin、xmax、ymin、ymax,则楔形体的定位点为(xsq,ymin,zsq);楔形体沿Y轴的轴向尺寸为ymax-ymin;当xmax>xsq同时zmax>zsq时,楔形体沿X轴、Z轴的轴向尺寸分别为xmax-xsq、zmax-zsq;当xmax>xsq同时zsq>zmin时,楔形体沿X轴、Z轴的轴向尺寸分别为xmax-xsq、zmin-zsq;当xsq>xmin同时zsq>zmin时,楔形体沿X轴、Z轴的轴向尺寸分别为xmin-xsq、zmin-zsq;当xsq>xmin同时zmax>zsq时,楔形体沿X轴、Z轴的轴向尺寸分别为xmin-xsq、zmax-zsq;厚度方向的方向角分别为90°、0°、90°;
步骤613:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_C、左视图特征为S_R,若同时满足则转步骤614,否则转至步骤616;
步骤614:体素类型为正放的轴线沿Z轴的圆柱体;
步骤615:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;圆柱体的定位点取最靠近原点的底面圆的圆心,轴线方向是指垂直于靠近坐标平面的底面圆且沿坐标轴正向的矢量方向,轴线方向的方向角是指轴线方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出4条线段的zmin、zmax,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc)和半径值r,则圆柱体的定位点为(xc,yc,zmin),底面半径为r,高度为zmax-zmin,轴线方向的方向角为90°、90°、0°;
步骤616:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_C,若同时满足则转步骤617,否则转至步骤619;
步骤617:体素类型为正放的轴线沿X轴的圆柱体;
步骤618:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax,遍历链表SideViewData.IXD.Circle_list,获取圆心(yc,zc)和半径值r,则圆柱体的定位点为(xmin,yc,zc),底面半径为r,高度为xmax-xmin,轴线方向的方向角为0°、90°、90°;
步骤619:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤620,否则转至步骤612;
步骤620:体素类型为正放的轴线沿Y轴的圆柱体;
步骤621:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Line_list,求出4条线段的ymin、ymax,则圆柱体的定位点为(xc,ymin,zc),底面半径为r,高度为ymax-ymin,轴线方向的方向角为90°、0°、90°;
步骤622:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_C、左视图特征为S_T,若同时满足则转步骤623,否则转至步骤625;
步骤623:体素类型为正放的轴线沿Z轴的圆锥体;
步骤624:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;圆锥体的定位点取最靠近原点的底面圆的圆心,轴线方向是指垂直于靠近坐标平面的底面圆且沿坐标轴正向的矢量方向,轴线方向的方向角是指轴线方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出3条线段的zmin、zmax,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc)和半径值r,则圆锥体的定位点为(xc,yc,zmin),底面半径为r,高度为zmax-zmin,轴线方向的方向角为90°、90°、0°;
步骤625:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_T、左视图特征为S_C,若同时满足则转步骤626,否则转至步骤628;
步骤626:体素类型为正放的轴线沿X轴的圆锥体;
步骤627:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出3条线段的xmin、xmax,遍历链表SideViewData.IXD.Circle_list,获取圆心(yc,zc)和半径值r,则圆锥体的定位点为(xmin,yc,zc),底面半径为r,高度为xmax-xmin,轴线方向的方向角为0°、90°、90°;
步骤628:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_T、左视图特征为S_T,若同时满足则转步骤629,否则转至步骤631;
步骤629:体素类型为正放的轴线沿Y轴的圆锥体;
步骤630:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Line_list,求出3条线段的ymin、ymax,则圆锥体的定位点为(xc,ymin,zc),底面半径为r,高度为ymax-ymin,轴线方向的方向角为90°、0°、90°;
步骤631:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_C、左视图特征为S_C,若同时满足则转步骤632,否则转至步骤635;
步骤632:体素类型为圆球体;
步骤633:求出圆球体的球心和半径,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc),则圆球体的球心为(xc,yc,zc),半径为r;
步骤634:将体素的三个投影以蓝色绘出;
步骤635:体素类型识别失败。
所示的步骤118中输出基图形实形数据和拉伸厚度,将体素提取过程中使用的临时链表清零,包括以下步骤:
步骤701:判断链表FrontBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤702,若为0则转至步骤708;
步骤702:判断链表TopExt.IXD_list是否为空,若不为空则转至步骤703,若为空则转至步骤705;
步骤703:求取链表TopExt.IXD_list中线段的ymin、ymax,则拉伸厚度为ymax-ymin;设链表FrontBaseGraph.IXD_list中图线的点为(x,z),用点(x,ymin,z)替换链表中的点(x,z);
步骤704:输出链表FrontBaseGraph.IXD_list中的基图形数据和拉伸厚度ymax-ymin,将链表FrontBaseGraph.IXD_list和TopExt.IXD_list清零;
步骤705:判断链表SideExt.IXD_list是否为空,若不为空则转至步骤706,若为空则转至步骤722;
步骤706:求取链表SideExt.IXD_list中线段的ymin、ymax,则拉伸厚度为ymax-ymin;设链表FrontBaseGraph.IXD_list中图线的点为(x,z),用点(x,ymin,z)替换链表中的点(x,z);
步骤707:输出链表FrontBaseGraph.IXD_list中的基图形数据和拉伸厚度ymax-ymin,将链表FrontBaseGraph.IXD_list和SideExt.IXD_list清零;
步骤708:判断链表TopBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤709,若为0则转至步骤715;
步骤709:判断链表FrontExt.IXD_list是否为空,若不为空则转至步骤710,若为空则转至步骤712;
步骤710:求取链表FrontExt.IXD_list中线段的zmin、zmax,则拉伸厚度为zmax-zmin;设链表TopBaseGraph.IXD_list中图线的点为(x,y),用点(x,y,zmin)替换链表中的点(x,y);
步骤711:输出链表TopBaseGraph.IXD_list中的基图形数据和拉伸厚度zmax-zmin,将链表TopBaseGraph.IXD_list和FrontExt.IXD_list清零;
步骤712:判断链表SideExt.IXD_list是否为空,若不为空则转至步骤713,若为空则转至步骤722;
步骤713:求取链表SideExt.IXD_list中线段的zmin、zmax,则拉伸厚度为zmax-zmin;设链表TopBaseGraph.IXD_list中图线的点为(x,y),用点(x,y,zmin)替换链表中的点(x,y);
步骤714:输出链表TopBaseGraph.IXD_list中的基图形数据和拉伸厚度zmax-zmin,将链表TopBaseGraph.IXD_list和SideExt.IXD_list清零;
步骤715:判断链表SideBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤716,若为0则转至步骤722;
步骤716:判断链表FrontExt.IXD_list是否为空,若不为空则转至步骤717,若为空则转至步骤719;
步骤717:求取链表FrontExt.IXD_list中线段的xmin、xmax,则拉伸厚度为xmax-xmin;设链表SideBaseGraph.IXD_list中图线的点为(y,z),用点(xmin,y,z)替换链表中的点(y,z);
步骤718:输出链表SideBaseGraph.IXD_list中的基图形数据和拉伸厚度xmax-xmin,将链表SideBaseGraph.IXD_list和FrontExt.IXD_list清零;
步骤719:判断链表TopExt.IXD_list是否为空,若不为空则转至步骤720,若为空则转至步骤722;
步骤720:求取链表TopExt.IXD_list中线段的xmin、xmax,则拉伸厚度为xmax-xmin;设链表SideBaseGraph.IXD_list中图线的点为(y,z),用点(xmin,y,z)替换链表中的点(y,z);
步骤721:输出链表SideBaseGraph.IXD_list中的基图形数据和拉伸厚度xmax-xmin,将链表SideBaseGraph.IXD_list和TopExt.IXD_list清零;
步骤722:拉伸体素参数提取失败。
本发明有如下优点:
(1)利用配套的交互工具人工在视图上“描绘”体素的投影,而体素形状识别靠知识库和推理自动完成,体素参数提取则由几何计算自动得到,这样将人读图的优势和计算机计算、分析和组织数据的优势结合起来,从而保证体素识别比以往自动识别方法正确、可靠;
(2)所提出的方法无反复的投影匹配操作,无复杂、大量的计算,每步都是有效的操作,因此方法简单高效、运算量小;
(3)所提出的方法比以往的自动方法实用。
附图说明
图1是本发明的总流程图;
图2是从三视图图形中分割出主视图、俯视图和左视图的流程图;
图3是建立投影坐标系并求出组合体的三个投影坐标的流程图;
图4是分别在三个视图中提取体素投影图元信息并予以保存的流程图;
图5是对主视图体素投影特征进行识别并进行标记的流程图;
图6是识别体素类型并提取体素参数的流程图;
图7是输出拉伸体素基图形实形数据和拉伸厚度的流程图;
图8是本发明中的图形平台界面图;
图9(a)是在图8所示图形平台上显示的用于非拉伸体素几何参数提取的组合体三视图示例图;图9(b)是对图9(a)所示组合体在俯视图上描绘的体素投影,加粗的图线代表描绘的图线;图9(c)是主视图上与图9(b)描绘的体素投影相关联的提示图,小圆圈表示投影关联的位置;图9(d)是左视图上与图9(b)描绘的体素投影相关联的提示图,小圆圈表示投影关联的位置;图9(e)是在主视图上根据图9(c)投影关联位置描绘的与图9(b)描绘的体素对应的投影,图中使用了延伸线和交点捕捉;图9(f)是在左视图上根据图9(d)投影关联位置描绘的与图9(b)描绘的体素对应的投影;
图10(a)是在图8所示图形平台上显示的用于拉伸体素几何参数提取的组合体三视图示例图;图10(b)是对图10(a)所示组合体在俯视图上描绘的拉伸体素基图形实形,加粗的图线代表描绘的图线;图10(c)是在主视图上描绘的与图10(b)描绘的体素相对应的拉伸线,加粗的图线代表描绘的图线。
具体实施方式
本发明中的非拉伸体素是指长方体、楔形体、圆柱体、圆锥体和圆球体,楔形体是由一个长方体沿表面对角线切分得到的全等的两个立体之一。拉伸体素是由一个平行于某个坐标平面的基图形沿坐标轴正方向等厚度拉伸形成的一个立体,而基图形是最靠近原点的用于拉伸形成一个体的平面上的封闭图线,它是由纯直线段、纯圆弧段或直线段、圆弧混合构成的首尾相连的图线;拉伸厚度由拉伸线确定,拉伸线是反映拉伸厚度的一条直线段。
本发明是以记录一个组合体三视图的数据文件为输入,通过研制的图形平台并利用人读图的优势人机交互描绘非拉伸体素的三个投影或拉伸体素的基图形实形及拉伸线,进而由计算机识别体素类型并输出体素的几何参数。
本发明中的三视图数据文件是在X轴水平朝右、Y轴竖直朝上、原点在左下角这样的二维直角坐标系下描述的一个组合体图形文件,其中,组合体的主视图、俯视图和左视图之间严格符合“长对正、高平齐、宽相等”的投影规律且视图按1:1的比例绘制,视图中的图线包括直线段、圆和圆弧,图线的线型包括粗实线、细虚线和细点画线,直线段用其两个端点和线型描述,圆用其圆心、半径和线型描述,圆弧用其圆心、半径、起始角度、终止角度和线型描述。
本发明中的图形平台具有左上、左下、右上、右下四个视区,其中左上视区用于绘制主视图,建立的二维直角坐标系的原点在视区的右下角,X轴正向水平朝左,Z轴正向竖直朝上;左下视区用于绘制俯视图,建立的二维直角坐标系的原点在视区的右上角,X轴正向水平朝左,Y轴正向竖直朝下;右上视区用于绘制左视图,建立的二维直角坐标系的原点在视区的左下角,Y轴正向水平朝右,Z轴正向竖直朝上;右下视区用于显示重建的三维模型,坐标系为常见的三维右手直角坐标系;该图形平台能绘制线型为粗实线、细虚线、细点画线的直线段、圆和圆弧,具有用于体素信息提取的主视图、俯视图、左视图切换按钮和非拉伸体素投影描绘按钮、提取拉伸体素按钮、体素提取结果按钮,具有用于体素信息提取的延伸线绘制、特征点捕捉和投影关联功能,具有每个视区内的图形屏幕缩放功能。延伸线是指以视图上已有或描绘的直线段端点、中点、圆或圆弧的圆心、直线段交点等为起点,以鼠标移动方向为方向的水平或竖直射线,延伸线以点线型绘出;特征点捕捉就是抓取视图上直线段的端点、中点,抓取圆、圆弧的圆心,抓取两直线段或直线段、延伸线的交点,抓取就是当移动的鼠标光标位置与这些特征点的距离小于0.001时,这些特征点就以小尺寸的特殊符号显示出来,端点符号为“□”,中点符号为“△”,圆心符号为“●”,交点符号为“×”,当这些特征点的显示符号出现后,按下或松开鼠标器拾取键后就把这些特征点作为要输入的点;投影关联是指在一个视图上描绘出体素一个投影后,在其他两个视图上将满足“长对正、高平齐、宽相等”约束关系的图线上的端点、圆心以绿色小圆圈醒目显示。
本发明中的人机交互描绘图线是指利用特征点捕捉、延伸线和投影关联工具沿视图上的轮廓线进行绘制或利用图线端点、中点、圆心、交点等特征点进行绘制;描绘直线段的方法是:移动鼠标光标到某一特征点并按下鼠标左键,然后按住鼠标左键不放并移动鼠标光标到另一特征点时松开鼠标左键,则在此两个特征点之间描绘一条直线段;描绘圆、圆弧的方法是:移动鼠标光标到某一圆或圆弧的圆心并按下鼠标左键,然后按住鼠标左键不放并沿半径方向移动鼠标光标到弧上时松开鼠标左键,若原视图图线为圆则描绘出圆,若原视图图线为圆弧则描绘出圆弧。
参照图1,本发明的基于视图的体素几何参数提取方法包括如下步骤:
步骤101:打开一个三视图数据文件;
步骤102:从打开的文件中读取图线信息,将读取到的直线段数据存入链表Line_list,圆数据存入链表Circle_list,圆弧数据存入链表Arc_list中;
步骤103:遍历链表Line_list,Circle_list,Arc_list,找出三视图分割线,从三视图图形中分割出主视图、俯视图和左视图;
步骤103中遍历链表Line_list,Circle_list,Arc_list,找出三视图分割线,从三视图图形中分割出主视图、俯视图和左视图,参照图2,包括以下步骤:
步骤201:遍历图线链表Line_list、Circle_list、Arc_list,找出整个三视图上x坐标值最大的点(X_max,y)和y坐标值最小的点(x,Y_min);
步骤202:在x坐标值最大的点(X_max,y)中找出y坐标值最小的点,则过该点平行于X轴的直线就是初始水平分割线,其y坐标值记为Y_Sepa,并令Ymin=Y_Sepa;
步骤203:在y坐标值最小的点(x,Y_min)中找出x坐标值最大的点,则过该点平行于Y轴的直线就是初始竖直分割线,其x坐标值记为X_Sepa,并令Xmax=X_Sepa;
步骤204:遍历图线链表Line_list、Circle_list、Arc_list,找出与分割线Y_Sepa相交的图线,并在相交图线中找出y坐标值最小且小于Y_Sepa的点,记这个最小y坐标值为Ymin;图线与分割线相交包含有重合和相切特殊情况;
步骤205:判断Y_Sepa与Ymin是否相等,若相等则转至步骤207,若不相等则转至步骤206;
步骤206:令Y_Sepa=Ymin,转至步骤204;
步骤207:遍历图线链表Line_list、Circle_list、Arc_list,找出与分割线X_Sepa相交的图线,并在相交图线中找出x坐标值最大且大于X_Sepa的点,记这个最大x坐标值为Xmax;
步骤208:判断X_Sepa与Xmax是否相等,若相等则转至步骤210,若不相等则转至步骤209;
步骤209:令X_Sepa=Xmax,转至步骤207;
步骤210:遍历图线链表Line_list、Circle_list、Arc_list,将点坐标满足x≤X_Sepa同时y≥Y_Sepa的图线归入主视图,将点坐标满足y<Y_Sepa的图线归入俯视图,将点坐标满足x>X_Sepa的图线归入左视图。
步骤104:将分割出的主视图构成信息按直线段、圆和圆弧类型分别存入链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中,将分割出的俯视图构成信息按直线段、圆和圆弧类型分别存入链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中,将分割出的左视图构成信息按直线段、圆和圆弧类型分别存入链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中;
步骤105:建立投影坐标系,求出组合体的三个投影坐标;
步骤105中建立投影坐标系,求出组合体的三个投影坐标,参照图3,包括以下步骤:
步骤301:遍历主视图链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,求出视图的最大x坐标值Fxmax、最小y坐标值Fymin;遍历俯视图链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,求出视图的最大y坐标值Tymax;遍历左视图链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,求出视图的最小x坐标值Sxmin;
步骤302:令D=1/2Min(Sxmin-Fxmax,Fymin-Tymax),x0=Sxmin-D,y0=Tymax+D,在三视图平面上建立展开后的投影坐标系O′-X′-Y′-Z′,其中投影坐标系的原点为O′(x0,y0),X′轴正向水平朝左,Z′轴正向竖直朝上,Y′轴正向分别与X′轴正向、Z′轴正向相反;
步骤303:遍历主视图链FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令x′=x0-x,z′=y-y0,用点(x′,z′)替换这三个链表中的点(x,y);
步骤304:遍历俯视图链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令x′=x0-x,y′=y0-y,用点(x′,y′)替换这三个链表中的点(x,y);
步骤305:遍历左视图链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令y′=x-x0,z′=y-y0,用点(y′,z′)替换这三个链表中的点(x,y)。
步骤106:利用VC++6.0和OpenGL搭建上述的图形平台,参照图8,搭建的图形平台有左上、左下、右上、右下四个视区,分别用于显示主视图、俯视图、左视图和重建的三维模型,图形平台有用于描绘图形时的主视图切换、俯视图切换、左视图切换、三维模型切换、主界面切换等视图切换按钮,有非拉伸体素投影描绘、体素提取结果、撤销操作、提取拉伸体素等用于体素几何参数提取的核心按钮,有便于观察和描绘图形的图形屏幕放大和缩小按钮;
步骤107:在搭建的图形平台左上视区绘出链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,得到主视图;在图形平台左下视区绘出链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,得到俯视图;在图形平台右上视区绘出链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,得到左视图;参照图9(a),该示例图用于组合体上非拉伸体素几何参数的提取,左上视区为绘制的该组合体的主视图,左下视区为绘制的该组合体的俯视图,右上视区为绘制的该组合体的左视图;参照图10(a),该示例图用于组合体上拉伸体素几何参数的提取,左上视区为绘制的该组合体的主视图,左下视区为绘制的该组合体的俯视图,右上视区为绘制的该组合体的左视图;
步骤108:判断是否按下提取拉伸体素的按钮,若是则转至步骤116,若不是则转至步骤109;
步骤109:点击视图切换按钮,分别在主视图、俯视图、左视图上描绘直线段、圆、圆弧等图线,若描绘的直线段不是视图本身的线段,则将其按所在的视图分别存入链表FrontViewData.Line_list、TopViewData.Line_list、SideViewData.Line_list中,描绘的图线以红色绘出;参照图9(b),点击俯视图切换按钮,在俯视图上按照上述的描绘图线的方法描绘出圆,粗线代表描绘成功的图线,在屏幕上以红色显示;参照图9(c)、图9(d),与此同时,图形平台按照“长对正、高平齐、宽相等”的投影规律自动关联给出与俯视图投影圆满足投影规律约束的主视图和左视图描图的提示,小圆圈表示投影关联的位置;参照图9(e),点击主视图切换按钮,在主视图上按照投影关联提示和上述的描绘图线的方法描绘出矩形,参照图9(f),点击左视图切换按钮,在左视图上按照投影关联提示和上述的描绘图线的方法描绘出矩形;
步骤110:分别在三个视图中提取体素投影图元信息,并将其保存在各自的图元信息链表中;图元信息是指构成体素投影的单元信息,包括直线段、圆、圆弧;
步骤110中分别在三个视图中提取体素投影图元信息,并将其保存在各自的图元信息链表中,参照图4,包括以下步骤:
步骤401:判断哪个视图切换按钮被按下,若按下主视图切换按钮并描绘图形,则转至步骤402;若按下俯视图切换按钮并描绘图形,则转至步骤409;若按下左视图切换按钮并描绘图形,则转至步骤416;
步骤402:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤403:遍历链表FrontViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤404,若不是则转至步骤406;
步骤404:将以P0、P1为端点的直线段存入链表FrontViewData.
IXD.Line_list中;
步骤405:是否结束描绘图形,若不结束则转至步骤402,若结束则主视图体素投影图元信息提取完成;当按下体素提取结果按钮时表示结束描绘图形;
步骤406:遍历链表FrontViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤407,若没有则转至步骤408;
步骤407:将圆心、半径存入链表FrontViewData.IXD.Circle_list中,转至步骤405;
步骤408:本次投影信息提取失败,转至步骤402;
步骤409:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤410:遍历链表TopViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤411,若不是则转至步骤413;
步骤411:将以P0、P1为端点的直线段存入链表TopViewData.
IXD.Line_list中;
步骤412:是否结束描绘图形,若不结束则转至步骤409,若结束则俯视图体素投影图元信息提取完成;当按下体素提取结果按钮时表示结束描绘图形;
步骤413:遍历链表TopViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤414,若没有则转至步骤415;
步骤414:将圆心、半径存入链表TopViewData.IXD.Circle_list中,转至步骤412;
步骤415:本次投影信息提取失败,转至步骤409;
步骤416:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤417:遍历链表SideViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤418,若不是则转至步骤420;
步骤418:将以P0、P1为端点的直线段存入链表SideViewData.
IXD.Line_list中;
步骤419:是否结束描绘图形,若不结束则转至步骤416,若结束则左视图体素投影图元信息提取完成;当按下体素提取结果按钮时表示结束描绘图形;
步骤420:遍历链表SideViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤421,若没有则转至步骤422;
步骤421:将圆心、半径存入链表SideViewData.IXD.Circle_list中,转至步骤419;
步骤422:本次投影信息提取失败,转至步骤416。
步骤111:对主视图体素投影特征进行识别,并对识别结果进行标记;
步骤111中对主视图体素投影特征进行识别,并对识别结果进行标记,参照图5,包括以下步骤:
步骤501:判断链表FrontViewData.IXD.Circle_list中的元素个数是否为1,若为1则转至步骤502,否则转至步骤503;
步骤502:主视图体素投影特征为圆,标记其投影特征为F_C,结束;
步骤503:判断链表FrontViewData.IXD.Line_list中的元素个数是否为3,若为3则转至步骤504,否则转至步骤511;
步骤504:取链表FrontViewData.IXD.Line_list中第一条直线段为查找边,保存此线段起始点并设该起始点为查找点,令查找次数为0;
步骤505:判断查找次数是否为3,若为3则转至步骤509,否则转至步骤506;
步骤506:判断在链表FrontViewData.IXD.Line_list中是否存在某个端点与查找点重合的直线段,若存在则转至步骤507,否则转至步骤519;
步骤507:判断新边与旧边是否共线,若共线则转至步骤519,否则转至步骤508;新边是指找到的端点与当前查找点重合的边,旧边是指当前查找点所在的边;设新边矢量为旧边矢量为若的值为1或-1,则新边与旧边共线;
步骤508:将新边作为下一轮的查找边,令新边重合点之外的端点为下一轮的查找点,令查找次数加1;
步骤509:判断当前查找点与保存的起始点是否重合,若重合则转至步骤510,否则转至步骤519;
步骤510:主视图体素投影特征为三角形,标记其投影特征为F_T,结束;
步骤511:判断链表FrontViewData.IXD.Line_list中的元素个数是否为4,若为4则转至步骤512,否则转至步骤519;
步骤512:取链表FrontViewData.IXD.Line_list中第一条直线段为查找边,保存此线段起始点并设该起始点为查找点,令查找次数为0;
步骤513:判断查找次数是否为4,若为4则转至步骤517,否则转至步骤514;
步骤514:判断在链表FrontViewData.IXD.Line_list中是否存在某个端点与查找点重合的直线段,若存在则转至步骤515,否则转至步骤519;
步骤516:将新边作为下一轮的查找边,令新边重合点之外的端点为下一轮的查找点,令查找次数加1;
步骤517:判断当前查找点与保存的起始点是否重合,若重合则转至步骤518,否则转至步骤519;
步骤518:主视图体素投影特征为矩形,标记其投影特征为F_R,结束;
步骤519:主视图体素投影特征识别失败。
参照图9(e),该示例经过步骤111的体素投影特征识别,其投影特征为F_R;
步骤112:对俯视图体素投影特征进行识别,方法为执行步骤111,将步骤111中的链表FrontViewData.IXD.Circle_list替换为TopViewData.IXD.Circle_list、链表FrontViewData.IXD.Line_list替换为TopViewData.IXD.Line_list,投影特征为圆时标记为T_C,投影特征为三角形时标记为T_T,投影特征为矩形时标记为T_R;参照图9(b),该示例经过步骤112的体素投影特征识别,其投影特征为T_C;
步骤113:对左视图体素投影特征进行识别,方法为执行步骤111,将步骤111中的链表FrontViewData.IXD.Circle_list替换为SideViewData.IXD.Circle_list、链表FrontViewData.IXD.Line_list替换为SideViewData.IXD.Line_list,投影特征为圆时标记为S_C,投影特征为三角形时标记为S_T,投影特征为矩形时标记为S_R;参照图9(f),该示例经过步骤113的体素投影特征识别,其投影特征为S_R;
步骤114:识别体素类型并提取体素参数,并将识别出的体素三个投影以蓝色绘出;
步骤114中识别体素类型并提取体素参数,并将识别出的体素三个投影以蓝色绘出,参照图6,包括以下步骤:
步骤601:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤602,否则转至步骤604;
步骤602:体素类型为正放的长方体;正放是指体素的棱边或主要棱边分别与坐标系的坐标轴平行,或者体素的轴线与某一坐标轴平行;
步骤603:求出长方体的定位点和长、宽、高尺寸,转至步骤634;长方体的定位点取最靠近原点的顶点,长、宽、高尺寸分别为长方体沿坐标轴方向的棱边长度;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表TopViewData.IXD.Line_list,求出4条线段的ymin、ymax,则长方体的定位点为(xmin,ymin,zmin),长方体的长、宽、高尺寸分别为xmax-xmin、ymax-ymin、zmax-zmin,长、宽、高为正值时表示沿坐标轴正向生成长方体;
步骤604:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_T、左视图特征为S_R,若同时满足则转步骤605,否则转至步骤607;
步骤605:体素类型为正放的厚度方向沿Z轴的楔形体;楔形体的厚度方向是指垂直于靠近坐标平面的底面三角形且沿坐标轴正向的矢量方向;
步骤606:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;楔形体的定位点取最靠近原点的底面直角三角形的直角顶点,轴向尺寸为沿三个坐标轴方向的棱边长度,方向角是指厚度方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表TopViewData.IXD.Line_list,求出3条线段的ymin、ymax及直角顶点(xsq,ysq),则楔形体的定位点为(xsq,ysq,zmin);当xmax>xsq同时ymax>ysq时,楔形体沿X轴、Y轴的轴向尺寸分别为xmax-xsq、ymax-ysq;当xsq>xmin同时ymax>ysq时,楔形体沿X轴、Y轴的轴向尺寸分别为xmin-xsq、ymax-ysq;当xsq>xmin同时ysq>ymin时,楔形体沿X轴、Y轴的轴向尺寸分别为xmin-xsq、ymin-ysq;当xmax>xsq同时ysq>ymin时,楔形体沿X轴、Y轴的轴向尺寸分别为xmax-xsq、ymin-ysq;楔形体沿Z轴的轴向尺寸为zmax-zmin;轴向尺寸为正值时表示沿坐标轴正向生成楔形体,轴向尺寸为负值时表示沿坐标轴负向生成楔形体;厚度方向的方向角分别为90°、90°、0°;
步骤607:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_T,若同时满足则转步骤608,否则转至步骤610;
步骤608:体素类型为正放的厚度方向沿X轴的楔形体;
步骤609:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表SideViewData.IXD.Line_list,求出3条线段的ymin、ymax及直角顶点(ysq,zsq),则楔形体的定位点为(xmin,ysq,zsq);楔形体沿X轴的轴向尺寸为xmax-xmin;当ymax>ysq同时zmax>zsq时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymax-ysq、zmax-zsq;当ysq>ymin同时zmax>zsq时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymin-ysq、zmax-zsq;当ysq>ymin同时zsq>zmin时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymin-ysq、zmin-zsq;当ymax>ysq同时zsq>zmin时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymax-ysq、zmin-zsq;厚度方向的方向角分别为0°、90°、90°;
步骤610:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤611,否则转至步骤613;
步骤611:体素类型为正放的厚度方向沿Y轴的楔形体;
步骤612:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出3条线段的zmin、zmax及直角顶点(xsq,zsq),遍历链表TopViewData.IXD.Line_list,求出4条线段的xmin、xmax、ymin、ymax,则楔形体的定位点为(xsq,ymin,zsq);楔形体沿Y轴的轴向尺寸为ymax-ymin;当xmax>xsq同时zmax>zsq时,楔形体沿X轴、Z轴的轴向尺寸分别为xmax-xsq、zmax-zsq;当xmax>xsq同时zsq>zmin时,楔形体沿X轴、Z轴的轴向尺寸分别为xmax-xsq、zmin-zsq;当xsq>xmin同时zsq>zmin时,楔形体沿X轴、Z轴的轴向尺寸分别为xmin-xsq、zmin-zsq;当xsq>xmin同时zmax>zsq时,楔形体沿X轴、Z轴的轴向尺寸分别为xmin-xsq、zmax-zsq;厚度方向的方向角分别为90°、0°、90°;
步骤613:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_C、左视图特征为S_R,若同时满足则转步骤614,否则转至步骤616;
步骤614:体素类型为正放的轴线沿Z轴的圆柱体;参照图9(e)、图9(b)、图9(f),经过步骤111、步骤112、步骤113的体素投影特征识别,主视图特征为F_R、俯视图特征为T_C、左视图特征为S_R,故此示例的体素类型为正放的轴线沿Z轴的圆柱体;
步骤615:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;圆柱体的定位点取最靠近原点的底面圆的圆心,轴线方向是指垂直于靠近坐标平面的底面圆且沿坐标轴正向的矢量方向,轴线方向的方向角是指轴线方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出4条线段的zmin、zmax,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc)和半径值r,则圆柱体的定位点为(xc,yc,zmin),底面半径为r,高度为zmax-zmin,轴线方向的方向角为90°、90°、0°;
步骤616:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_C,若同时满足则转步骤617,否则转至步骤619;
步骤617:体素类型为正放的轴线沿X轴的圆柱体;
步骤618:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax,遍历链表SideViewData.IXD.Circle_list,获取圆心(yc,zc)和半径值r,则圆柱体的定位点为(xmin,yc,zc),底面半径为r,高度为xmax-xmin,轴线方向的方向角为0°、90°、90°;
步骤619:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤620,否则转至步骤612;
步骤620:体素类型为正放的轴线沿Y轴的圆柱体;
步骤621:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Line_list,求出4条线段的ymin、ymax,则圆柱体的定位点为(xc,ymin,zc),底面半径为r,高度为ymax-ymin,轴线方向的方向角为90°、0°、90°;
步骤622:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_C、左视图特征为S_T,若同时满足则转步骤623,否则转至步骤625;
步骤623:体素类型为正放的轴线沿Z轴的圆锥体;
步骤624:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;圆锥体的定位点取最靠近原点的底面圆的圆心,轴线方向是指垂直于靠近坐标平面的底面圆且沿坐标轴正向的矢量方向,轴线方向的方向角是指轴线方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出3条线段的zmin、zmax,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc)和半径值r,则圆锥体的定位点为(xc,yc,zmin),底面半径为r,高度为zmax-zmin,轴线方向的方向角为90°、90°、0°;
步骤625:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_T、左视图特征为S_C,若同时满足则转步骤626,否则转至步骤628;
步骤626:体素类型为正放的轴线沿X轴的圆锥体;
步骤627:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出3条线段的xmin、xmax,遍历链表SideViewData.IXD.Circle_list,获取圆心(yc,zc)和半径值r,则圆锥体的定位点为(xmin,yc,zc),底面半径为r,高度为xmax-xmin,轴线方向的方向角为0°、90°、90°;
步骤628:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_T、左视图特征为S_T,若同时满足则转步骤629,否则转至步骤631;
步骤629:体素类型为正放的轴线沿Y轴的圆锥体;
步骤630:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Line_list,求出3条线段的ymin、ymax,则圆锥体的定位点为(xc,ymin,zc),底面半径为r,高度为ymax-ymin,轴线方向的方向角为90°、0°、90°;
步骤631:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_C、左视图特征为S_C,若同时满足则转步骤632,否则转至步骤635;
步骤632:体素类型为圆球体;
步骤633:求出圆球体的球心和半径,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc),则圆球体的球心为(xc,yc,zc),半径为r;
步骤634:将体素的三个投影以蓝色绘出;
步骤635:体素类型识别失败。
步骤115:输出体素类型和参数,体素类型为长方体、楔形体、圆柱体、圆锥体和圆球体之一,长方体的参数为定位点和长、宽、高尺寸,楔形体的参数为定位点、三个轴向尺寸和厚度方向的三个方向角,圆柱体的参数为定位点、底面半径、高度和轴线方向的三个方向角,圆锥体的参数为定位点、底面半径、高度和轴线方向的三个方向角,圆球体的参数为球心和半径;将链表FrontViewData.IXD.Line_list、FrontViewData.IXD.Circle_list、TopViewData.IXD.Line_list、TopViewData.IXD.Circle_list、SideViewData.IXD.Line_list、SideViewData.IXD.Circle_list清零;
步骤116:按照步骤109的方法,在反映拉伸体素基图形实形的视图上描绘基图形实形,在反映拉伸体素厚度的视图上描绘拉伸线,描绘的图线以红色绘出;参照图10(b),点击俯视图切换按钮,在俯视图上按照上述的描绘图线的方法描绘出基图形实形,参照图10(c),点击主视图切换按钮,在主视图上按照上述的描绘图线的方法描绘出拉伸线,两图中粗线代表描绘成功的图线,在屏幕上以红色显示;
步骤117:参照步骤110,提取基图形实形信息和拉伸线信息并进行保存,若在主视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表FrontBaseGraph.IXD_list中,若在俯视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表TopBaseGraph.IXD_list中,若在左视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表SideBaseGraph.IXD_list中;若在主视图上描绘了拉伸线,则拉伸线的两个端点保存在链表FrontExt.IXD_list中,若在俯视图上描绘了拉伸线,则拉伸线的两个端点保存在链表TopExt.IXD_list中,若在左视图上描绘了拉伸线,则拉伸线的两个端点保存在链表SideExt.IXD_list;基图形实形链表FrontBaseGraph.IXD_list、TopBaseGraph.IXD_list和SideBaseGraph.IXD_list中的每个元素包括线类型和几何参数,直线段的线类型为LIN,几何参数为直线段的起点和终点;圆弧的线类型为ARC,几何参数为圆心、半径、起始角度、终止角度;参照步骤111中三角形封闭性检查的方法,若链表FrontBaseGraph.IXD_list或TopBaseGraph.IXD_list或SideBaseGraph.IXD_list中的元素遍历完后,所存储的图线是首尾相连的,则该链表中的基图形实形合法,否则提示不合法,需要进行重新描绘直至合法为止;
步骤118:输出基图形实形数据和拉伸厚度,将体素提取过程中使用的临时链表清零;
步骤118中输出基图形实形数据和拉伸厚度,将体素提取过程中使用的临时链表清零,参照图7,包括以下步骤:
步骤701:判断链表FrontBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤702,若为0则转至步骤708;
步骤702:判断链表TopExt.IXD_list是否为空,若不为空则转至步骤703,若为空则转至步骤705;
步骤703:求取链表TopExt.IXD_list中线段的ymin、ymax,则拉伸厚度为ymax-ymin;设链表FrontBaseGraph.IXD_list中图线的点为(x,z),用点(x,ymin,z)替换链表中的点(x,z);
步骤704:输出链表FrontBaseGraph.IXD_list中的基图形数据和拉伸厚度ymax-ymin,将链表FrontBaseGraph.IXD_list和TopExt.IXD_list清零;
步骤705:判断链表SideExt.IXD_list是否为空,若不为空则转至步骤706,若为空则转至步骤722;
步骤706:求取链表SideExt.IXD_list中线段的ymin、ymax,则拉伸厚度为ymax-ymin;设链表FrontBaseGraph.IXD_list中图线的点为(x,z),用点(x,ymin,z)替换链表中的点(x,z);
步骤707:输出链表FrontBaseGraph.IXD_list中的基图形数据和拉伸厚度ymax-ymin,将链表FrontBaseGraph.IXD_list和SideExt.IXD_list清零;
步骤708:判断链表TopBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤709,若为0则转至步骤715;
步骤709:判断链表FrontExt.IXD_list是否为空,若不为空则转至步骤710,若为空则转至步骤712;
步骤710:求取链表FrontExt.IXD_list中线段的zmin、zmax,则拉伸厚度为zmax-zmin;设链表TopBaseGraph.IXD_list中图线的点为(x,y),用点(x,y,zmin)替换链表中的点(x,y);
步骤711:输出链表TopBaseGraph.IXD_list中的基图形数据和拉伸厚度zmax-zmin,将链表TopBaseGraph.IXD_list和FrontExt.IXD_list清零;
步骤712:判断链表SideExt.IXD_list是否为空,若不为空则转至步骤713,若为空则转至步骤722;
步骤713:求取链表SideExt.IXD_list中线段的zmin、zmax,则拉伸厚度为zmax-zmin;设链表TopBaseGraph.IXD_list中图线的点为(x,y),用点(x,y,zmin)替换链表中的点(x,y);
步骤714:输出链表TopBaseGraph.IXD_list中的基图形数据和拉伸厚度zmax-zmin,将链表TopBaseGraph.IXD_list和SideExt.IXD_list清零;
步骤715:判断链表SideBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤716,若为0则转至步骤722;
步骤716:判断链表FrontExt.IXD_list是否为空,若不为空则转至步骤717,若为空则转至步骤719;
步骤717:求取链表FrontExt.IXD_list中线段的xmin、xmax,则拉伸厚度为xmax-xmin;设链表SideBaseGraph.IXD_list中图线的点为(y,z),用点(xmin,y,z)替换链表中的点(y,z);
步骤718:输出链表SideBaseGraph.IXD_list中的基图形数据和拉伸厚度xmax-xmin,将链表SideBaseGraph.IXD_list和FrontExt.IXD_list清零;
步骤719:判断链表TopExt.IXD_list是否为空,若不为空则转至步骤720,若为空则转至步骤722;
步骤720:求取链表TopExt.IXD_list中线段的xmin、xmax,则拉伸厚度为xmax-xmin;设链表SideBaseGraph.IXD_list中图线的点为(y,z),用点(xmin,y,z)替换链表中的点(y,z);
步骤721:输出链表SideBaseGraph.IXD_list中的基图形数据和拉伸厚度xmax-xmin,将链表SideBaseGraph.IXD_list和TopExt.IXD_list清零;
步骤722:拉伸体素参数提取失败。
步骤119:重复步骤108~步骤118,直到三视图中可提取的体素提取完为止。
本实施例没有详细叙述的部分和英文缩写属本行业的公知常识,在网上可以搜索到,这里不一一叙述。
Claims (4)
1.基于视图的体素几何参数提取方法,其特征是:包括如下步骤:
步骤101:打开一个三视图数据文件;三视图数据文件是在X轴水平朝右、Y轴竖直朝上、原点在左下角这样的二维直角坐标系下描述的一个组合体图形文件,其中,组合体的主视图、俯视图和左视图之间严格符合“长对正、高平齐、宽相等”的投影规律且视图按1:1的比例绘制,视图中的图线包括直线段、圆和圆弧,图线的线型包括粗实线、细虚线和细点画线,直线段用其两个端点和线型描述,圆用其圆心、半径和线型描述,圆弧用其圆心、半径、起始角度、终止角度和线型描述;
步骤102:从打开的文件中读取图线信息,将读取到的直线段数据存入链表Line_list,圆数据存入链表Circle_list,圆弧数据存入链表Arc_list中;
步骤103:遍历链表Line_list,Circle_list,Arc_list,找出三视图分割线,从三视图图形中分割出主视图、俯视图和左视图;
步骤104: 将分割出的主视图构成信息按直线段、圆和圆弧类型分别存入链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中,将分割出的俯视图构成信息按直线段、圆和圆弧类型分别存入链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中,将分割出的左视图构成信息按直线段、圆和圆弧类型分别存入链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中;
步骤105:建立投影坐标系,求出组合体的三个投影坐标;
步骤106:利用VC++6.0和OpenGL搭建一个图形平台,该图形平台具有左上、左下、右上、右下四个视区,其中左上视区用于绘制主视图,建立的二维直角坐标系的原点在视区的右下角,X轴正向水平朝左,Z轴正向竖直朝上;左下视区用于绘制俯视图,建立的二维直角坐标系的原点在视区的右上角,X轴正向水平朝左,Y轴正向竖直朝下;右上视区用于绘制左视图,建立的二维直角坐标系的原点在视区的左下角,Y轴正向水平朝右,Z轴正向竖直朝上;右下视区用于显示重建的三维模型,坐标系为常见的三维右手直角坐标系;该图形平台能绘制线型为粗实线、细虚线、细点画线的直线段、圆和圆弧,具有用于体素信息提取的主视图、俯视图、左视图切换按钮和非拉伸体素投影描绘按钮、提取拉伸体素按钮、体素提取结果按钮,具有用于体素信息提取的延伸线绘制、特征点捕捉和投影关联功能,具有每个视区内的图形屏幕缩放功能;非拉伸体素是指长方体、楔形体、圆柱体、圆锥体和圆球体,楔形体是由一个长方体沿表面对角线切分得到的全等的两个立体之一;拉伸体素是由一个平行于某个坐标平面的基图形沿坐标轴正方向等厚度拉伸形成的一个立体;基图形是最靠近原点的用于拉伸形成一个体的平面上的封闭图线,是由纯直线段、纯圆弧段或直线段、圆弧混合构成的首尾相连的图线;延伸线是指以视图上已有或描绘的直线段端点、中点、圆或圆弧的圆心、直线段交点为起点,以鼠标移动方向为方向的水平或竖直射线,延伸线以点线型绘出;特征点捕捉就是抓取视图上直线段的端点、中点,抓取圆、圆弧的圆心,抓取两直线段或直线段、延伸线的交点,抓取就是当移动的鼠标光标位置与这些特征点的距离小于0.001时,这些特征点就以小尺寸的特殊符号显示出来,端点符号为“□”,中点符号为“△”,圆心符号为“●”,交点符号为 “×”,当这些特征点的显示符号出现后,按下或松开鼠标器拾取键后就把这些特征点作为要输入的点;投影关联是指在一个视图上描绘出体素一个投影后,在其他两个视图上将满足“长对正、高平齐、宽相等”约束关系的图线上的端点、圆心以绿色小圆圈醒目显示;
步骤107:在搭建的图形平台左上视区绘出链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,得到主视图;在图形平台左下视区绘出链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,得到俯视图;在图形平台右上视区绘出链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,得到左视图;
步骤108:判断是否按下提取拉伸体素的按钮,若是则转至步骤116,若不是则转至步骤109;
步骤109:点击视图切换按钮,分别在主视图、俯视图、左视图上描绘直线段、圆、圆弧图线,若描绘的直线段不是视图本身的线段,则将其按所在的视图分别存入链表FrontViewData.Line_list、TopViewData.Line_list、SideViewData.Line_list中,描绘的图线以红色绘出;描绘图线是指利用特征点捕捉、延伸线和投影关联工具沿视图上的轮廓线进行绘制或利用图线端点、中点、圆心、交点为特征点进行绘制;描绘直线段的方法是:移动鼠标光标到某一特征点并按下鼠标左键,然后按住鼠标左键不放并移动鼠标光标到另一特征点时松开鼠标左键,则在此两个特征点之间描绘一条直线段;描绘圆、圆弧的方法是:移动鼠标光标到某一圆或圆弧的圆心并按下鼠标左键,然后按住鼠标左键不放并沿半径方向移动鼠标光标到弧上时松开鼠标左键,若原视图图线为圆则描绘出圆,若原视图图线为圆弧则描绘出圆弧;
步骤110:分别在三个视图中提取体素投影图元信息,并将其保存在各自的图元信息链表中;图元信息是指构成体素投影的单元信息,包括直线段、圆、圆弧;
步骤111:对主视图体素投影特征进行识别,并对识别结果进行标记;
步骤112:对俯视图体素投影特征进行识别,方法为执行步骤111,将步骤111中的链表FrontViewData.IXD.Circle_list替换为TopViewData.IXD.Circle_list、链表FrontViewData.IXD.Line_list替换为TopViewData.IXD.Line_list,投影特征为圆时标记为T_C,投影特征为三角形时标记为T_T,投影特征为矩形时标记为T_R;
步骤113:对左视图体素投影特征进行识别,方法为执行步骤111,将步骤111中的链表FrontViewData.IXD.Circle_list替换为SideViewData.IXD.Circle_list、链表FrontViewData.IXD.Line_list
替换为SideViewData.IXD.Line_list,投影特征为圆时标记为S_C,投影特征为三角形时标记为S_T,投影特征为矩形时标记为S_R;
步骤114:识别体素类型并提取体素参数,并将识别出的体素三个投影以蓝色绘出;
步骤115:输出体素类型和参数,体素类型为长方体、楔形体、圆柱体、圆锥体和圆球体之一,长方体的参数为定位点和长、宽、高尺寸,楔形体的参数为定位点、三个轴向尺寸和厚度方向的三个方向角,圆柱体的参数为定位点、底面半径、高度和轴线方向的三个方向角,圆锥体的参数为定位点、底面半径、高度和轴线方向的三个方向角,圆球体的参数为球心和半径;将链表FrontViewData.IXD.Line_list、FrontViewData.IXD.Circle_list、TopViewData.IXD.Line_list、TopViewData.IXD.Circle_list、SideViewData.IXD.Line_list、SideViewData.IXD.Circle_list清零;
步骤116:按照步骤109的方法,在反映拉伸体素基图形实形的视图上描绘基图形实形,在反映拉伸体素厚度的视图上描绘拉伸线,描绘的图线以红色绘出;拉伸线是反映拉伸厚度的一条直线段;
步骤117:参照步骤110,提取基图形实形信息和拉伸线信息并进行保存,若在主视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表FrontBaseGraph.IXD_list中,若在俯视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表TopBaseGraph.IXD_list中,若在左视图上描绘了基图形实形,则基图形实形信息保存在基图形实形链表SideBaseGraph.IXD_list中;若在主视图上描绘了拉伸线,则拉伸线的两个端点保存在链表FrontExt.IXD_list中,若在俯视图上描绘了拉伸线,则拉伸线的两个端点保存在链表TopExt.IXD_list中,若在左视图上描绘了拉伸线,则拉伸线的两个端点保存在链表SideExt.IXD_list;基图形实形链表FrontBaseGraph.IXD_list、TopBaseGraph.IXD_list和SideBaseGraph.IXD_list中的每个元素包括线类型和几何参数,直线段的线类型为LIN,几何参数为直线段的起点和终点;圆弧的线类型为ARC,几何参数为圆心、半径、起始角度、终止角度;参照步骤111中三角形封闭性检查的方法,若链表FrontBaseGraph.IXD_list或TopBaseGraph.IXD_list或SideBaseGraph.IXD_list中的元素遍历完后,所存储的图线是首尾相连的,则该链表中的基图形实形合法,否则提示不合法,需要进行重新描绘直至合法为止;
步骤118:输出基图形实形数据和拉伸厚度,将体素提取过程中使用的临时链表清零;
步骤119:重复步骤108~步骤118,直到三视图中可提取的体素提取完为止;
所述的步骤105中建立投影坐标系,求出组合体的三个投影坐标,包括以下步骤:
步骤301:遍历主视图链表FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,求出视图的最大x坐标值Fxmax、最小y坐标值Fymin;遍历俯视图链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,求出视图的最大y坐标值Tymax;遍历左视图链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,求出视图的最小x坐标值Sxmin;
步骤302: 令D=1/2Min(Sxmin-Fxmax,Fymin-Tymax),x0=Sxmin-D,y0=Tymax+D,在三视图平面上建立展开后的投影坐标系O´-X´-Y´-Z´,其中投影坐标系的原点为O´(x0,y0),X´轴正向水平朝左,Z´轴正向竖直朝上,Y´轴正向分别与X´轴正向、Z´轴正向相反;
步骤303:遍历主视图链FrontViewData.Line_list、FrontViewData.Circle_list、FrontViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令x´=x0-x,z´=y-y0,用点(x´,z´)替换这三个链表中的点(x,y);
步骤304:遍历俯视图链表TopViewData.Line_list、TopViewData.Circle_list、TopViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令x´=x0-x,y´=y0-y,用点(x´,y´)替换这三个链表中的点(x,y);
步骤305:遍历左视图链表SideViewData.Line_list、SideViewData.Circle_list、SideViewData.Arc_list中的图线,设点(x,y)为图线的端点或圆心,令y´=x-x0,z´=y-y0,用点(y´,z´)替换这三个链表中的点(x,y);
所述的步骤111中对主视图体素投影特征进行识别,并对识别结果进行标记,包括以下步骤:
步骤501:判断链表FrontViewData.IXD.Circle_list中的元素个数是否为1,若为1则转至步骤502,否则转至步骤503;
步骤502:主视图体素投影特征为圆,标记其投影特征为F_C,结束;
步骤503:判断链表FrontViewData.IXD.Line_list中的元素个数是否为3,若为3则转至步骤504,否则转至步骤511;
步骤504:取链表FrontViewData.IXD.Line_list中第一条直线段为查找边,保存此线段起始点并设该起始点为查找点,令查找次数为0;
步骤505:判断查找次数是否为3,若为3则转至步骤509,否则转至步骤506;
步骤506:判断在链表FrontViewData.IXD.Line_list中是否存在某个端点与查找点重合的直线段,若存在则转至步骤507,否则转至步骤519;
步骤507:判断新边与旧边是否共线,若共线则转至步骤519,否则转至步骤508;新边是
指找到的端点与当前查找点重合的边,旧边是指当前查找点所在的边;设新边矢量为,
旧边矢量为,若(·)/( )的值为1或-1,则新边与旧边共线;
步骤508:将新边作为下一轮的查找边,令新边重合点之外的端点为下一轮的查找点,令查找次数加1;
步骤509:判断当前查找点与保存的起始点是否重合,若重合则转至步骤510,否则转至步骤519;
步骤510:主视图体素投影特征为三角形,标记其投影特征为F_T,结束;
步骤511:判断链表FrontViewData.IXD.Line_list 中的元素个数是否为4,若为4则转至步骤512,否则转至步骤519;
步骤512:取链表FrontViewData.IXD.Line_list中第一条直线段为查找边,保存此线段起始点并设该起始点为查找点,令查找次数为0;
步骤513:判断查找次数是否为4,若为4则转至步骤517,否则转至步骤514;
步骤514:判断在链表FrontViewData.IXD.Line_list中是否存在某个端点与查找点重合的直线段,若存在则转至步骤515,否则转至步骤519;
步骤516:将新边作为下一轮的查找边,令新边重合点之外的端点为下一轮的查找点,令查找次数加1;
步骤517:判断当前查找点与保存的起始点是否重合,若重合则转至步骤518,否则转至步骤519;
步骤518:主视图体素投影特征为矩形,标记其投影特征为F_R,结束;
步骤519:主视图体素投影特征识别失败;
所述的步骤114中识别体素类型并提取体素参数,并将识别出的体素三个投影以蓝色绘出,包括以下步骤:
步骤601:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤602,否则转至步骤604;
步骤602:体素类型为正放的长方体;正放是指体素的棱边或主要棱边分别与坐标系的坐标轴平行,或者体素的轴线与某一坐标轴平行;
步骤603:求出长方体的定位点和长、宽、高尺寸,转至步骤634;长方体的定位点取最靠近原点的顶点,长、宽、高尺寸分别为长方体沿坐标轴方向的棱边长度;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表TopViewData.IXD.Line_list,求出4条线段的ymin、ymax,则长方体的定位点为(xmin,ymin,zmin),长方体的长、宽、高尺寸分别为xmax-xmin、ymax-ymin、zmax-zmin,长、宽、高为正值时表示沿坐标轴正向生成长方体;
步骤604:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_T、左视图特征为S_R,若同时满足则转步骤605,否则转至步骤607;
步骤605:体素类型为正放的厚度方向沿Z轴的楔形体;楔形体的厚度方向是指垂直于靠近坐标平面的底面三角形且沿坐标轴正向的矢量方向;
步骤606:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;楔形体的定位点取最靠近原点的底面直角三角形的直角顶点,轴向尺寸为沿三个坐标轴方向的棱边长度,方向角是指厚度方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表TopViewData.IXD.Line_list,求出3条线段的ymin、ymax及直角顶点(xsq,ysq),则楔形体的定位点为(xsq,ysq,zmin);当xmax>xsq同时ymax>ysq时,楔形体沿X轴、Y轴的轴向尺寸分别为xmax-xsq、ymax-ysq;当xsq>xmin同时ymax>ysq时,楔形体沿X轴、Y轴的轴向尺寸分别为xmin- xsq、ymax-ysq;当xsq>xmin同时ysq>ymin时,楔形体沿X轴、Y轴的轴向尺寸分别为xmin- xsq、ymin- ysq;当xmax>xsq同时ysq>ymin时,楔形体沿X轴、Y轴的轴向尺寸分别为xmax-xsq、ymin- ysq;楔形体沿Z轴的轴向尺寸为zmax-zmin;轴向尺寸为正值时表示沿坐标轴正向生成楔形体,轴向尺寸为负值时表示沿坐标轴负向生成楔形体;厚度方向的方向角分别为90°、90°、0°;
步骤607:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_T,若同时满足则转步骤608,否则转至步骤610;
步骤608:体素类型为正放的厚度方向沿X轴的楔形体;
步骤609:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax、zmin、zmax,遍历链表SideViewData.IXD.Line_list,求出3条线段的ymin、ymax及直角顶点(ysq,zsq),则楔形体的定位点为(xmin, ysq,zsq);楔形体沿X轴的轴向尺寸为xmax-xmin;当ymax>ysq同时zmax>zsq时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymax-ysq、zmax-zsq;当ysq>ymin同时zmax>zsq时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymin- ysq、zmax-zsq;当ysq>ymin同时zsq>zmin时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymin- ysq、zmin-zsq;当ymax>ysq同时zsq>zmin时,楔形体沿Y轴、Z轴的轴向尺寸分别为ymax-ysq、zmin- zsq;厚度方向的方向角分别为0°、90°、90°;
步骤610:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤611,否则转至步骤613;
步骤611:体素类型为正放的厚度方向沿Y轴的楔形体;
步骤612:求出楔形体的定位点、轴向尺寸和厚度方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出3条线段的zmin、zmax及直角顶点(xsq,zsq),遍历链表TopViewData.IXD.Line_list,求出4条线段的xmin、xmax、ymin、ymax,则楔形体的定位点为(xsq, ymin,zsq);楔形体沿Y轴的轴向尺寸为ymax-ymin;当xmax>xsq同时zmax>zsq时,楔形体沿X轴、Z轴的轴向尺寸分别为xmax-xsq、zmax-zsq;当xmax>xsq同时zsq>zmin时,楔形体沿X轴、Z轴的轴向尺寸分别为xmax-xsq、zmin-zsq;当xsq>xmin同时zsq>zmin时,楔形体沿X轴、Z轴的轴向尺寸分别为xmin- xsq、zmin-zsq;当xsq>xmin同时zmax>zsq时,楔形体沿X轴、Z轴的轴向尺寸分别为xmin-xsq、zmax- zsq;厚度方向的方向角分别为90°、0°、90°;
步骤613:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_C、左视图特征为S_R,若同时满足则转步骤614,否则转至步骤616;
步骤614:体素类型为正放的轴线沿Z轴的圆柱体;
步骤615:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;圆柱体的定位点取最靠近原点的底面圆的圆心,轴线方向是指垂直于靠近坐标平面的底面圆且沿坐标轴正向的矢量方向,轴线方向的方向角是指轴线方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出4条线段的zmin、zmax,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc)和半径值r,则圆柱体的定位点为(xc,yc,zmin),底面半径为r,高度为zmax-zmin,轴线方向的方向角为90°、90°、0°;
步骤616:判断体素三个投影是否同时满足主视图特征为F_R、俯视图特征为T_R、左视图特征为S_C,若同时满足则转步骤617,否则转至步骤619;
步骤617:体素类型为正放的轴线沿X轴的圆柱体;
步骤618:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出4条线段的xmin、xmax,遍历链表SideViewData.IXD.Circle_list,获取圆心(yc,zc)和半径值r,则圆柱体的定位点为(xmin,yc,zc),底面半径为r,高度为xmax-xmin,轴线方向的方向角为0°、90°、90°;
步骤619:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_R、左视图特征为S_R,若同时满足则转步骤620,否则转至步骤612;
步骤620:体素类型为正放的轴线沿Y轴的圆柱体;
步骤621:求出圆柱体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Line_list,求出4条线段的ymin、ymax,则圆柱体的定位点为(xc,ymin,zc),底面半径为r,高度为ymax-ymin,轴线方向的方向角为90°、0°、90°;
步骤622:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_C、左视图特征为S_T,若同时满足则转步骤623,否则转至步骤625;
步骤623:体素类型为正放的轴线沿Z轴的圆锥体;
步骤624:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;圆锥体的定位点取最靠近原点的底面圆的圆心,轴线方向是指垂直于靠近坐标平面的底面圆且沿坐标轴正向的矢量方向,轴线方向的方向角是指轴线方向与X轴、Y轴、Z轴的夹角;遍历链表FrontViewData.IXD.Line_list,求出3条线段的zmin、zmax,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc)和半径值r,则圆锥体的定位点为(xc,yc,zmin),底面半径为r,高度为zmax-zmin,轴线方向的方向角为90°、90°、0°;
步骤625:判断体素三个投影是否同时满足主视图特征为F_T、俯视图特征为T_T、左视图特征为S_C,若同时满足则转步骤626,否则转至步骤628;
步骤626:体素类型为正放的轴线沿X轴的圆锥体;
步骤627:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Line_list,求出3条线段的xmin、xmax,遍历链表SideViewData.IXD.Circle_list,获取圆心(yc,zc)和半径值r,则圆锥体的定位点为(xmin,yc,zc),底面半径为r,高度为xmax-xmin,轴线方向的方向角为0°、90°、90°;
步骤628:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_T、左视图特征为S_T,若同时满足则转步骤629,否则转至步骤631;
步骤629:体素类型为正放的轴线沿Y轴的圆锥体;
步骤630:求出圆锥体的定位点、底面半径、高度和轴线方向的方向角,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Line_list,求出3条线段的ymin、ymax,则圆锥体的定位点为(xc,ymin,zc),底面半径为r,高度为ymax-ymin,轴线方向的方向角为90°、0°、90°;
步骤631:判断体素三个投影是否同时满足主视图特征为F_C、俯视图特征为T_C、左视图特征为S_C,若同时满足则转步骤632,否则转至步骤635;
步骤632:体素类型为圆球体;
步骤633:求出圆球体的球心和半径,转至步骤634;遍历链表FrontViewData.IXD.Circle_list,获取圆心(xc,zc)和半径值r,遍历链表TopViewData.IXD.Circle_list,获取圆心(xc,yc),则圆球体的球心为(xc,yc,zc),半径为r;
步骤634:将体素的三个投影以蓝色绘出;
步骤635:体素类型识别失败。
2.根据权利要求1所述的基于视图的体素几何参数提取方法,其特征是:所述的步骤103中遍历链表Line_list,Circle_list,Arc_list,找出三视图分割线,从三视图图形中分割出主视图、俯视图和左视图,包括以下步骤:
步骤201:遍历图线链表Line_list、Circle_list、Arc_list,找出整个三视图上x坐标值最大的点(X_max,y)和y坐标值最小的点(x,Y_min);
步骤202:在x坐标值最大的点(X_max,y)中找出y坐标值最小的点,则过该点平行于X轴的直线就是初始水平分割线,其y坐标值记为Y_Sepa,并令Ymin=Y_Sepa;
步骤203:在y坐标值最小的点(x,Y_min)中找出x坐标值最大的点,则过该点平行于Y轴的直线就是初始竖直分割线,其x坐标值记为X_Sepa,并令Xmax=X_Sepa;
步骤204:遍历图线链表Line_list、Circle_list、Arc_list,找出与分割线Y_Sepa相交的图线,并在相交图线中找出y坐标值最小且小于Y_Sepa的点,记这个最小y坐标值为Ymin;图线与分割线相交包含有重合和相切特殊情况;
步骤205:判断Y_Sepa与Ymin是否相等,若相等则转至步骤207,若不相等则转至步骤206;
步骤206:令Y_Sepa=Ymin,转至步骤204;
步骤207:遍历图线链表Line_list、Circle_list、Arc_list,找出与分割线X_Sepa相交的图线,并在相交图线中找出x坐标值最大且大于X_Sepa的点,记这个最大x坐标值为Xmax;
步骤208:判断X_Sepa与Xmax是否相等,若相等则转至步骤210,若不相等则转至步骤209;
步骤209:令X_Sepa=Xmax,转至步骤207;
步骤210:遍历图线链表Line_list、Circle_list、Arc_list,将点坐标满足x≤X_Sepa同时y≥Y_Sepa的图线归入主视图,将点坐标满足y<Y_Sepa的图线归入俯视图,将点坐标满足x>X_Sepa的图线归入左视图。
3.根据权利要求1所述的基于视图的体素几何参数提取方法,其特征是:所述的步骤110中分别在三个视图中提取体素投影图元信息,并将其保存在各自的图元信息链表中,包括以下步骤:
步骤401:判断哪个视图切换按钮被按下,若按下主视图切换按钮并描绘图形,则转至步骤402;若按下俯视图切换按钮并描绘图形,则转至步骤409;若按下左视图切换按钮并描绘图形,则转至步骤416;
步骤402:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤403:遍历链表FrontViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤404,若不是则转至步骤406;
步骤404:将以P0、P1为端点的直线段存入链表FrontViewData.
IXD.Line_list中;
步骤405:是否结束描绘图形,若不结束则转至步骤402,若结束则主视图体素投影图元信息提取完成;
步骤406:遍历链表FrontViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤407,若没有则转至步骤408;
步骤407:将圆心、半径存入链表FrontViewData.IXD.Circle_list中,转至步骤405;
步骤408:本次投影信息提取失败,转至步骤402;
步骤409:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤410:遍历链表TopViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤411,若不是则转至步骤413;
步骤411:将以P0、P1为端点的直线段存入链表TopViewData.
IXD.Line_list中;
步骤412:是否结束描绘图形,若不结束则转至步骤409,若结束则俯视图体素投影图元信息提取完成;
步骤413:遍历链表TopViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤414,若没有则转至步骤415;
步骤414:将圆心、半径存入链表TopViewData.IXD.Circle_list中,转至步骤412;
步骤415:本次投影信息提取失败,转至步骤409;
步骤416:记录步骤109中鼠标左键按下时点的位置P0和鼠标左键松开时点的位置P1;
步骤417:遍历链表SideViewData.Line_list,判断P0和P1是否为一条直线段的端点,若是则转至步骤418,若不是则转至步骤420;
步骤418:将以P0、P1为端点的直线段存入链表SideViewData.
IXD.Line_list中;
步骤419:是否结束描绘图形,若不结束则转至步骤416,若结束则左视图体素投影图元信息提取完成;
步骤420:遍历链表SideViewData.Circle_list,判断是否有以P0为圆心、以P0P1为半径的圆,若有则转至步骤421,若没有则转至步骤422;
步骤421:将圆心、半径存入链表SideViewData.IXD.Circle_list中,转至步骤419;
步骤422:本次投影信息提取失败,转至步骤416。
4.根据权利要求1所述的基于视图的体素几何参数提取方法,其特征是:所述的步骤118中输出基图形实形数据和拉伸厚度,将体素提取过程中使用的临时链表清零,包括以下步骤:
步骤701:判断链表FrontBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤702,若为0则转至步骤708;
步骤702:判断链表TopExt.IXD_list是否为空,若不为空则转至步骤703,若为空则转至步骤705;
步骤703:求取链表TopExt.IXD_list中线段的ymin、ymax,则拉伸厚度为ymax-ymin;设链表FrontBaseGraph.IXD_list中图线的点为(x,z),用点(x,ymin ,z)替换链表中的点(x,z);
步骤704:输出链表FrontBaseGraph.IXD_list中的基图形数据和拉伸厚度ymax-ymin,将链表FrontBaseGraph.IXD_list和TopExt.IXD_list清零;
步骤705:判断链表SideExt.IXD_list是否为空,若不为空则转至步骤706,若为空则转至步骤722;
步骤706:求取链表SideExt.IXD_list中线段的ymin、ymax,则拉伸厚度为ymax-ymin;设链表FrontBaseGraph.IXD_list中图线的点为(x,z),用点(x,ymin ,z)替换链表中的点(x,z);
步骤707:输出链表FrontBaseGraph.IXD_list中的基图形数据和拉伸厚度ymax-ymin,将链表FrontBaseGraph.IXD_list和SideExt.IXD_list清零;
步骤708:判断链表TopBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤709,若为0则转至步骤715;
步骤709:判断链表FrontExt.IXD_list是否为空,若不为空则转至步骤710,若为空则转至步骤712;
步骤710:求取链表FrontExt.IXD_list中线段的zmin、zmax,则拉伸厚度为zmax-zmin;设链表TopBaseGraph.IXD_list中图线的点为(x,y),用点(x,y ,zmin)替换链表中的点(x,y);
步骤711:输出链表TopBaseGraph.IXD_list中的基图形数据和拉伸厚度zmax-zmin,将链表TopBaseGraph.IXD_list和FrontExt.IXD_list清零;
步骤712:判断链表SideExt.IXD_list是否为空,若不为空则转至步骤713,若为空则转至步骤722;
步骤713:求取链表SideExt.IXD_list中线段的zmin、zmax,则拉伸厚度为zmax-zmin;设链表TopBaseGraph.IXD_list中图线的点为(x,y),用点(x,y ,zmin)替换链表中的点(x,y);
步骤714:输出链表TopBaseGraph.IXD_list中的基图形数据和拉伸厚度zmax-zmin,将链表TopBaseGraph.IXD_list和SideExt.IXD_list清零;
步骤715:判断链表SideBaseGraph.IXD_list中的元素个数是否不为0,若不为0,则转至步骤716,若为0则转至步骤722;
步骤716:判断链表FrontExt.IXD_list是否为空,若不为空则转至步骤717,若为空则转至步骤719;
步骤717:求取链表FrontExt.IXD_list中线段的xmin、xmax,则拉伸厚度为xmax-xmin;设链表SideBaseGraph.IXD_list中图线的点为(y,z),用点(xmin,y ,z)替换链表中的点(y,z);
步骤718:输出链表SideBaseGraph.IXD_list中的基图形数据和拉伸厚度xmax-xmin,将链表SideBaseGraph.IXD_list和FrontExt.IXD_list清零;
步骤719:判断链表TopExt.IXD_list是否为空,若不为空则转至步骤720,若为空则转至步骤722;
步骤720:求取链表TopExt.IXD_list中线段的xmin、xmax,则拉伸厚度为xmax-xmin;设链表SideBaseGraph.IXD_list中图线的点为(y,z),用点(xmin,y ,z)替换链表中的点(y,z);
步骤721:输出链表SideBaseGraph.IXD_list中的基图形数据和拉伸厚度xmax-xmin,将链表SideBaseGraph.IXD_list和TopExt.IXD_list清零;
步骤722:拉伸体素参数提取失败。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710896904.0A CN107680154B (zh) | 2017-09-28 | 2017-09-28 | 基于视图的体素几何参数提取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710896904.0A CN107680154B (zh) | 2017-09-28 | 2017-09-28 | 基于视图的体素几何参数提取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107680154A CN107680154A (zh) | 2018-02-09 |
CN107680154B true CN107680154B (zh) | 2020-01-10 |
Family
ID=61138167
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710896904.0A Active CN107680154B (zh) | 2017-09-28 | 2017-09-28 | 基于视图的体素几何参数提取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107680154B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108389255B (zh) * | 2018-02-12 | 2021-05-11 | 西安电子科技大学 | 基于分层高程云图的地形几何参数提取方法 |
CN108416149B (zh) * | 2018-03-13 | 2022-07-22 | 杭州新迪数字工程系统有限公司 | Cad无关的三维零件实时造型方法、终端及存储介质 |
CN109828818B (zh) * | 2019-01-29 | 2022-03-01 | 广联达科技股份有限公司 | 一种基于浏览器端显示引擎的图元样式变换方法 |
CN110135270A (zh) * | 2019-04-18 | 2019-08-16 | 上海电力学院 | 一种圆柱体左视图的自动识别评分方法 |
CN112418123B (zh) * | 2020-11-30 | 2021-08-03 | 西南交通大学 | 一种基于Hough变换的工程图图线及线型识别的方法 |
CN113591168B (zh) * | 2021-06-28 | 2024-04-12 | 山东大学 | 一种基于点间距离的三维拉伸体分析与生成方法及系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105205206A (zh) * | 2015-08-19 | 2015-12-30 | 西安电子科技大学 | 一种复杂平面片交线段的求取方法 |
CN106228539A (zh) * | 2016-07-12 | 2016-12-14 | 北京工业大学 | 一种三维点云中多种几何基元自动识别方法 |
CN106649466A (zh) * | 2016-09-27 | 2017-05-10 | 西安电子科技大学 | 数字地图中典型地形几何参数获取方法 |
-
2017
- 2017-09-28 CN CN201710896904.0A patent/CN107680154B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105205206A (zh) * | 2015-08-19 | 2015-12-30 | 西安电子科技大学 | 一种复杂平面片交线段的求取方法 |
CN106228539A (zh) * | 2016-07-12 | 2016-12-14 | 北京工业大学 | 一种三维点云中多种几何基元自动识别方法 |
CN106649466A (zh) * | 2016-09-27 | 2017-05-10 | 西安电子科技大学 | 数字地图中典型地形几何参数获取方法 |
Non-Patent Citations (3)
Title |
---|
Solid reconstruction using recognition of quadric surfaces from orthographic views;Jie-Hui Gong 等;《Computer-Aided Design》;20060615;第821-835页 * |
三视图中体信息的交互提取技术研究;韩硕;《中国优秀硕士学位论文全文数据库》;20170315;第I138-4862页 * |
基于方向余弦参量的物坐标系与世界坐标系间的坐标变换;许社教;《工程图学学报》;20040624;第123-127页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107680154A (zh) | 2018-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107680154B (zh) | 基于视图的体素几何参数提取方法 | |
Grimstead et al. | Creating solid models from single 2D sketches | |
KR0125776B1 (ko) | 선요소 데이타의 3차원 변환 장치 및 방법 | |
CN101799937A (zh) | 一种采用草图创建三维模型的方法 | |
JPH0756678B2 (ja) | 対話形形状モデリングシステム | |
Zollmann et al. | Interactive 4D overview and detail visualization in augmented reality | |
Pérez et al. | A comparison of hole-filling methods in 3D | |
Klacansky et al. | Fast and exact fiber surfaces for tetrahedral meshes | |
CN112634455B (zh) | 一种利用切割三角面片应用于三维模型棱线修复方法 | |
Ying et al. | Synthetic image data generation using bim and computer graphics for building scene understanding | |
Ueda et al. | Hand pose estimation using multi-viewpoint silhouette images | |
CN108898679A (zh) | 一种零部件序号自动标注的方法 | |
Karpenko et al. | Epipolar Methods for Multi-View Sketching. | |
Mezhenin et al. | Use of point clouds for video surveillance system cover zone imitation. | |
JP2023184496A (ja) | 3d形状を2dスケッチ上に推論する方法 | |
Fondevilla et al. | Patterns from photograph: Reverse-engineering developable products | |
Akman et al. | Sweeping with all graphical ingredients in a topological picturebook | |
Dekkers et al. | A sketching interface for feature curve recovery of free-form surfaces | |
Huang et al. | From BIM to pointcloud: automatic generation of labeled indoor pointcloud | |
Feng et al. | Winding Numbers on Discrete Surfaces | |
CN113902887A (zh) | 三维可视边生成方法、系统、计算机及可读存储介质 | |
Chen et al. | Extracting 3D objects from photographs using 3-sweep | |
McKay et al. | Computer-aided design synthesis: an application of shape grammars | |
Alghofaili et al. | WARPY: Sketching Environment-Aware 3D Curves in Mobile Augmented Reality | |
WO2015172504A1 (zh) | 一种构建三维物体的方法及计算机辅助设计系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |