code wiki / (root) / nx_uv_chart_topology_candidate_t280.nx

nx_uv_chart_topology_candidate_t280.nx source

↩ module page · 46 lines · 2089 B

1import "nx_nxa_corner_prepare_candidate_t280.nx" 2// Topological measurements from the existing chart adjacency. Euler consistency 3// is not a proof of a disk: vertex-link manifold validation remains separate. 4const UCT_ROW:i64=8 5func uct_measure(m:*i64)->*i64{ 6 if m==(0 as *i64){return 0 as *i64};if uv_stage(m)<UV_ST_CHARTS{return 0 as *i64} 7 let nc:i64=uv_chart_count(m);let nv:i64=m[UV_H_NUV] 8 let rows:*i64=sys_mmap_try(nc*UCT_ROW*UV_I64) as *i64 9 let work:*i64=sys_mmap_try(nv*2*UV_I64) as *i64 10 if (rows as i64)<=0{if (work as i64)>0{sys_munmap_direct(work as *u8,nv*2*UV_I64)};return 0 as *i64} 11 if (work as i64)<=0{sys_munmap_direct(rows as *u8,nc*UCT_ROW*UV_I64);return 0 as *i64} 12 var i:i64=0 13 while i<nv{work[i]=i;let ch:i64=m[m[UV_O_UVCH]+i];rows[ch*UCT_ROW]=rows[ch*UCT_ROW]+1;i=i+1} 14 var t:i64=0 15 while t<m[UV_H_NT]{ 16 let ch:i64=uv_chart_of_tri(m,t);let r:i64=ch*UCT_ROW;rows[r+2]=rows[r+2]+1 17 var k:i64=0;while k<3{ 18 let a:i64=uv_ti(m,t,k);let b:i64=uv_ti(m,t,(k+1)%3) 19 let edge:i64=uvi_edge_find(m,a,b) 20 if edge<0{sys_munmap_direct(work as *u8,nv*2*UV_I64);sys_munmap_direct(rows as *u8,nc*UCT_ROW*UV_I64);return 0 as *i64} 21 let eo:i64=m[UV_O_ETAB]+edge*UV_EREC 22 var nb:i64=m[eo+UV_ED_T0]-1;if nb==t{nb=m[eo+UV_ED_T1]-1} 23 var inside:i64=0;if nb>=0{if uv_chart_of_tri(m,nb)==ch{if uv_is_seam(m,a,b)==0{inside=1}}} 24 if inside==1{if t<nb{rows[r+1]=rows[r+1]+1}}else{ 25 rows[r+1]=rows[r+1]+1;rows[r+3]=rows[r+3]+1 26 let ca:i64=uv_corner_class(m,t,k);let cb:i64=uv_corner_class(m,t,(k+1)%3) 27 work[nv+ca]=work[nv+ca]+1;work[nv+cb]=work[nv+cb]+1;uvi_union(work,0,ca,cb) 28 } 29 k=k+1 30 };t=t+1 31 } 32 i=0;while i<nv{ 33 if work[nv+i]>0{ 34 let ch:i64=m[m[UV_O_UVCH]+i];let r:i64=ch*UCT_ROW 35 if work[nv+i]!=2{rows[r+5]=rows[r+5]+1} 36 if uvi_find(work,0,i)==i{rows[r+4]=rows[r+4]+1} 37 };i=i+1 38 } 39 i=0;while i<nc{ 40 let r:i64=i*UCT_ROW;rows[r+6]=rows[r]-rows[r+1]+rows[r+2];rows[r+7]=0-1 41 let twice:i64=2-rows[r+4]-rows[r+6] 42 if rows[r+5]==0{if twice>=0{if twice%2==0{rows[r+7]=twice/2}}} 43 i=i+1 44 } 45 sys_munmap_direct(work as *u8,nv*2*UV_I64);return rows 46}