; docformat = 'rst' ; ; NAME: ; VER_EDGES ; PURPOSE: ; Create a lookup table of the relation facets-edges in a 3-D shape ; model made of triangles ;+ ; :Description: ; Create a lookup table of the relation facets-edges in a 3-D shape ; model made of triangles ; ; :Categories: ; Disk I/O, Shape Models ; ; :Params: ; MODEL: in, required, type=structure ; A structure containing a 3-D shape model, following the ; convention set in READVER routine. ; ; :Returns: A structure containing the edge-facet links. Fields are:: ; .N: Number of edges ; .vertex: Array of vertex per edge ; .facet: Array of facets per edge ; .edge: Array of edges per facet ; ; :Examples: ; ; :Uses: ; ; :Author: ; B.Carry (IMCCE) ; ; :History: ; Change History:: ; Original Version written in 2013, B. Carry (IMCCE) ; 2013 Nov. - B.Carry (IMCCE) - Output structure modified ;- function ver_edges, model ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- I -- Initialization And Input Verification -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; COMPILE_OPT hidden ;--I.1-- Nunber of Edges and Output Arrays -------------------------------------- nbEdge = model.vertex.n + model.facet.n - 2 facetEdge=intarr( model.facet.n, 3 )-1 edgeArr = lonarr( nbEdge, 4)-1 ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- II -- List of Vertex per Facet -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; facetVertex = fltarr( 3, model.facet.n ) for kFacet=0L, model.facet.n-1L do begin list_of_vertex = model.facet.con( 4*kFacet+1:4*kFacet+3 ) facetVertex(0:2, kFacet) = list_of_vertex( sort(list_of_vertex) ) endfor ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- III -- Facets and Vertex per Edge -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--III.1-- For each Facet --------------------------------------------------------- kEdge=0L for kFacet=0L, model.facet.n-1L do begin ;--III.2-- For each Edge not Determined Yet --------------------------------------- undSide = where( facetEdge(kFacet,*) eq -1, nbUnd, com=defSide, ncom=nbDef) for kSide=0, nbUnd-1 do begin ;--III.3-- Find Vertex Pair for Current Side -------------------------------------- curInd = [undSide(kSide), ((undSide(kSide)+1) mod 3)] doublet = facetVertex(curInd,kFacet) doublet = doublet(sort(doublet)) ;--III.4-- Search Adjacent Facet -------------------------------------------------- ;-SLOW - Search for faster loop: only adjacent facet ;------ eg: those with common vertex ;- those with nearby barycenter for kOther=0L, model.facet.n-1 do $ if kOther ne kFacet then begin for kOS=0,2 do begin othInd = [kOS, ((kOS+1) mod 3)] pair = facetVertex(othInd,kOther) pair = pair(sort(pair)) testValue = total(abs(doublet-pair)) if testValue eq 0 then begin facetEdge(kFacet,undSide(kSide)) = kEdge facetEdge(kOther,kOS) = kEdge edgeArr(kEdge,0:1) = doublet edgeArr(kEdge,2:3) = [kFacet, kOther] kEdge++ goto, j2Side endif endfor endif j2Side: endfor endfor edges={ n: nbEdge, $ ;-Number of edges vertex: edgeArr(*,0:1), $ ;-Vertexes per edge facet: edgeArr(*,2:3), $ ;-Facets per edge edge: facetEdge } ;-Edges per face return, edges end