nx_uv_stretch_gate_t281.nx source
↩ module page · 17 lines · 1926 B
1import "nx_uv_stretch_candidate_t281.nx"
2import "nx_gate_verdict.nx"
3func main()->i64{
4 let ctr:*i64=gv_ctr();let m:*i64=ncp_model_new(5,4)
5 uv_set_vert(m,0,0,0,0);uv_set_vert(m,1,1000,0,0);uv_set_vert(m,2,1000,1000,0);uv_set_vert(m,3,0,1000,0);uv_set_vert(m,4,500,500,0)
6 uv_set_tri(m,0,0,1,4);uv_set_tri(m,1,1,2,4);uv_set_tri(m,2,2,3,4);uv_set_tri(m,3,3,0,4);gv_check_eq("fixture charts",uv_chart_build(m),UV_OK,ctr)
7 let s:*UvGramSolve=uls_begin(m,0,0.00000001);if s==(0 as *UvGramSolve){return 2};s.result=UV_OK;var i:i64=0;var center:i64=0
8 while i<s.n{let v:i64=m[m[UV_O_UVSRC]+s.classes[i]];s.x[i]=__f64_from_i64(uv_vx(m,v));s.x[s.n+i]=__f64_from_i64(uv_vy(m,v));if v==4{center=i};i=i+1}
9 let q:*UvStretch=ust_begin(s);gv_check_eq("isometric context",q!=(0 as *UvStretch),1,ctr);if q==(0 as *UvStretch){return 3}
10 gv_check_eq("isometric energy equals four times area",ust_abs(q.energy-4000000.0)<0.000001,1,ctr)
11 s.x[center]=300.0;s.x[s.n+center]=400.0;let before:f64=ust_energy(q)
12 let cancel:*i64=sys_mmap_try(8) as *i64;cancel[0]=1;gv_check_eq("cancel returns before updates",ust_step(q,10,16,cancel),ULS_CANCELLED,ctr);gv_check_eq("cancel updates none",q.accepted,0,ctr);cancel[0]=0
13 gv_check_eq("refinement runs",ust_step(q,10,16,cancel),UV_OK,ctr);gv_check_eq("distorted planar energy improves",q.energy<before,1,ctr);gv_check_eq("positive faces retained",q.energy>0.0,1,ctr)
14 gv_check_eq("budget remains exact",q.sweeps,10,ctr);gv_check_eq("invalid budget rejected",ust_step(q,0,16,cancel),UV_E_ARGS,ctr)
15 ust_restore_scale(q);ust_free(q);sys_munmap_direct(cancel as *u8,8)
16 s.x[center]=2000.0;let bad:*UvStretch=ust_begin(s);gv_check_eq("folded initialization rejected",bad==(0 as *UvStretch),1,ctr);if bad!=(0 as *UvStretch){ust_free(bad)}
17 uls_free(s);ncp_model_free(m);return gv_verdict("UV-STRETCH-T281",ctr,"Native symmetric Dirichlet coordinate refinement; local orientation only, not atlas acceptance")
18}