package Ġorg . open rnd r . k tes sell ation Ċ Ċ internal Ġobject ĠMesh Ġ{ ĊĠĠĠ Ġ/ ************************ ĠUtility ĠRout ines Ġ Ġ*/ Ġ/* ĠMake Edge Ġcreates Ġa Ġnew Ġpair Ġof Ġhalf - edges Ġwhich Ġform Ġtheir Ġown Ġloop . Ċ Ġ* ĠNo Ġvertex Ġor Ġface Ġstructures Ġare Ġallocated , Ġbut Ġthese Ġmust Ġbe Ġassigned Ċ Ġ* Ġbefore Ġthe Ġcurrent Ġedge Ġoperation Ġis Ġcompleted . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠMake Edge ( e Next : ĠGL U half Edge ): ĠGL U half Edge Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe Next : ĠGL U half Edge Ġ= Ġe Next ĊĠĠĠĠĠĠĠ Ġval Ġe Prev : ĠGL U half Edge Ċ Ċ // ĠĠĠĠĠĠĠ ĠEdge Pair Ġ* Ġpair Ġ= Ġ( Edge Pair Ġ*) Ċ // ĠĠĠĠĠĠĠ Ġmem Alloc ( sizeof ( Edge Pair )); Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( pair Ġ== ĠNULL ) Ġreturn ĠNULL ; Ċ // Ċ // ĠĠĠĠĠĠĠ Ġe Ġ= Ġ& pair Ġ- Ġ> Ġe ; ĊĠĠĠĠĠĠĠ Ġval Ġe : ĠGL U half Edge Ġ= ĠGL U half Edge ( true ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġe Sym Ġ= Ġ& pair Ġ- Ġ> Ġe Sym ; ĊĠĠĠĠĠĠĠ Ġval Ġe Sym : ĠGL U half Edge Ġ= ĠGL U half Edge ( false ) ĊĊĊĠĠĠĠĠĠĠ Ġ/* ĠMake Ġsure Ġe Next Ġpoints Ġto Ġthe Ġfirst Ġedge Ġof Ġthe Ġedge Ġpair Ġ*/ if Ġ(! e Next . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Next Ġ= Ġe Next . Sym Ġ?: Ġerror (" e Next . Sym Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠInsert Ġin Ġcircular Ġdoub ly - linked Ġlist Ġbefore Ġe Next . ĊĠĠĠĠĠĠĠĠ Ġ* ĠNote Ġthat Ġthe Ġprev Ġpointer Ġis Ġstored Ġin ĠSym -> next . ĊĠĠĠĠĠĠĠĠ Ġ*/ e Prev Ġ= Ġe Next . Sym ?. next Ġ?: Ġerror (" e Next . Sym . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġe Sym . next Ġ= Ġe Prev ĊĠĠĠĠĠĠĠ Ġe Prev . Sym !!. next Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe . next Ġ= Ġe Next ĊĠĠĠĠĠĠĠ Ġe Next . Sym !!. next Ġ= Ġe Sym ĊĠĠĠĠĠĠĠ Ġe . Sym Ġ= Ġe Sym ĊĠĠĠĠĠĠĠ Ġe . On ext Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe . L next Ġ= Ġe Sym ĊĠĠĠĠĠĠĠ Ġe . Org Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe . L face Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe . wind ing Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġe . active Region Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . Sym Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe Sym . On ext Ġ= Ġe Sym ĊĠĠĠĠĠĠĠ Ġe Sym . L next Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe Sym . Org Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . L face Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . wind ing Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġe Sym . active Region Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġe ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠSp lice ( Ġa , Ġb Ġ) Ġis Ġbest Ġdescribed Ġby Ġthe ĠGu ib as / St ol fi Ġpaper Ġor Ġthe Ċ Ġ* ĠCS 3 4 8 a Ġnotes Ġ( see Ġmesh . h ). Ġ ĠBasic ally Ġit Ġmod ifies Ġthe Ġmesh Ġso Ġthat Ċ Ġ* Ġa -> On ext Ġand Ġb -> On ext Ġare Ġex changed . Ġ ĠThis Ġcan Ġhave Ġvarious Ġeffects Ċ Ġ* Ġdepending Ġon Ġwhether Ġa Ġand Ġb Ġbelong Ġto Ġdifferent Ġface Ġor Ġvertex Ġr ings . Ċ Ġ* ĠFor Ġmore Ġexplanation Ġsee Ġ__ gl _ mesh Sp lice () Ġbelow . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠSp lice ( a : ĠGL U half Edge , Ġb : ĠGL U half Edge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa On ext : ĠGL U half Edge Ġ= Ġa . On ext Ġ?: Ġerror (" a . On ext Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġb On ext : ĠGL U half Edge Ġ= Ġb . On ext Ġ?: Ġerror (" a . On ext Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġa On ext . Sym ?. L next Ġ= Ġb ĊĠĠĠĠĠĠĠ Ġb On ext . Sym ?. L next Ġ= Ġa ĊĠĠĠĠĠĠĠ Ġa . On ext Ġ= Ġb On ext ĊĠĠĠĠĠĠĠ Ġb . On ext Ġ= Ġa On ext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠMake Vertex ( Ġnew Vertex , Ġe Orig , Ġv Next Ġ) Ġatt aches Ġa Ġnew Ġvertex Ġand Ġmakes Ġit Ġthe Ċ Ġ* Ġorigin Ġof Ġall Ġedges Ġin Ġthe Ġvertex Ġloop Ġto Ġwhich Ġe Orig Ġbelongs . Ġ" v Next " Ġgives Ċ Ġ* Ġa Ġplace Ġto Ġinsert Ġthe Ġnew Ġvertex Ġin Ġthe Ġglobal Ġvertex Ġlist . Ġ ĠWe Ġinsert Ċ Ġ* Ġthe Ġnew Ġvertex Ġ* before * Ġv Next Ġso Ġthat Ġalgorithms Ġwhich Ġwalk Ġthe Ġvertex Ċ Ġ* Ġlist Ġwill Ġnot Ġsee Ġthe Ġnewly Ġcreated Ġvertices . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠMake Vertex ( ĊĠĠĠĠĠĠĠ Ġnew Vertex : ĠGL U vertex , ĊĠĠĠĠĠĠĠ Ġe Orig : ĠGL U half Edge , Ġv Next : ĠGL U vertex ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġv Prev : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġval Ġv New : ĠGL U vertex Ġ= Ġnew Vertex ĊĠĠĠĠĠĠĠ Ġrequire ( v New Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġinsert Ġin Ġcircular Ġdoub ly - linked Ġlist Ġbefore Ġv Next Ġ*/ ĊĠĠĠĠĠĠĠ Ġv Prev Ġ= Ġv Next . prev ?: error (" v Next . prev Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġv New . prev Ġ= Ġv Prev ĊĠĠĠĠĠĠĠ Ġv Prev . next Ġ= Ġv New ĊĠĠĠĠĠĠĠ Ġv New . next Ġ= Ġv Next ĊĠĠĠĠĠĠĠ Ġv Next . prev Ġ= Ġv New ĊĠĠĠĠĠĠĠ Ġv New . an Edge Ġ= Ġe Orig ĊĠĠĠĠĠĠĠ Ġv New . data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ/* Ġleave Ġcoords , Ġs , Ġt Ġundefined Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ/* Ġfix Ġother Ġedges Ġon Ġthis Ġvertex Ġloop Ġ*/ e Ġ= Ġe Orig ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . Org Ġ= Ġv New ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . On ext Ġ?: Ġerror ( e . On ext Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġe Orig ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠMake Face ( Ġnew Face , Ġe Orig , Ġf Next Ġ) Ġatt aches Ġa Ġnew Ġface Ġand Ġmakes Ġit Ġthe Ġleft Ċ Ġ* Ġface Ġof Ġall Ġedges Ġin Ġthe Ġface Ġloop Ġto Ġwhich Ġe Orig Ġbelongs . Ġ Ġ" f Next " Ġgives Ċ Ġ* Ġa Ġplace Ġto Ġinsert Ġthe Ġnew Ġface Ġin Ġthe Ġglobal Ġface Ġlist . Ġ ĠWe Ġinsert Ċ Ġ* Ġthe Ġnew Ġface Ġ* before * Ġf Next Ġso Ġthat Ġalgorithms Ġwhich Ġwalk Ġthe Ġface Ċ Ġ* Ġlist Ġwill Ġnot Ġsee Ġthe Ġnewly Ġcreated Ġfaces . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠMake Face ( ĊĠĠĠĠĠĠĠ Ġnew Face : ĠGL U face , ĊĠĠĠĠĠĠĠ Ġe Orig : ĠGL U half Edge , ĊĠĠĠĠĠĠĠ Ġf Next : ĠGL U face ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġf Prev : ĠGL U face ĊĠĠĠĠĠĠĠ Ġval Ġf New : ĠGL U face Ġ= Ġnew Face ĊĠĠĠĠĠĠĠ Ġrequire ( f New Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġinsert Ġin Ġcircular Ġdoub ly - linked Ġlist Ġbefore Ġf Next Ġ*/ ĊĠĠĠĠĠĠĠ Ġf Prev Ġ= Ġf Next . prev Ġ?: Ġerror (" f Next . prev Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġf New . prev Ġ= Ġf Prev ĊĠĠĠĠĠĠĠ Ġf Prev . next Ġ= Ġf New ĊĠĠĠĠĠĠĠ Ġf New . next Ġ= Ġf Next ĊĠĠĠĠĠĠĠ Ġf Next . prev Ġ= Ġf New ĊĠĠĠĠĠĠĠ Ġf New . an Edge Ġ= Ġe Orig ĊĠĠĠĠĠĠĠ Ġf New . data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf New . trail Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf New . marked Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ/* ĠThe Ġnew Ġface Ġis Ġmarked Ġ" inside " Ġif Ġthe Ġold Ġone Ġwas . Ġ ĠThis Ġis Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġconvenience Ġfor Ġthe Ġcommon Ġcase Ġwhere Ġa Ġface Ġhas Ġbeen Ġsplit Ġin Ġtwo . ĊĠĠĠĠĠĠĠĠ Ġ*/ f New . inside Ġ= Ġf Next . inside ĊĊĠĠĠĠĠĠĠ Ġ/* Ġfix Ġother Ġedges Ġon Ġthis Ġface Ġloop Ġ*/ e Ġ= Ġe Orig ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . L face Ġ= Ġf New ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . L next Ġ?: Ġerror (" e . L next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġe Orig ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠKill Edge ( Ġe Del Ġ) Ġdest ro ys Ġan Ġedge Ġ( the Ġhalf - edges Ġe Del Ġand Ġe Del -> Sym ), Ċ Ġ* Ġand Ġremoves Ġfrom Ġthe Ġglobal Ġedge Ġlist . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠKill Edge ( e Del : ĠGL U half Edge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe Del : ĠGL U half Edge Ġ= Ġe Del ĊĠĠĠĠĠĠĠ Ġval Ġe Prev : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġe Next : ĠGL U half Edge ĊĊĠĠĠĠĠĠĠ Ġ/* ĠHalf - edges Ġare Ġallocated Ġin Ġpairs , Ġsee ĠEdge Pair Ġabove Ġ*/ if Ġ(! e Del . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Del Ġ= Ġe Del . Sym Ġ?: Ġerror (" e Del . Sym Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġdelete Ġfrom Ġcircular Ġdoub ly - linked Ġlist Ġ*/ e Next Ġ= Ġe Del . next Ġ?: Ġerror (" e Del . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġe Prev Ġ= Ġe Del . Sym ?. next Ġ?: Ġerror (" e Del . Sym . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġe Next . Sym !!. next Ġ= Ġe Prev ĊĠĠĠĠĠĠĠ Ġe Prev . Sym !!. next Ġ= Ġe Next ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠKill Vertex ( Ġv Del Ġ) Ġdest ro ys Ġa Ġvertex Ġand Ġremoves Ġit Ġfrom Ġthe Ġglobal Ċ Ġ* Ġvertex Ġlist . Ġ ĠIt Ġupdates Ġthe Ġvertex Ġloop Ġto Ġpoint Ġto Ġa Ġgiven Ġnew Ġvertex . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠKill Vertex ( v Del : ĠGL U vertex , Ġnew Org : ĠGL U vertex ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġe Start : ĠGL U half Edge Ġ= Ġv Del . an Edge Ġ?: Ġerror (" v Del . an Edge Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġv Prev : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġval Ġv Next : ĠGL U vertex ĊĊĠĠĠĠĠĠĠ Ġ/* Ġchange Ġthe Ġorigin Ġof Ġall Ġaffected Ġedges Ġ*/ e Ġ= Ġe Start ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . Org Ġ= Ġnew Org ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . On ext Ġ?: Ġerror (" e . On ext Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġe Start ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġdelete Ġfrom Ġcircular Ġdoub ly - linked Ġlist Ġ*/ v Prev Ġ= Ġv Del . prev Ġ?: Ġerror (" v Del . prev Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġv Next Ġ= Ġv Del . next Ġ?: Ġerror (" v Del . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġv Next . prev Ġ= Ġv Prev ĊĠĠĠĠĠĠĠ Ġv Prev . next Ġ= Ġv Next ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠKill Face ( Ġf Del Ġ) Ġdest ro ys Ġa Ġface Ġand Ġremoves Ġit Ġfrom Ġthe Ġglobal Ġface Ċ Ġ* Ġlist . Ġ ĠIt Ġupdates Ġthe Ġface Ġloop Ġto Ġpoint Ġto Ġa Ġgiven Ġnew Ġface . Ċ Ġ*/ ĊĠĠĠ Ġfun ĠKill Face ( f Del : ĠGL U face , Ġnew L face : ĠGL U face ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġe Start : ĠGL U half Edge Ġ= Ġf Del . an Edge Ġ?: Ġerror (" f Del . an Edge Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġf Prev : ĠGL U face ĊĠĠĠĠĠĠĠ Ġval Ġf Next : ĠGL U face ĊĊĠĠĠĠĠĠĠ Ġ/* Ġchange Ġthe Ġleft Ġface Ġof Ġall Ġaffected Ġedges Ġ*/ e Ġ= Ġe Start ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . L face Ġ= Ġnew L face ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . L next Ġ?: Ġerror (" e . L next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġe Start ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġdelete Ġfrom Ġcircular Ġdoub ly - linked Ġlist Ġ*/ f Prev Ġ= Ġf Del . prev Ġ?: Ġerror (" f Del . prev Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġf Next Ġ= Ġf Del . next Ġ?: Ġerror (" f Del . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġf Next . prev Ġ= Ġf Prev ĊĠĠĠĠĠĠĠ Ġf Prev . next Ġ= Ġf Next ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************** ** ĠBasic ĠEdge ĠOperations Ġ Ġ*/ Ġ/* Ġ__ gl _ mesh Make Edge Ġcreates Ġone Ġedge , Ġtwo Ġvertices , Ġand Ġa Ġloop Ġ( face ). Ċ Ġ* ĠThe Ġloop Ġconsists Ġof Ġthe Ġtwo Ġnew Ġhalf - edges . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Make Edge ( mesh : ĠGL U mesh ): ĠGL U half Edge ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Vertex 1 : ĠGL U vertex Ġ= ĠGL U vertex () ĊĠĠĠĠĠĠĠ Ġval Ġnew Vertex 2 : ĠGL U vertex Ġ= ĠGL U vertex () ĊĠĠĠĠĠĠĠ Ġval Ġnew Face : ĠGL U face Ġ= ĠGL U face () ĊĠĠĠĠĠĠĠ Ġval Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġe Ġ= ĠMake Edge ( mesh . e Head ) ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ ĠMake Vertex ( new Vertex 1 , Ġe , Ġmesh . v Head ) ĊĠĠĠĠĠĠĠ ĠMake Vertex ( new Vertex 2 , Ġe . Sym Ġ?: Ġerror (" e . Sym Ġ== Ġnull "), Ġmesh . v Head ) ĊĠĠĠĠĠĠĠ ĠMake Face ( new Face , Ġe , Ġmesh . f Head ) ĊĠĠĠĠĠĠĠ Ġreturn Ġe ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Sp lice ( Ġe Org , Ġe Dst Ġ) Ġis Ġthe Ġbasic Ġoperation Ġfor Ġchanging Ġthe Ċ Ġ* Ġmesh Ġconnectivity Ġand Ġtopology . Ġ ĠIt Ġchanges Ġthe Ġmesh Ġso Ġthat Ċ Ġ* ĉ e Org -> On ext Ġ<- ĠO LD ( Ġe Dst -> On ext Ġ) Ċ Ġ* ĉ e Dst -> On ext Ġ<- ĠO LD ( Ġe Org -> On ext Ġ) Ċ Ġ* Ġwhere ĠO LD (...) Ġmeans Ġthe Ġvalue Ġbefore Ġthe Ġmesh Sp lice Ġoperation . Ċ Ġ* Ċ Ġ* ĠThis Ġcan Ġhave Ġtwo Ġeffects Ġon Ġthe Ġvertex Ġstructure : Ċ Ġ* Ġ Ġ- Ġif Ġe Org -> Org Ġ!= Ġe Dst -> Org , Ġthe Ġtwo Ġvertices Ġare Ġmerged Ġtogether Ċ Ġ* Ġ Ġ- Ġif Ġe Org -> Org Ġ== Ġe Dst -> Org , Ġthe Ġorigin Ġis Ġsplit Ġinto Ġtwo Ġvertices Ċ Ġ* ĠIn Ġboth Ġcases , Ġe Dst -> Org Ġis Ġchanged Ġand Ġe Org -> Org Ġis Ġun touched . Ċ Ġ* Ċ Ġ* ĠSimilar ly Ġ( and Ġindependently ) Ġfor Ġthe Ġface Ġstructure , Ċ Ġ* Ġ Ġ- Ġif Ġe Org -> L face Ġ== Ġe Dst -> L face , Ġone Ġloop Ġis Ġsplit Ġinto Ġtwo Ċ Ġ* Ġ Ġ- Ġif Ġe Org -> L face Ġ!= Ġe Dst -> L face , Ġtwo Ġdistinct Ġloops Ġare Ġjoined Ġinto Ġone Ċ Ġ* ĠIn Ġboth Ġcases , Ġe Dst -> L face Ġis Ġchanged Ġand Ġe Org -> L face Ġis Ġun affected . Ċ Ġ* Ċ Ġ* ĠSome Ġspecial Ġcases : Ċ Ġ* ĠIf Ġe Dst Ġ== Ġe Org , Ġthe Ġoperation Ġhas Ġno Ġeffect . Ċ Ġ* ĠIf Ġe Dst Ġ== Ġe Org -> L next , Ġthe Ġnew Ġface Ġwill Ġhave Ġa Ġsingle Ġedge . Ċ Ġ* ĠIf Ġe Dst Ġ== Ġe Org -> L prev , Ġthe Ġold Ġface Ġwill Ġhave Ġa Ġsingle Ġedge . Ċ Ġ* ĠIf Ġe Dst Ġ== Ġe Org -> On ext , Ġthe Ġnew Ġvertex Ġwill Ġhave Ġa Ġsingle Ġedge . Ċ Ġ* ĠIf Ġe Dst Ġ== Ġe Org -> O prev , Ġthe Ġold Ġvertex Ġwill Ġhave Ġa Ġsingle Ġedge . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Sp lice ( ĊĠĠĠĠĠĠĠ Ġe Org : ĠGL U half Edge , ĊĠĠĠĠĠĠĠ Ġe Dst : ĠGL U half Edge ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġjoining Lo ops Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġjoining Vertices Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( e Org Ġ=== Ġe Dst ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( e Dst . Org Ġ!== Ġe Org . Org ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġare Ġmerging Ġtwo Ġdis joint Ġvertices Ġ-- Ġdestroy Ġe Dst -> Org Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoining Vertices Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Vertex ( e Dst . Org Ġ?: Ġerror (" e Dst . Org Ġ== Ġnull "), Ġe Org . Org Ġ?: Ġerror (" e Org . Org Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( e Dst . L face Ġ!== Ġe Org . L face ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġare Ġconnecting Ġtwo Ġdis joint Ġloops Ġ-- Ġdestroy Ġe Dst . L face Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoining Lo ops Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Face ( e Dst . L face Ġ?: Ġerror (" e Dst . L face Ġ== Ġnull "), Ġe Org . L face Ġ?: Ġerror (" e Org . L face Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠChange Ġthe Ġedge Ġstructure Ġ*/ Sp lice ( e Dst , Ġe Org ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! join ing Vertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Vertex : ĠGL U vertex Ġ= ĠGL U vertex () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġsplit Ġone Ġvertex Ġinto Ġtwo Ġ-- Ġthe Ġnew Ġvertex Ġis Ġe Dst . Org . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠMake Ġsure Ġthe Ġold Ġvertex Ġpoints Ġto Ġa Ġvalid Ġhalf - edge . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ Make Vertex ( new Vertex , Ġe Dst , Ġe Org . Org ?: error (" e Org . Org Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Org . Org !!. an Edge Ġ= Ġe Org ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! join ing Lo ops ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Face : ĠGL U face Ġ= ĠGL U face () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġsplit Ġone Ġloop Ġinto Ġtwo Ġ-- Ġthe Ġnew Ġloop Ġis Ġe Dst . L face . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠMake Ġsure Ġthe Ġold Ġface Ġpoints Ġto Ġa Ġvalid Ġhalf - edge . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ Make Face ( new Face , Ġe Dst , Ġe Org . L face Ġ?: Ġerror (" e Org . L face Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Org . L face !!. an Edge Ġ= Ġe Org ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Delete ( Ġe Del Ġ) Ġremoves Ġthe Ġedge Ġe Del . Ġ ĠThere Ġare Ġseveral Ġcases : Ċ Ġ* Ġif Ġ( e Del . L face Ġ!= Ġe Del . R face ), Ġwe Ġjoin Ġtwo Ġloops Ġinto Ġone ; Ġthe Ġloop Ċ Ġ* Ġe Del . L face Ġis Ġdeleted . Ġ ĠOtherwise , Ġwe Ġare Ġsplitting Ġone Ġloop Ġinto Ġtwo ; Ċ Ġ* Ġthe Ġnewly Ġcreated Ġloop Ġwill Ġcontain Ġe Del . Dst . Ġ ĠIf Ġthe Ġdeletion Ġof Ġe Del Ċ Ġ* Ġwould Ġcreate Ġisolated Ġvertices , Ġthose Ġare Ġdeleted Ġas Ġwell . Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġcould Ġbe Ġimplemented Ġas Ġtwo Ġcalls Ġto Ġ__ gl _ mesh Sp lice Ċ Ġ* Ġplus Ġa Ġfew Ġcalls Ġto Ġmem Free , Ġbut Ġthis Ġwould Ġallocate Ġand Ġdelete Ċ Ġ* Ġunnecessary Ġvertices Ġand Ġfaces . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Delete ( e Del : ĠGL U half Edge ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Del Sym : ĠGL U half Edge Ġ= Ġe Del . Sym Ġ?: Ġerror (" e Del . Sym Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġvar Ġjoining Lo ops Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ/* ĠFirst Ġstep : Ġdisconnect Ġthe Ġorigin Ġvertex Ġe Del . Org . Ġ ĠWe Ġmake Ġall ĊĠĠĠĠĠĠĠĠ Ġ* Ġchanges Ġto Ġget Ġa Ġconsistent Ġmesh Ġin Ġthis Ġ" intermediate " Ġstate . ĊĠĠĠĠĠĠĠĠ Ġ*/ if Ġ( e Del . L face Ġ!== Ġe Del . Sym !!. L face ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġare Ġjoining Ġtwo Ġloops Ġinto Ġone Ġ-- Ġremove Ġthe Ġleft Ġface Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoining Lo ops Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Face ( e Del . L face Ġ?: Ġerror (" e Del . L face Ġ== Ġnull "), Ġe Del . Sym ?. L face Ġ?: Ġerror (" e Del . Sym . L face Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( e Del . On ext Ġ=== Ġe Del ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Vertex ( e Del . Org Ġ?: Ġerror (" e Del . Org Ġ== Ġnull "), Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠMake Ġsure Ġthat Ġe Del . Org Ġand Ġe Del . Sym . L face Ġpoint Ġto Ġvalid Ġhalf - edges Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Del . Sym !!. L face !!. an Edge Ġ= Ġe Del . Sym !!. L next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Del . Org !!. an Edge Ġ= Ġe Del !!. On ext ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp lice ( e Del , Ġe Del . Sym !!. L next !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! join ing Lo ops ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Face : ĠGL U face Ġ= ĠGL U face () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġare Ġsplitting Ġone Ġloop Ġinto Ġtwo Ġ-- Ġcreate Ġa Ġnew Ġloop Ġfor Ġe Del . Ġ*/ Make Face ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Face , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Del , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Del . L face Ġ?: Ġerror (" e Del . L face Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠClaim : Ġthe Ġmesh Ġis Ġnow Ġin Ġa Ġconsistent Ġstate , Ġexcept Ġthat Ġe Del . Org ĊĠĠĠĠĠĠĠĠ Ġ* Ġmay Ġhave Ġbeen Ġdeleted . Ġ ĠNow Ġwe Ġdisconnect Ġe Del . Dst . ĊĠĠĠĠĠĠĠĠ Ġ*/ if Ġ( e Del Sym . On ext Ġ=== Ġe Del Sym ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Vertex ( e Del Sym . Org Ġ?: Ġerror (" e Del Sym . Org Ġ== Ġnull "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Face ( e Del Sym . L face Ġ?: Ġerror (" e Del Sym . L face Ġ== Ġnull "), Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠMake Ġsure Ġthat Ġe Del . Dst Ġand Ġe Del . L face Ġpoint Ġto Ġvalid Ġhalf - edges Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Del . L face !!. an Edge Ġ= Ġe Del Sym . Sym !!. L next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Del Sym . Org !!. an Edge Ġ= Ġe Del Sym . On ext ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp lice ( e Del Sym , Ġe Del Sym . Sym !!. L next Ġ?: Ġerror (" e Del Sym . L next Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠAny Ġisolated Ġvertices Ġor Ġfaces Ġhave Ġalready Ġbeen Ġfreed . Ġ*/ ĊĠĠĠĠĠĠĠ ĠKill Edge ( e Del ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************** **** ĠOther ĠEdge ĠOperations Ġ Ġ*/ Ġ/* ĠAll Ġthese Ġroutines Ġcan Ġbe Ġimplemented Ġwith Ġthe Ġbasic Ġedge Ċ Ġ* Ġoperations Ġabove . Ġ ĠThey Ġare Ġprovided Ġfor Ġconvenience Ġand Ġefficiency . Ċ Ġ*/ ĊĠĠĠ Ġ/* Ġ__ gl _ mesh Add Edge Vertex ( Ġe Org Ġ) Ġcreates Ġa Ġnew Ġedge Ġe New Ġsuch Ġthat Ċ Ġ* Ġe New Ġ== Ġe Org . L next , Ġand Ġe New . Dst Ġis Ġa Ġnewly Ġcreated Ġvertex . Ċ Ġ* Ġe Org Ġand Ġe New Ġwill Ġhave Ġthe Ġsame Ġleft Ġface . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Add Edge Vertex ( e Org : ĠGL U half Edge ): ĠGL U half Edge Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe New Sym : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġe New : ĠGL U half Edge Ġ= ĠMake Edge ( e Org ) ĊĠĠĠĠĠĠĠ Ġe New Sym Ġ= Ġe New . Sym Ġ?: Ġerror (" e New . Sym Ġ== Ġnull ") ĊĊĠĠĠĠĠĠĠ Ġ/* ĠConnect Ġthe Ġnew Ġedge Ġappropriately Ġ*/ ĊĠĠĠĠĠĠĠ ĠSp lice ( e New , Ġe Org . L next Ġ?: Ġerror (" e Org . L Next Ġ== Ġnull ")) ĊĊĠĠĠĠĠĠĠ Ġ/* ĠSet Ġthe Ġvertex Ġand Ġface Ġinformation Ġ*/ ĊĠĠĠĠĠĠĠ Ġe New . Org Ġ= Ġe Org . Sym !!. Org ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Vertex : ĠGL U vertex Ġ= ĠGL U vertex () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMake Vertex ( new Vertex , Ġe New Sym , Ġe New . Org Ġ?: Ġerror (" e New . Org Ġ== Ġnull ") Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġe New Sym . L face Ġ= Ġe Org . L face ĊĠĠĠĠĠĠĠ Ġe New . L face Ġ= Ġe New Sym . L face ĊĠĠĠĠĠĠĠ Ġreturn Ġe New ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Split Edge ( Ġe Org Ġ) Ġsplits Ġe Org Ġinto Ġtwo Ġedges Ġe Org Ġand Ġe New , Ċ Ġ* Ġsuch Ġthat Ġe New Ġ== Ġe Org . L next . Ġ ĠThe Ġnew Ġvertex Ġis Ġe Org . Sym . Org Ġ== Ġe New . Org . Ċ Ġ* Ġe Org Ġand Ġe New Ġwill Ġhave Ġthe Ġsame Ġleft Ġface . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Split Edge ( e Org : ĠGL U half Edge ): ĠGL U half Edge Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe New : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġtemp Half Edge : ĠGL U half Edge Ġ= Ġ__ gl _ mesh Add Edge Vertex ( e Org ) ĊĠĠĠĠĠĠĠ Ġe New Ġ= Ġtemp Half Edge . Sym Ġ?: Ġerror (" temp Half Edge . Sym Ġ== Ġnull ") ĊĊĠĠĠĠĠĠĠ Ġ/* ĠDis connect Ġe Org Ġfrom Ġe Org . Sym . Org Ġand Ġconnect Ġit Ġto Ġe New . Org Ġ*/ ĊĠĠĠĠĠĠĠ ĠSp lice ( e Org . Sym Ġ?: Ġerror (" e Org . sym Ġ== Ġnull "), Ġe Org . Sym ?. Sym ?. L next Ġ?: Ġerror (" e Org . Sym . Sym . L next Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ ĠSp lice ( e Org . Sym Ġ?: Ġerror (" e Org . Sym Ġ== Ġnull "), Ġe New ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĠSet Ġthe Ġvertex Ġand Ġface Ġinformation Ġ*/ ĊĠĠĠĠĠĠĠ Ġe Org . Sym ?. Org Ġ= Ġe New . Org ĊĠĠĠĠĠĠĠ Ġe New . Sym ?. Org ?. an Edge Ġ= Ġe New . Sym Ġ/* Ġmay Ġhave Ġpointed Ġto Ġe Org . Sym Ġ*/ ĊĠĠĠĠĠĠĠ Ġe New . Sym ?. L face Ġ= Ġe Org . Sym ?. L face Ġ?: Ġerror (" e Org . Sym . L Face Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġe New . wind ing Ġ= Ġe Org . wind ing Ġ/* Ġcopy Ġold Ġwind ing Ġinformation Ġ*/ ĊĠĠĠĠĠĠĠ Ġe New . Sym !!. wind ing Ġ= Ġe Org . Sym ?. wind ing Ġ?: Ġerror (" e Org . Sym . window Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġreturn Ġe New ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Connect ( Ġe Org , Ġe Dst Ġ) Ġcreates Ġa Ġnew Ġedge Ġfrom Ġe Org . Sym . Org Ċ Ġ* Ġto Ġe Dst . Org , Ġand Ġreturns Ġthe Ġcorresponding Ġhalf - edge Ġe New . Ċ Ġ* ĠIf Ġe Org . L face Ġ== Ġe Dst . L face , Ġthis Ġsplits Ġone Ġloop Ġinto Ġtwo , Ċ Ġ* Ġand Ġthe Ġnewly Ġcreated Ġloop Ġis Ġe New . L face . Ġ ĠOtherwise , Ġtwo Ġdis joint Ċ Ġ* Ġloops Ġare Ġmerged Ġinto Ġone , Ġand Ġthe Ġloop Ġe Dst . L face Ġis Ġdestroyed . Ċ Ġ* Ċ Ġ* ĠIf Ġ( e Org Ġ== Ġe Dst ), Ġthe Ġnew Ġface Ġwill Ġhave Ġonly Ġtwo Ġedges . Ċ Ġ* ĠIf Ġ( e Org . L next Ġ== Ġe Dst ), Ġthe Ġold Ġface Ġis Ġreduced Ġto Ġa Ġsingle Ġedge . Ċ Ġ* ĠIf Ġ( e Org . L next . L next Ġ== Ġe Dst ), Ġthe Ġold Ġface Ġis Ġreduced Ġto Ġtwo Ġedges . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Connect ( ĊĠĠĠĠĠĠĠ Ġe Org : ĠGL U half Edge , ĊĠĠĠĠĠĠĠ Ġe Dst : ĠGL U half Edge ĊĠĠĠ Ġ): ĠGL U half Edge Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe New Sym : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġvar Ġjoining Lo ops Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġe New : ĠGL U half Edge Ġ= ĠMake Edge ( e Org ) ĊĠĠĠĠĠĠĠ Ġe New Sym Ġ= Ġe New . Sym Ġ?: Ġerror (" e New . Sym Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġif Ġ( e Dst . L face Ġ!== Ġe Org . L face ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġare Ġconnecting Ġtwo Ġdis joint Ġloops Ġ-- Ġdestroy Ġe Dst . L face Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoining Lo ops Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKill Face ( e Dst . L face Ġ?: Ġerror (" e Dst . L face Ġ== Ġnull "), Ġe Org . L face ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠConnect Ġthe Ġnew Ġedge Ġappropriately Ġ*/ ĊĠĠĠĠĠĠĠ ĠSp lice ( e New , Ġe Org . L next Ġ?: Ġerror (" e Org . L next Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ ĠSp lice ( e New Sym , Ġe Dst ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĠSet Ġthe Ġvertex Ġand Ġface Ġinformation Ġ*/ ĊĠĠĠĠĠĠĠ Ġe New . Org Ġ= Ġe Org . Sym ?. Org ĊĠĠĠĠĠĠĠ Ġe New Sym . Org Ġ= Ġe Dst . Org ĊĠĠĠĠĠĠĠ Ġe New Sym . L face Ġ= Ġe Org . L face ĊĠĠĠĠĠĠĠ Ġe New . L face Ġ= Ġe New Sym . L face ĊĊĠĠĠĠĠĠĠ Ġ/* ĠMake Ġsure Ġthe Ġold Ġface Ġpoints Ġto Ġa Ġvalid Ġhalf - edge Ġ*/ ĊĠĠĠĠĠĠĠ Ġe Org . L face !!. an Edge Ġ= Ġe New Sym ĊĠĠĠĠĠĠĠ Ġif Ġ(! join ing Lo ops ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Face : ĠGL U face Ġ= ĠGL U face () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġsplit Ġone Ġloop Ġinto Ġtwo Ġ-- Ġthe Ġnew Ġloop Ġis Ġe New . L face Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMake Face ( new Face , Ġe New , Ġe Org . L face ?: error (" e Org . L face Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġe New ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ **************** **** ĠOther ĠOperations Ġ Ġ*/ Ġ/* Ġ__ gl _ mesh Z ap Face ( Ġf Z ap Ġ) Ġdest ro ys Ġa Ġface Ġand Ġremoves Ġit Ġfrom Ġthe Ċ Ġ* Ġglobal Ġface Ġlist . Ġ ĠAll Ġedges Ġof Ġf Z ap Ġwill Ġhave Ġa Ġnull Ġpointer Ġas Ġtheir Ċ Ġ* Ġleft Ġface . Ġ ĠAny Ġedges Ġwhich Ġalso Ġhave Ġa Ġnull Ġpointer Ġas Ġtheir Ġright Ġface Ċ Ġ* Ġare Ġdeleted Ġentirely Ġ( along Ġwith Ġany Ġisolated Ġvertices Ġthis Ġproduces ). Ċ Ġ* ĠAn Ġentire Ġmesh Ġcan Ġbe Ġdeleted Ġby Ġz apping Ġits Ġfaces , Ġone Ġat Ġa Ġtime , Ċ Ġ* Ġin Ġany Ġorder . Ġ ĠZ apped Ġfaces Ġcannot Ġbe Ġused Ġin Ġfurther Ġmesh Ġoperations ! Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Z ap Face ( f Z ap : ĠGL U face ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Start : ĠGL U half Edge Ġ= Ġf Z ap . an Edge Ġ?: Ġerror (" f Z ap . an Edge Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġvar Ġe Next : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġvar Ġe Sym : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġf Prev : ĠGL U face ĊĠĠĠĠĠĠĠ Ġval Ġf Next : ĠGL U face ĊĊĠĠĠĠĠĠĠ Ġ/* Ġwalk Ġaround Ġface , Ġdeleting Ġedges Ġwhose Ġright Ġface Ġis Ġalso Ġnull Ġ*/ ĊĠĠĠĠĠĠĠ Ġe Next Ġ= Ġe Start . L next Ġ?: Ġerror (" e Start . L next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe Next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Next Ġ= Ġe . L next Ġ?: Ġerror ( e . L next Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . L face Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . Sym !!. L face Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġdelete Ġthe Ġedge Ġ-- Ġsee Ġ__ gl _ Mesh Delete Ġabove Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . On ext Ġ=== Ġe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKill Vertex ( e . Org Ġ?: Ġerror (" e . Org Ġ== Ġnull "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠMake Ġsure Ġthat Ġe . Org Ġpoints Ġto Ġa Ġvalid Ġhalf - edge Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . Org !!. an Edge Ġ= Ġe . On ext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp lice ( e , Ġe . Sym ?. L next Ġ?: Ġerror (" e . Sym . L next Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Sym Ġ= Ġe . Sym Ġ?: Ġerror (" e . Sym Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Sym . On ext Ġ=== Ġe Sym ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKill Vertex ( e Sym . Org Ġ?: Ġerror (" e Sym . Org Ġ== Ġnull "), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠMake Ġsure Ġthat Ġe Sym . Org Ġpoints Ġto Ġa Ġvalid Ġhalf - edge Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Sym . Org !!. an Edge Ġ= Ġe Sym . On ext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp lice ( e Sym , Ġe Sym . Sym ?. L next Ġ?: Ġerror (" e Sym . Sym . L next Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKill Edge ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġe Start ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġdelete Ġfrom Ġcircular Ġdoub ly - linked Ġlist Ġ*/ ĊĠĠĠĠĠĠĠ Ġf Prev Ġ= Ġf Z ap . prev Ġ?: Ġerror (" f Z ap . prev Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġf Next Ġ= Ġf Z ap . next Ġ?: Ġerror (" f Z ap . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġf Next . prev Ġ= Ġf Prev ĊĠĠĠĠĠĠĠ Ġf Prev . next Ġ= Ġf Next ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh New Mesh () Ġcreates Ġa Ġnew Ġmesh Ġwith Ġno Ġedges , Ġno Ġvertices , Ċ Ġ* Ġand Ġno Ġloops Ġ( what Ġwe Ġusually Ġcall Ġa Ġ" face "). Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh New Mesh (): ĠGL U mesh Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġval Ġf : ĠGL U face ĊĠĠĠĠĠĠĠ Ġval Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġe Sym : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġval Ġmesh : ĠGL U mesh Ġ= ĠGL U mesh () ĊĠĠĠĠĠĠĠ Ġv Ġ= Ġmesh . v Head ĊĠĠĠĠĠĠĠ Ġf Ġ= Ġmesh . f Head ĊĠĠĠĠĠĠĠ Ġe Ġ= Ġmesh . e Head ĊĠĠĠĠĠĠĠ Ġe Sym Ġ= Ġmesh . e Head Sym ĊĠĠĠĠĠĠĠ Ġv . prev Ġ= Ġv ĊĠĠĠĠĠĠĠ Ġv . next Ġ= Ġv . prev ĊĠĠĠĠĠĠĠ Ġv . an Edge Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġv . data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf . prev Ġ= Ġf ĊĠĠĠĠĠĠĠ Ġf . next Ġ= Ġf . prev ĊĠĠĠĠĠĠĠ Ġf . an Edge Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf . data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf . trail Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf . marked Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġf . inside Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġe . next Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe . Sym Ġ= Ġe Sym ĊĠĠĠĠĠĠĠ Ġe . On ext Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe . L next Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe . Org Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe . L face Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe . wind ing Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġe . active Region Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . next Ġ= Ġe Sym ĊĠĠĠĠĠĠĠ Ġe Sym . Sym Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe Sym . On ext Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . L next Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . Org Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . L face Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġe Sym . wind ing Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġe Sym . active Region Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġmesh ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Union ( Ġmesh 1 , Ġmesh 2 Ġ) Ġforms Ġthe Ġunion Ġof Ġall Ġstructures Ġin Ċ Ġ* Ġboth Ġmeshes , Ġand Ġreturns Ġthe Ġnew Ġmesh Ġ( the Ġold Ġmeshes Ġare Ġdestroyed ). Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Union ( ĊĠĠĠĠĠĠĠ Ġmesh 1 : ĠGL U mesh , ĊĠĠĠĠĠĠĠ Ġmesh 2 : ĠGL U mesh ĊĠĠĠ Ġ): ĠGL U mesh Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf 1 : ĠGL U face Ġ= Ġmesh 1 . f Head ĊĠĠĠĠĠĠĠ Ġval Ġv 1 : ĠGL U vertex Ġ= Ġmesh 1 . v Head ĊĠĠĠĠĠĠĠ Ġval Ġe 1 : ĠGL U half Edge Ġ= Ġmesh 1 . e Head ĊĠĠĠĠĠĠĠ Ġval Ġf 2 : ĠGL U face Ġ= Ġmesh 2 . f Head ĊĠĠĠĠĠĠĠ Ġval Ġv 2 : ĠGL U vertex Ġ= Ġmesh 2 . v Head ĊĠĠĠĠĠĠĠ Ġval Ġe 2 : ĠGL U half Edge Ġ= Ġmesh 2 . e Head ĊĊĠĠĠĠĠĠĠ Ġ/* ĠAdd Ġthe Ġfaces , Ġvertices , Ġand Ġedges Ġof Ġmesh 2 Ġto Ġthose Ġof Ġmesh 1 Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( f 2 . next Ġ!== Ġf 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 . prev !!. next Ġ= Ġf 2 . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 2 . next !!. prev Ġ= Ġf 1 . prev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 2 . prev !!. next Ġ= Ġf 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 . prev Ġ= Ġf 2 . prev ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( v 2 . next Ġ!== Ġv 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 . prev !!. next Ġ= Ġv 2 . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 . next !!. prev Ġ= Ġv 1 . prev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 . prev !!. next Ġ= Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 . prev Ġ= Ġv 2 . prev ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( e 2 . next Ġ!== Ġe 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 1 . Sym !!. next !!. Sym !!. next Ġ= Ġe 2 . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 2 . next !!. Sym !!. next Ġ= Ġe 1 . Sym !!. next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 2 . Sym !!. next !!. Sym !!. next Ġ= Ġe 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 1 . Sym !!. next Ġ= Ġe 2 !!. Sym !!. next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmesh 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Delete Mesh ( Ġmesh Ġ) Ġwill Ġfree Ġall Ġstorage Ġfor Ġany Ġvalid Ġmesh . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Delete Mesh Z ap ( mesh : ĠGL U mesh ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf Head : ĠGL U face Ġ= Ġmesh . f Head ĊĠĠĠĠĠĠĠ Ġwhile Ġ( f Head . next Ġ!== Ġf Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ__ gl _ mesh Z ap Face ( f Head . next Ġ?: Ġerror (" f Head . next Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( mesh . v Head . next Ġ=== Ġmesh . v Head ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Delete Mesh ( Ġmesh Ġ) Ġwill Ġfree Ġall Ġstorage Ġfor Ġany Ġvalid Ġmesh . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Delete Mesh ( mesh : ĠGL U mesh ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġf : ĠGL U face ĊĠĠĠĠĠĠĠ Ġvar Ġf Next : ĠGL U face ĊĠĠĠĠĠĠĠ Ġvar Ġv : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġvar Ġv Next : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġvar Ġe Next : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġf Ġ= Ġmesh . f Head . next Ġ?: Ġerror (" mesh . f Head . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġwhile Ġ( f Ġ!== Ġmesh . f Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Next Ġ= Ġf . next Ġ?: Ġerror (" f . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= Ġf Next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġv Ġ= Ġmesh . v Head . next Ġ?: Ġerror (" mesh . v Head . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġwhile Ġ( v Ġ!== Ġmesh . v Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Next Ġ= Ġv . next Ġ?: Ġerror (" v . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ= Ġv Next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġe Ġ= Ġmesh . e Head . next Ġ?: Ġerror (" mesh . e Head . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġwhile Ġ( e Ġ!== Ġmesh . e Head ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠOne Ġcall Ġfre es Ġboth Ġe Ġand Ġe . Sym Ġ( see ĠEdge Pair Ġabove ) Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Next Ġ= Ġe . next Ġ?: Ġerror (" e . next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe Next ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ__ gl _ mesh Check Mesh ( Ġmesh Ġ) Ġchecks Ġa Ġmesh Ġfor Ġself - consistency . Ċ Ġ*/ ĊĠĠĠ Ġfun Ġ__ gl _ mesh Check Mesh ( mesh : ĠGL U mesh ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf Head : ĠGL U face Ġ= Ġmesh . f Head ĊĠĠĠĠĠĠĠ Ġval Ġv Head : ĠGL U vertex Ġ= Ġmesh . v Head ĊĠĠĠĠĠĠĠ Ġval Ġe Head : ĠGL U half Edge Ġ= Ġmesh . e Head ĊĠĠĠĠĠĠĠ Ġvar Ġf : ĠGL U face ĊĠĠĠĠĠĠĠ Ġvar Ġf Prev : ĠGL U face ĊĠĠĠĠĠĠĠ Ġvar Ġv : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġvar Ġv Prev : ĠGL U vertex ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġvar Ġe Prev : ĠGL U half Edge ĊĠĠĠĠĠĠĠ Ġf Prev Ġ= Ġf Head ĊĠĠĠĠĠĠĠ Ġf Prev Ġ= Ġf Head ĊĠĠĠĠĠĠĠ Ġwhile Ġ( f Prev . next . also Ġ{ Ġf Ġ= Ġit ?: error (" it Ġ== Ġnull ") Ġ} Ġ!== Ġf Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( f . prev Ġ=== Ġf Prev ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġf . an Edge Ġ?: Ġerror (" f . an Edge Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym Ġ!== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym !!. Sym Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . L next !!. On ext !!. Sym Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . On ext !!. Sym !!. L next Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . L face Ġ=== Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . L next Ġ?: Ġerror (" error Ġe . L next Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġf . an Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Prev Ġ= Ġf ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( f . prev Ġ=== Ġf Prev Ġ&& Ġf . an Edge Ġ== Ġnull Ġ&& Ġf . data Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġv Prev Ġ= Ġv Head ĊĠĠĠĠĠĠĠ Ġv Prev Ġ= Ġv Head ĊĠĠĠĠĠĠĠ Ġwhile Ġ( v Prev . next . also Ġ{ Ġv Ġ= Ġit Ġ?: Ġerror (" it Ġ== Ġnull ") Ġ} Ġ!== Ġv Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( v . prev Ġ=== Ġv Prev ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġv . an Edge Ġ?: Ġerror (" v . an Edge Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym Ġ!== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym !!. Sym Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . L next !!. On ext !!. Sym Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . On ext !!. Sym !!. L next Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Org Ġ=== Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . On ext Ġ?: Ġerror (" e . On ext Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( e Ġ!== Ġv . an Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Prev Ġ= Ġv ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( v . prev Ġ=== Ġv Prev Ġ&& Ġv . an Edge Ġ== Ġnull Ġ&& Ġv . data Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġe Prev Ġ= Ġe Head ĊĠĠĠĠĠĠĠ Ġe Prev Ġ= Ġe Head ĊĠĠĠĠĠĠĠ Ġwhile Ġ( e Prev . next . also Ġ{ Ġe Ġ= Ġit ?: error (" it Ġ== Ġnull ") Ġ} Ġ!== Ġe Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym !!. next Ġ=== Ġe Prev . Sym ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym Ġ!== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym !!. Sym Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Org Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . Sym !!. Org Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . L next !!. On ext !!. Sym Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e . On ext !!. Sym !!. L next Ġ=== Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Prev Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( e . Sym !!. next Ġ=== Ġe Prev . Sym Ġ&& Ġe . Sym Ġ=== Ġmesh . e Head Sym Ġ&& Ġe . Sym !!. Sym Ġ=== Ġe Ġ&& Ġe . Org Ġ== Ġnull Ġ&& Ġe . Sym !!. Org Ġ== Ġnull Ġ&& Ġe . L face Ġ== Ġnull Ġ&& Ġe . Sym !!. L face Ġ== Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ