不连续面三维网络模型图形显示及处理

来源:岁月联盟 作者:肖尚斌 宋英博 时间:2010-08-23

摘要:通过不连续面三维模拟获得了在模拟空间范围内具一定概率分布特征的不连续面,这些不连续面的形态以圆盘形式表示,空间位置由圆盘中心点坐标及产状表示,大小由圆盘直径体现。

关键词:不连续面 三维网络 模型 图形显示 处理

 

   通过不连续面三维网络模拟获得了在模拟空间范围内具一定概率分布特征的不连续面,这些不连续面的形态以圆盘形式表示,空间位置由圆盘中心点坐标及产状表示,大小由圆盘直径体现。根据模拟的结果可以进一步进行岩体稳定分析、岩体水力学性质等研究,但首先要解决的问题就是三维网络模型的图形化,即可视性,没有图形,研究将难以深入。为了使得研究者能直观地看到不连续面的三维网络模型,并能对网络模型进行切割产生平面网络,进而对这些图形直接进行处理,比如输出等。笔者用C++语言在Borland C++3.1集成环境下编写了一系列机程序,使得三维网络模型的应用更加方便可行。

   1 程序组成

   本模块由以下文件组成:

   3dnet.cpp,3dnet.exe,3ddraw.cpp,3dnet.prj,3dtools.cpp,3dnet.dat,news.cpp,3ddraw.h,tools.cpp,3dtools.h,3dfront.cpp,news.h,hzktext,tools.h,hzf24,egavea.bgi,trip.chr。

   在Borlandc++3.1的集成环境中经工程文件编译,产生3DNET.EXE可执行文件,在DOS或Windows环境下运行。

   2 程序编制依据

   2.1 面三维图形显示

   2.1.1求圆盘上各点三维坐标

   对于一个节理圆盘,沿其法向观测时其为一圆形,沿其走向观测时其为一线段,除此之外,从其他任何角度去观测,节理圆盘都为椭圆。C++语言所提供的绘椭圆函数ellipse()只能绘制长轴为X轴、短轴为Y轴的椭圆,而无法实现任意形状椭圆的显示,因此还得从圆盘轨迹着手,用moveto()、lineto()等函数来实现。

   由于三维网络模拟产生的节理是以具有中心点坐标、产状和直径的圆盘表示,所以圆盘上的每一点相对于模型来说都是确定的,都可以用一组三维坐标表达。

   求圆盘各点的坐标是出于这样的出发点:对照图1,对于一圆盘,很容易得到其倾向线,以倾向方向的半径OA顺时针(或逆时针)旋转一角度,得到另一半径OB,求出B点的坐标,旋转角的取值由0°到360°,即得到该圆盘的轨迹。

   对于倾角为α、倾向为β、半径为R中心点坐标为(Xo,Yo,Zo)的节理圆盘,其投影到水平面上则为一椭圆,该椭圆长半轴沿走向方向(以下所说的走向均指服从右手法则,长度为a=R,短半轴沿倾向方向,长度为b=Rcosa 。

  
   

  如果平移并沿Z轴旋转坐标系,使X轴与圆盘在水平面投影的椭圆长轴一致且原心在椭圆中心点,则椭圆上一点的坐标可表示为:

  X'=acosq =Rc (2-1-1)

  Y'=bsinq =Rcosa sinq (2-1-2)

  q 为所求坐标点与原心连线与椭圆长轴的夹角(逆时针为正),也就是圆盘上所求坐标点与圆盘中心点连线与走向线的夹角。

  再把坐标变换回来,即得到圆盘上任意一点的三维坐标,分别为:

  X=Xo+X'cosb +Y'sinb (2-1-3)

  Y=Yo+X'sinb +Y'cosb (2-1-4)

  Z=Zo-Rsinα' (2-1-5)

  α'为所求坐标点与圆盘中心点连线的倾角

  α'是这样确定的,圆盘与水平面的交线必为走向线,在图1中,OA为圆盘倾向方向半径,OB为与OA夹角为θ的一半径,两半径与水平面分别交于A'点和B'点,圆盘中心点O在水平面上的垂直投影点为O',A'B'即为走向线,O'A'B'构成水平面。

  因为OO'与A'O'垂直、OB'与B'O'垂直,并且OA'垂直于A'B'(走向线与倾向线),所以有:

  OA'=OO'/sina (α为圆盘倾角) (2-1-6)

  OB'=OO'/sina ' (a '为OB与水平面夹角) (2-1-7)

  OA'=OB'sinq (2-1-8)

  即:

  sina '=sina sinq (2-1-9)

  所以

  Z=Zo-Rsina sinq (2-1-10)

   2.1.2求圆盘在视面上的平面坐标

  计算机屏幕是个平面,要把一个三维物体在屏幕上显示出来,首先要把该物体各点的三维坐标变换为平面坐标。相对于物体,屏幕是个投影面,该面位于观测者与被观测物体之间,如图2。对于表征物体的三维坐标系O_XYZ,设观测点的位置为V,其直角坐标为(X,Y,Z),球面坐标为(ρ,θ,φ),显示屏与直线OV垂直,与V点的距离为D,对于物体的每一个点(X,Y,Z),都对应一个投影面平面坐标(SX,SY),该投影面坐标系方向如此定:当观测者的视线朝着O_XYZ坐标系的坐标原点时,SX轴指向右侧,SY轴指向上方。

  三维物体上的任一点(X,Y,Z)表示到二维显示平面上的平面坐标(SX,SY)为:

  SX=-Xsinθ+Ycosθ (2-1-11)

  SY=-Xcosθcosφ-Ysinθcosφ+Zsinφ (2-1-12)

  式中:θ为观测线在O-XY面上的投影线与X轴之间的夹角,φ为观测线与Z轴的夹角。

   

   2.1.3视区及象素

   在C++图形方式下,计算

  

  机屏幕上的位置通过象素(正整数)体现,每一个象素对应于屏幕上的一个点,象素的个数(分辨率)依赖于系统的图形适配器和连入系统的显示器类型及所处的方式。对于一般的VGA彩卡和彩色显示器,X方向的象素为0~640,Y方向的象素为0~480,C++的绘图函数,只能在此矩形区间内显示图形。

   通过三维物体的二维表示得到的三维网络模型各点的二维坐标值是相对于用户投影坐标系的,要全显或部分显示网络模型,必须通过比例缩放把这些二维坐标值转换为计算机屏幕上的象素,才能显示图形。

   在C++图形状态下,往往在屏幕上留下一部分位置作菜单显示或其他用途,只用屏幕上的某一矩形范围作为图形显示用,该矩形部分称为视区。对于三维模型,为了全显或部分显示其图形,也需要在其平面投影图上确定要显示的范围,该矩形范围成为窗口。如何把由窗口内的物体在视区中显示出来,首先要确定显示比例。

   如图3,设窗口的四条边界分别为:

   左X=X1,右X=X2,下Y=Y1,上Y=Y2

   设视区的四条边界分别为:

   左X=SX1,右X=SX2,下Y=SY1,上Y=SY2

  
 

   经变换后,窗口的上边界线段(或下边界线段)长X2-X1变换成视区上边界线段(或下边界线段)长SX2-SX1,设其比例变换因子为K1 ,则

   K1=(SX2-SX1)/(X2-X1) (2-1-13)

   对窗口内任一X坐标(X1≤X≤X2)变换后为视区内水平方向SX坐标(SX1≤SX≤SX2),

   SX=SX1+K1(X-X1) (2-1-14)

   同理,对窗口内任一Y坐标(Y1≤X≤Y2 )变换后为视区内水平方向SX坐标(SY1≤SY≤SY2),

   K2=(SY2-SY1)/(Y2-Y1) (2-1-15)

   SY=SY1+K2(Y-Y1) (2-1-16)

   由式(2-1-14)和式(2-1-16),把所求得的SX、SY值通过四舍五入的办法由实型数都转化为整型数,该数值即为C++图形状态的象素值。根据这些象素值,利用C++语言的基本绘图函数,就可以把由窗口定义的范围内的物体在视区中显示出来,但必须注意以下两点:

   ①长宽比例变换。由于窗口的长宽比与视区的长宽比并不一定相同,如果图形的X与Y方向按各自的比例变换因子K1、K2,将使的图形发生变形,而盲目使用某一个值又可能会使得窗口中的图形不能全显,为确保窗口中的图形全显且保持原样,必须对K1、K2值进行比较,取两者之间的小者,作为统一的图形比例系数。

   ②坐标轴方向变换。一般屏幕坐标系是直角左手系,Y轴方向向下为正,原点在屏幕左上角,而窗口内图形上的任一点(X,Y)是相对于右手坐标系的,因此在把(X,Y)变换为屏幕上的(SX,SY)时,Y值发生了变化,即图形产生了倒置,为保持图形一致,只需把所得的SY值用SY2-SY代替即可。

   2.2 三维图形处理及输出

  对于一个图形的操作是十分必要的,通过对图形旋转、放大、移动,可以全面地了解图形的特征,把图形打印输出,可以永久保存。

   2.2.1旋转、放大及移动

   在机屏幕上显示三维网络模型等图形之后,有时要对图形进行旋转,从不同的角度来观测该图形,可通过改变观测线的角度实现这一目的。在三维坐标的二维表示中已引进了θ和φ两个参数,θ为观测线在OXY平面上的投影线与X轴的夹角,φ为观测线与Z轴的夹角,调整θ、φ,即可唯一确定一观测线,所得的图形即相对于与该观测线垂直的视平面图形。在程序中可利用菜单,通过屏幕输入θ、φ值,由式(2-1-11)、式(2-1-12)而改变图形在视平面上的二维坐标,图形的象素也将随之改变,从而实现图形在三度空间中沿任意轴的选转。

   图形的放大及移动实际上是对窗口进行操作。对屏幕上显示的图形的某部分进行放大显示时,用鼠标在屏幕图形上选定一矩形域,该矩形域的各顶点相应于二维平面视图中的窗口中的一小窗口,通过调整比例变换因子而使该小窗口中的图形充满整个视区,从而达到图形放大的目的。这时要想看到其他位置的图形,可以用鼠标在图形中固定一点再拖动到一个新位置,可求出鼠标的象素位移,由比例变换因子而知道相应于该位移的视平面坐标值,依此值而相应调整窗口中的图形内容,达到图形移动的目的。

   2.2.2图形输出

   通过坐标变换,用C++程序在屏幕上显示所需要的图形,这些图形其实是由一系列坐标值通过绘图函数而实现,为了输出这些图形,可以把这些坐标值写到文件上,同时写入各绘图命令,比如用起笔、落笔的方式写到 *.plt文件上,用Surfer输出图形;用Auto基本图元命令写到 *.scr文件上,并在Auto环境中进行编辑,最后打印输出这些图形。

   3 结束语

   根据以上介绍的原理编制出的程序,不仅可以对不连续面三维网络模拟产生的三维网络模型进行三维图形显示及处理,也可以对实测的不连续面构成的实体三维图形进行操作。该程序的主要作用之一是为了切割任意截面的不连续面形迹图。至于如何切制这些图形,将在以后的文章中介绍。

图片内容