code wiki / (root) / nx_uv_planar_subdivision_gate_t280.nx

nx_uv_planar_subdivision_gate_t280.nx source

↩ module page · 34 lines · 3070 B

1import "nx_uv_harmonic_candidate_t280.nx" 2import "nx_gate_verdict.nx" 3func pg_mesh(n:i64)->*i64{ 4 if n<1{return 0 as *i64};if n>UV_ABC_MAX{return 0 as *i64} 5 let side:i64=n+1;let m:*i64=ncp_model_new(side*side,n*n*2);if m==(0 as *i64){return m} 6 var y:i64=0;while y<=n{var x:i64=0;while x<=n{uv_set_vert(m,y*side+x,x*1000,y*1000,0);x=x+1};y=y+1} 7 var t:i64=0;y=0;while y<n{var x:i64=0;while x<n{let a:i64=y*side+x;uv_set_tri(m,t,a,a+1,a+side+1);uv_set_tri(m,t+1,a,a+side+1,a+side);t=t+2;x=x+1};y=y+1} 8 if uv_chart_build(m)!=UV_OK{ncp_model_free(m);return 0 as *i64};return m 9} 10func pg_num(s:*u8)->i64{var i:i64=0;var v:i64=0;while s[i]!=(0 as u8){let d:i64=(s[i] as i64)-48;if d<0{return 0};if d>9{return 0};if v>(NCP_MAX-d)/10{return 0};v=v*10+d;i=i+1};return v} 11func main(argc:i64,argv:*i64)->i64{ 12 if argc!=3{return 2};let maxn:i64=pg_num(argv[1] as *u8);let budget:i64=pg_num(argv[2] as *u8);if maxn<1{return 2};if budget<1{return 2} 13 let ctr:*i64=gv_ctr();var n:i64=1 14 while n<=maxn{ 15 let m:*i64=pg_mesh(n);if m==(0 as *i64){return 3};let q:*i64=uds_prepare(m);if q==(0 as *i64){return 4} 16 let s:*UvGramSolve=ulh_begin(m,q,0,0.00000001);if s==(0 as *UvGramSolve){return 5};var rc:i64=s.result 17 if rc==UV_E_NOTRUN{let cancel:*i64=sys_mmap_try(8) as *i64;cancel[0]=1;let before:i64=s.matvecs 18 gv_check_eq("cancelled step reports cancellation",uls_step_controlled(s,budget,cancel),ULS_CANCELLED,ctr) 19 gv_check_eq("cancellation performs no matrix work",s.matvecs,before,ctr) 20 gv_check_eq("cancellation preserves resumable state",s.result,UV_E_NOTRUN,ctr) 21 cancel[0]=0;rc=uls_step_controlled(s,budget,cancel);sys_munmap_direct(cancel as *u8,8) 22 } 23 gv_puts("PLANAR subdivisions=");gv_num(n);gv_puts(" faces=");gv_num(s.nt);gv_puts(" iterations=");gv_num(s.iterations);gv_puts("\n") 24 gv_check_eq("subdivided planar solve converges",rc,UV_OK,ctr);if rc!=UV_OK{return 6} 25 var t:i64=0;var neg:i64=0;var zero:i64=0;var minarea:f64=0.0 26 while t<s.nt{let a:i64=s.corners[t*3];let b:i64=s.corners[t*3+1];let c:i64=s.corners[t*3+2];let area:f64=(s.x[b]-s.x[a])*(s.x[s.n+c]-s.x[s.n+a])-(s.x[s.n+b]-s.x[s.n+a])*(s.x[c]-s.x[a]);if area<0.0{neg=neg+1};if area==0.0{zero=zero+1};if area>0.0{if minarea==0.0{minarea=area};if area<minarea{minarea=area}};t=t+1} 27 gv_check_eq("planar raw float folds",neg,0,ctr);gv_check_eq("planar raw float collapsed triangles",zero,0,ctr) 28 gv_puts("PLANAR minAreaRawF64Bits=");let bits:*i64=(&minarea) as *i64;gv_num(bits[0]);gv_puts("\n") 29 gv_check_eq("planar coordinates exported",uls_export(s),UV_OK,ctr);uls_free(s) 30 gv_check_eq("planar atlas packs",uvi_atlas(m),UV_OK,ctr);m[UV_H_STAGE]=UV_ST_SOLVED;gv_check_eq("planar quantized atlas distortion gate",uv_distortion(m),UV_OK,ctr) 31 gv_check_eq("planar quantized collapsed triangles",uv_uvdegen(m),0,ctr);gv_check_eq("planar quantized folded triangles",uv_flipped(m),0,ctr) 32 ncp_model_free(q);ncp_model_free(m);if n>maxn/2{break};n=n*2 33 };return gv_verdict("UV-PLANAR-SUBDIVISION-T280",ctr,"Planar conditioning/quantization controls only; resident mapping remains separate") 34}