Delaunay三角网表示点和删除算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0引言

对于静态数据三角化(数据点不能动态插入与删除),有许多D-三角网构建算法[1-5];对于动态的点插入,使用逐点插入的方法进行动态局部更新;对于动态的点删除,使用的方法有两种,一是基于凸耳权值的点删除方法[6-7],二是基于空外接圆准则和凸耳性质的点删除方法[8-9],上述两种方法都是基于凸耳删除的方法,存在难以理解或算法效率差的缺点。本文提出了一种数据结构来存储D-三角网和表现其拓扑关系,对其中的点删除算法进行了改进,可实现D-三角网中数据点的快速删除操作。

1存储结构

对于三角格网的存储结构,本文设计了点、有向边的存储

表示,三角形的信息在有向边的遍历中隐含,其C++实现如下:

Class Point2d {double x,y;}

Class Edge {

Public:Int num;Edge*

next;Edge*

prev;

Point2d*data;Edge (){data =0;}

Edge*Sym (){return (num<1)?this+1:this-1;}Edge*Onext (){return next;}Edge*Oprev (){return prev;}

void EndPoints (Point2d*or,Point2d*de ){data =or;Sym ()->data =de;}

TwinEdge*Tedge (){return (TwinEdge *)(this -num );}};

Class TwinEdge {Private:Edge e [2];Public:TwinEdge (){

e [0].num =0;e [0].next =&(e [0]);e [1].num =1;e [1].next =&(e [1]);

收稿日期:2007-03-01E-mail :mengl@

基金项目:国家863高技术研究发展计划基金项目(2002AA114020、2001AA135210);中国科学院知识创新基金项目(20036020)。

作者简介:孟亮(1968-),男,山西临汾人,博士研究生,研究方向为GIS 、计算机图形学;方金云(1968-),男,山东青岛人,博士,副研究员,研究方向为海量空间数据处理关键支撑技术、网格GIS 等;唐志敏(1966-),男,江苏江阴人,研究员,博士生导师,研究方向为计算机系统结构、网络并行处理。

Delaunay 三角网表示和点删除方法

亮,方金云,唐志敏

(中国科学院计算技术研究所,北京100080)

要:对于三角网的表示方法,提出了一种双循环链表结构,这种结构能够方便的表示三角网的边拓扑和面拓扑信息,以及多边形结构。基于这种结构,对三角网点删除算法进行了改进。以前的点删除算法是基于连续的凸耳删除,提出的方法是基于多边形边的构建方法,利用D-三角网的空外接圆属性。与其它方法相比,这种方法具有容易理解,效率高的优点。关键词:Delaunay 三角网;凸耳;点删除;拓扑结构;双循环链表中图法分类号:TP391;P208

文献标识码:A

文章编号:1000-7024(2008)03-0738-03

Delaunay TIN expression and point deletion method

MENG Liang,

FANG Jin-yun,

TANG Zhi-min

(Institute of Computing Technology,Chinese Academy of Sciences,Beijing 100080,China )

Abstract :As to representation of triangulated irregular network (TIN ),a dual-circulation linked list structure is proposed,this structure can conveniently express edge and plane topology information of triangulated irregular network,and polygon structure.Based on this structure,improvements are achieved about TIN point deletion algorithm.Previous point deletion algorithm is based on continuous ears deletion,the methods proposed is based on edge construction method of polygon,using Delaunay TIN circumcircle pared with other methods,this method has the advantage of easy understanding,higher efficiency.

Key words :Delaunay triangulated irregular network;ears;point deletion;topology structure;dual-circulation linked list

2008年2月计算机工程与设计

Feb.2008

第29卷第3期Vol.29

No.3

Computer Engineering and Design

e [0].prev =&(e [0]);e [1].prev =&(e [1]);}};

Edge*MakeEdge (){

TwinEdge*q1=new TwinEdge;Return q1->e;}

与上相应,三角格网中的一条边由类class TwinEdge 表示,该类中包含两个有向边e [0]和e [1],e [0]和e [1]为同一条边,但方向相反(如图1所示),三角化过程中创建边时均需调用函数MakeEdge (),以确保创建两个有向边,但只返回其中一个,另一个通过调用Sym ()函数获得。有向边由类class Edge 表示,类成员num 通过函数Sym ()的调用在一条边的两个有向边之间转换,类成员data 指向有向边的源点(如图1中有向边e 的源点由Edata 指示),类成员next 指向同源点逆时针方向的下一个有向边,类成员prev 为同源点逆时针方向的上一个有向边,初始化时next 和prev 均指向自身,所以说该存储方式为对称边双循环链表。图2为面状图形中给定边e 的边邻接关系,或者说是边拓扑,使用类class Edge 的成员函数,能够较容易的表示上述结构:

eLnext =Sym ()->Oprev ();eDprev =Sym ()->Oprev ()->Sym ();eDnext =Sym ()->Onext ()->Sym ();eRprev =Sym ()->Onext ();eOnext =Onext ();eLprev =Onext ()->Sym ();eRnext =Oprev ()->Sym ();eOprev =Oprev ();eSym =Sym ();

有向边e 所关联的三角形的边为:e,eLnext,eLprev ;有向边eSym 所关联的三角形的边为:eSym,eOprev (即eSym->

eLnext ),eDnext (即eSym->eLprev )。

上述为给定边的面拓扑。所以说,使用上述数据结构,能够比较容易的表示其边拓扑和面拓扑关系。

2给定结构相关操作

对于上述三角网结构,需要在数据点的动态插入和删除

过程中维护其拓扑关系,下面简要介绍链表的维护和四边形的构造方法:

2.1有向边循环链表的操作

有向边a 和有向边b 属同源边,a 边到b 边为逆时针方向

(如图3所示),b 边为新建有向边,需插入到同源边链表中,其实现如下:

void AppendLink (Edge*a,Edge*b ){

Edge*anext =a->Onext ();b->next =anext;a->next =b;anext->prev =b;b->prev =a;}

依据图3,类似可定义DeleteLink (Edge*b )函数,其功能为使有向边b 脱离链表。

在动态更新三角网时,需依据有向边来执行删除边的操作,其实现如下:

V oid DeleteEdge (Edge*e ){

DeleteLink (e );DeleteLink (e->Sym ());

Delete e->Tedge ();}

2.2四边形的构建

应用上述数据结构,主要是在创建边过程中维护边之间

的顺序关系。如图4所示的四边形abcd ,点序列abcd 为逆时针方向,调用函数init (Point2d*a,Point2d*b ,Point2d*c,Point2d*d )构建四边形:

Init (Point2d*a ,Point2d*b,Point2d*c,Point2d*d ){

Edge*ea =MakeEdge ();ea->EndPoints (a,b );Edge*eb =MakeEdge ();eb->EndPoints (b,c );AppendLink (eb,ea->Sym ());

图1对称边双循环链表

e

eSyn

eSym->eOnext

eSym->

eOprev

eOprev

eOnext

Edata 图3有向边循环链表的操作

a

b

c a

b

c 删除链

插入链

a

b

c a

b c

Next Prev

Next

Prev

相关文档
最新文档