From 600c39db9109d394e54c56b03b57ec554b47f794 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Sun, 30 Oct 2016 17:26:31 +0700 Subject: [PATCH] Don't consider arc center point for bounding box calculation. --- CHANGELOG.md | 2 + src/request.cpp | 5 ++ src/solvespace.cpp | 55 +++++++++++------- test/constraint/arc_line_tangent/normal.slvs | 2 +- .../curve_curve_tangent/arc_arc.slvs | 4 +- .../curve_curve_tangent/arc_cubic.slvs | 4 +- .../constraint/equal_line_arc_len/normal.slvs | 34 +++++------ test/constraint/pt_face_distance/normal.png | Bin 4275 -> 4296 bytes test/constraint/pt_face_distance/normal.slvs | 16 +++++ .../constraint/pt_face_distance/reference.png | Bin 4339 -> 4360 bytes .../pt_face_distance/reference.slvs | 16 +++++ test/constraint/pt_on_face/normal.png | Bin 4758 -> 4660 bytes test/constraint/pt_on_face/normal.slvs | 16 +++++ test/request/arc_of_circle/normal.slvs | 2 +- 14 files changed, 113 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c828b14..a0beb5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ New sketch features: boolean operation, to increase performance. * Translate and rotate groups can create n-dimensional arrays using the "difference" and "assembly" boolean operations. + * Irrelevant points (e.g. arc center point) are not counted when estimating + the bounding box used to compute chord tolerance. New export/import features: * Three.js: allow configuring projection for exported model, and initially diff --git a/src/request.cpp b/src/request.cpp index c0065ef..bfef176 100644 --- a/src/request.cpp +++ b/src/request.cpp @@ -108,6 +108,11 @@ void Request::Generate(IdList *entity, p.h = h.entity(i+((et != (Entity::Type)0) ? 1 : 0)); p.group = group; p.style = style; + if(type == Request::Type::ARC_OF_CIRCLE && i == 0) { + // mark arc center point as construction, since it shouldn't be included + // in bounding box calculation + p.construction = true; + } if(workplane.v == Entity::FREE_IN_3D.v) { p.type = Entity::Type::POINT_IN_3D; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 587ccaa..e4dc720 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -859,34 +859,49 @@ void Sketch::Clear() { BBox Sketch::CalculateEntityBBox(bool includingInvisible) { BBox box = {}; bool first = true; - for(int i = 0; i < entity.n; i++) { - Entity *e = (Entity *)&entity.elem[i]; - if(!(e->IsVisible() || includingInvisible)) continue; - - Vector point; - double r = 0.0; - if(e->IsPoint()) { - point = e->PointGetNum(); - } else { - switch(e->type) { - case Entity::Type::ARC_OF_CIRCLE: - case Entity::Type::CIRCLE: - r = e->CircleGetRadiusNum(); - point = GetEntity(e->point[0])->PointGetNum(); - break; - default: continue; - } - } + auto includePoint = [&](const Vector &point) { if(first) { box.minp = point; box.maxp = point; - box.Include(point, r); first = false; } else { - box.Include(point, r); + box.Include(point); + } + }; + + for(const Entity &e : entity) { + if(e.construction) continue; + if(!(includingInvisible || e.IsVisible())) continue; + + if(e.IsPoint()) { + includePoint(e.PointGetNum()); + continue; + } + + switch(e.type) { + // Circles and arcs are special cases. We calculate their bounds + // based on Bezier curve bounds. This is not exact for arcs, + // but the implementation is rather simple. + case Entity::Type::CIRCLE: + case Entity::Type::ARC_OF_CIRCLE: { + SBezierList sbl = {}; + e.GenerateBezierCurves(&sbl); + + for(const SBezier &sb : sbl.l) { + for(int j = 0; j <= sb.deg; j++) { + includePoint(sb.ctrl[j]); + } + } + sbl.Clear(); + continue; + } + + default: + continue; } } + return box; } diff --git a/test/constraint/arc_line_tangent/normal.slvs b/test/constraint/arc_line_tangent/normal.slvs index 86a7d82..2f92e3b 100644 --- a/test/constraint/arc_line_tangent/normal.slvs +++ b/test/constraint/arc_line_tangent/normal.slvs @@ -294,7 +294,7 @@ AddEntity Entity.h.v=00040001 Entity.type=2001 -Entity.construction=0 +Entity.construction=1 Entity.workplane.v=80020000 Entity.actPoint.x=-5.00000000000000000000 Entity.actPoint.y=10.00000000000000000000 diff --git a/test/constraint/curve_curve_tangent/arc_arc.slvs b/test/constraint/curve_curve_tangent/arc_arc.slvs index 995d11e..c18c342 100644 --- a/test/constraint/curve_curve_tangent/arc_arc.slvs +++ b/test/constraint/curve_curve_tangent/arc_arc.slvs @@ -279,7 +279,7 @@ AddEntity Entity.h.v=00040001 Entity.type=2001 -Entity.construction=0 +Entity.construction=1 Entity.workplane.v=80020000 Entity.actPoint.x=-5.00000000000000000000 Entity.actPoint.y=15.00000000000000000000 @@ -326,7 +326,7 @@ AddEntity Entity.h.v=00050001 Entity.type=2001 -Entity.construction=0 +Entity.construction=1 Entity.workplane.v=80020000 Entity.actPoint.x=-25.00000000000000000000 Entity.actPoint.y=15.00000000000000000000 diff --git a/test/constraint/curve_curve_tangent/arc_cubic.slvs b/test/constraint/curve_curve_tangent/arc_cubic.slvs index 554b38a..47ff668 100644 --- a/test/constraint/curve_curve_tangent/arc_cubic.slvs +++ b/test/constraint/curve_curve_tangent/arc_cubic.slvs @@ -314,7 +314,7 @@ AddEntity Entity.h.v=00040001 Entity.type=2001 -Entity.construction=0 +Entity.construction=1 Entity.workplane.v=80020000 Entity.actPoint.x=-5.00000000000000000000 Entity.actPoint.y=10.00000000000000000000 @@ -405,7 +405,7 @@ AddEntity Entity.h.v=00060001 Entity.type=2001 -Entity.construction=0 +Entity.construction=1 Entity.workplane.v=80020000 Entity.actPoint.x=10.00000000000000000000 Entity.actPoint.y=-5.00000000000000000000 diff --git a/test/constraint/equal_line_arc_len/normal.slvs b/test/constraint/equal_line_arc_len/normal.slvs index 733864b..c53cbc7 100644 --- a/test/constraint/equal_line_arc_len/normal.slvs +++ b/test/constraint/equal_line_arc_len/normal.slvs @@ -115,31 +115,31 @@ Param.val=-0.50000000000000000000 AddParam Param.h.v.=00040010 -Param.val=-4.99993226121819220000 +Param.val=-4.99993226121819223096 AddParam Param.h.v.=00040011 -Param.val=10.00006773878180900000 +Param.val=10.00006773878180865722 AddParam Param.h.v.=00040013 -Param.val=-9.99975209012342430000 +Param.val=-9.99975209012342425297 AddParam Param.h.v.=00040014 -Param.val=9.99968435134161740000 +Param.val=9.99968435134161737210 AddParam Param.h.v.=00040016 -Param.val=-5.00031564865838440000 +Param.val=-5.00031564865838440426 AddParam Param.h.v.=00040017 -Param.val=5.00024790987657660000 +Param.val=5.00024790987657663521 AddParam Param.h.v.=00050010 -Param.val=4.99990506249655910000 +Param.val=4.99990506249655908277 AddParam Param.h.v.=00050011 @@ -147,7 +147,7 @@ Param.val=5.00000000000000000000 AddParam Param.h.v.=00050013 -Param.val=12.85283693258537800000 +Param.val=12.85283693258537773829 AddParam Param.h.v.=00050014 @@ -271,10 +271,10 @@ AddEntity Entity.h.v=00040001 Entity.type=2001 -Entity.construction=0 +Entity.construction=1 Entity.workplane.v=80020000 -Entity.actPoint.x=-4.99993226121819220000 -Entity.actPoint.y=10.00006773878180900000 +Entity.actPoint.x=-4.99993226121819223096 +Entity.actPoint.y=10.00006773878180865722 Entity.actVisible=1 AddEntity @@ -282,8 +282,8 @@ Entity.h.v=00040002 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=-9.99975209012342430000 -Entity.actPoint.y=9.99968435134161740000 +Entity.actPoint.x=-9.99975209012342425297 +Entity.actPoint.y=9.99968435134161737210 Entity.actVisible=1 AddEntity @@ -291,8 +291,8 @@ Entity.h.v=00040003 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=-5.00031564865838440000 -Entity.actPoint.y=5.00024790987657660000 +Entity.actPoint.x=-5.00031564865838440426 +Entity.actPoint.y=5.00024790987657663521 Entity.actVisible=1 AddEntity @@ -318,7 +318,7 @@ Entity.h.v=00050001 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=4.99990506249655910000 +Entity.actPoint.x=4.99990506249655908277 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity @@ -327,7 +327,7 @@ Entity.h.v=00050002 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=12.85283693258537800000 +Entity.actPoint.x=12.85283693258537773829 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity diff --git a/test/constraint/pt_face_distance/normal.png b/test/constraint/pt_face_distance/normal.png index 7379577a843816a5cc26a62d485a649f6ea78215..7173202f9734bf87f71b79f75d3c9466c0c4c49b 100644 GIT binary patch literal 4296 zcmeHLX;f2Z8h#VQB8yOEt7TEFAc_#}j3R=i0$K!dp=?1Q6syhz2ri@&1cD0`Wyl=$ z2r9+{j&P6!5KmYoTttfqf;f_}hFFj&B%;QsfJx?}*7nBObNZv_%nyI$&rR<4z031H z&+{g8v;TTSy}5b-VCeI$*H!?0$n-~78-2ptk=qYo%=Gd4=DYoQ(t%}hmh0!H-@kOk z>Hc+BhNpw<^A$b%F%`S4T0ELsB0MrXM1Hf9A@-M>r=z;JP(3;ewJqBXt=K`YPJb1VN2@V#=2I{*?xFawWV1P{7%(3_+1`Y_LrjDy279f3hi(*k3= za)4`p)sM<9>AY&K$V)k&z~#v~)a0?S!AX9DaI)iG7^Sa^srSUPb?cr2f_Bh8VSJ|X zyU@C{_^SkdIMCj%qaj+x?)}jReGa3pxH98a8ZPimot{#0n zV1lVnm)0q955S2EO(!BQd@dbN{+qYh5L3bsDkrwf6QJ$-tUs)JR&?kkdvH01$zZxI zvc)`9tt;NQwt|2vJ8Rfpz*}4=Vq<5bC+0$a7$r<@4Di)uP3`<`E9n#W7?tk+B@rT^ofwiCM4cCKat2Sv7`_Z=PjlAc~S$D(R|=ktQDE z18sZxTHO~>L`%ty`9_Gk?UT{D*B{Qw zmUV=hGdiXRx4hQ(aO>UP+EZ56?UxlY(X;+wfxA*jV>;Dro3KsUB`q>y9pUOwg;)Q< z;qs?=%B*V<)jImDJE<m7|c#pwr>C|{bnKh1fd*Rx5O&^&( z-*WEoaIvD=3GdCbK2TETPi`P3jL#2>eE%ng~?_z1d=^77l!>?A2wkCcM} zZvuaH7CHEho2h3Dvt~FM_UHK?M#m~)b%^zHJ+~&C)Yn_w@rVyioq2z!NQrkA5l;@L zs_N+k#)%K6n~}KGw(0qxF|~oKG%rn^ldbsN-}{U_ zGEQ;O_b@l@!CaU4TNyekp3{$w@)m(=a&l7EU#+TF4L)6&9dE?#uIC4oVZP$ViFlQ_2N;*e=7$DZaI@HW3QR*4WvM+jy_LK@fElVE1D=e-e7 zmn%(1MpmmzJQ<8_ScyKnfKmY9d|RVvPPgcIlO9HE=#`V>X&{@Emo zbf}q$P7;0m#tCFiPoo+Wyhp;vEL5(b;-qEJub6w|wNNql7I@(x;*1sM_J}|uh|hdE zJ{UYbWe7g~P7<}Rl3PU`3}Rlh@2d=CLJ^135*2PsNbel1FR@P3p^tYhK;qt42o*S| zf*C;g(_vaPSA4e#vI-wwosXH#5`D*)s9n|Uf6#g2bBD_@wxL`|>bsNykei9k4Qos= zue|f0jNOjDassmJX!{qKughzZJ+J=+Cp80pgj>2W!}LQtd_8bL6_@nL1d!_=sNBalG4{Eh zUXDA-21XW?(>CmCTre#^Z)4(qRiCVkp6zW0S?kHtdr{kGE(MDWq<2|eC=d&$hv-I+ zWCsojL22g6a@K}_r#y3CSI+Hd(uZ!N99^9i^e^!U+iswd{ynwm`~l{GtHGtuQc*_I zw=-l@`^4SP}c2HwHOBj z(W#@c_jHpDbB3G9-UAL{_X2F!UYLet3?59DgjJlM43h2@xV)4CnD+*g&r!l{j4m{% zNV}(m4XK?*X#`fIstlR;vjMxvjfPKgtdMNOf%Eo$#5JpMFYUst3%7!sh-Q%%xSYkV zRLM|=yG{DtXzFS+PjSRZlEro>Lp(Ug^xdX}vXtY|HhbHr!Yc}Mas+E4l`8qOXSL4* z_X#at&Ylm5Kf3=VIRL}wU&%)NrljKjU@eebUxObD`7+ZE$R0z&LkSjfavJY zhU{n*lbd7O5LeoxI}f}-lwYvoq4aU0p+Kx$EZW-s1sZcd%1Paqd#%_3yx}E*Z#H36 ws5w-HZ34P!5gl@LaUXBLI?DgDm0qH9VV+=DZzFV~|4@LBx4&2ETJpjF0VBb^U;qFB literal 4275 zcmeHLc~nz(7QVa?z@#XVinzdt7DtaPaXhsu*q}feN{fRiAWL|Ph;3NvLL>+iG^hq2dP9A-P8O86_5$d&s0;*!^p(CuwrXUgeh2+_ruo zN#<@)Q;+!BW}m2T_La;8Sggr12SAr1RG9M_sso9WtN^3Olfh^{AK;3v2{>?Z1PqLc z>umfVy~OvvM;Zy+;4Z2u@oiCx3(E$15wYDZ;pz}Mub{WXg&dU`Bz3b+sHvEl?dHGz1bG%HM_v+h*l9s0$&q@sLrb^Kdvt zD?f6isy`Gk*9jw{v%7s)>d?PG)xTFOg*k;{f!qRM%O?G|X8rm_t9!bk-FJJIRt5P41+tO=xXET(pvD*7v@&nq8u-fO zHCA-2->EpO4b6scU!w=yBNIlveleE-bb8^62m`GHqgi3u<_Mtk*;=5+a}J$dwRWWr zzG3|Rfa_gbdO{mo3I5oA7NBb<$4uYebA0NC;RcLW*Jfp-M? zg9y^Ieh_euKp_w_hF#*+%|Q_ifjBdjbGrnj7Zb>&C{w#6Q8Q!sJESZ9*;C;bRdm-Z==o+h zUp7gdmLRgH^p!UrzA2Lkghi?cag3wYIAhP~(@r@Jt@EF&`@#imXjgt*WkVXOQD-Zj z*mZhPo*iF$hM^hBkJiNw_n_rhZ$^Bof8J}rFp|wj(P81|!HHYV7-!Bk{%4hU&KK&-G4re#$OQeY5mrma=km_{5$kiYe2K zOSg*DnnH17`wyu@f=#EWP5R;z@$K?nE4Le+!f^d6ZyHWkRyHezyY2-&bk@|1QnEel zFK_NrSmgd}xf+-mDl@}F*N)x|m^&h7+&w2yW#o@q`h7cQsu%J{TN|qy8>5v`j1gt` z{Ux!FB&iHv&8)gOT8esxyYu&h7Yg^3TV83zw;Rr0cE2JaE-+0fQ?{uzF>xvmv#6y- zvuEVMJZZwux2c9fmL9@QneYMa_dJsp@a5is&Y_TESa`X4NdRQ87QRGx)>*zms zr|ZGhM98o4#xx6rN-2Kj`mbsK>r)HHY0}u=oTcp^_sCwgA9?`B%AaUj0Q|DJ;8(u3 zg*L{?XOq!-OSG?h3_1SVAuz579 zR>^7LKGg>|idKY41Vcl;61m5dO%j2eCc6}Ay*$S)5vPx_VctUrMQOBdz4a@Xj%HOm z?*wd)oz{83VZLkkIVPWk)xLl7BkgQQ#@}aB-sGucBtJH;1;u_Wzd<8_C4|QPzJZdS z5}cUJ-PlOh5{J?P!TKpWKsSDuhCfpp_-WI9{00H=9yyZz zm`OQA2LIYB2{E@7{q0o;yrgeOLGJjr8yvc0F63y0y=OcDj3*X_w=6t=Fh93>4vQqr z6=a|<{v9-Bg$M`~yeZI6^RctMB%_Uu$IsV|#^cRpql=U0QsMeMK3h)DOEiJ~j%Y8p z$qGz81JL5MworCHpjH>M^ovr?P5tSIm{eM5Z}&q4hAJ$t#2+wE270#ZE`CP6xpB`uOH+XcC)Nwq;Dc2BILMbwq#fYit|-l$QKp4ijePKRN#ft?H3q8T6YC!c& z+bZ47pWNP^slN{a=`Tg`k^6r}VBdimK9x3RCFurWzwWMHY17IJtwYj4vj0sE$@D6B ztk`y5!i311g)wKojP3S&vHk}BWJ4?_^Y2f!_&==Q|8?6}ldl==-}x7AzZLOk1h_i8 KJLRrMzy1&4YODYN diff --git a/test/constraint/pt_face_distance/normal.slvs b/test/constraint/pt_face_distance/normal.slvs index 2e4195e..07f96ed 100644 --- a/test/constraint/pt_face_distance/normal.slvs +++ b/test/constraint/pt_face_distance/normal.slvs @@ -581,7 +581,9 @@ CCtrl 1 0.00000000000000000000 5.00000000000000000000 5.00000000000000000000 Wei CCtrl 2 0.00000000000000000000 0.00000000000000030616 5.00000000000000000000 Weight 1.00000000000000000000 CurvePt 1 0.00000000000000000000 5.00000000000000000000 0.00000000000000000000 CurvePt 0 0.00000000000000000000 4.64894150531215188948 1.84047354780936389673 +CurvePt 0 0.00000000000000000000 4.18497755609325672310 2.73604876692571252761 CurvePt 0 0.00000000000000000000 3.53553390593273775266 3.53553390593273775266 +CurvePt 0 0.00000000000000000000 2.73604876692571252761 4.18497755609325672310 CurvePt 0 0.00000000000000000000 1.84047354780936411878 4.64894150531215188948 CurvePt 1 0.00000000000000000000 0.00000000000000030616 5.00000000000000000000 AddCurve @@ -591,7 +593,9 @@ CCtrl 1 10.00000000000000000000 5.00000000000000000000 5.00000000000000000000 We CCtrl 2 10.00000000000000000000 0.00000000000000030616 5.00000000000000000000 Weight 1.00000000000000000000 CurvePt 1 10.00000000000000000000 5.00000000000000000000 0.00000000000000000000 CurvePt 0 10.00000000000000000000 4.64894150531215188948 1.84047354780936389673 +CurvePt 0 10.00000000000000000000 4.18497755609325672310 2.73604876692571252761 CurvePt 0 10.00000000000000000000 3.53553390593273775266 3.53553390593273775266 +CurvePt 0 10.00000000000000000000 2.73604876692571252761 4.18497755609325672310 CurvePt 0 10.00000000000000000000 1.84047354780936411878 4.64894150531215188948 CurvePt 1 10.00000000000000000000 0.00000000000000030616 5.00000000000000000000 AddCurve @@ -607,7 +611,9 @@ CCtrl 1 0.00000000000000000000 -4.99999999999999911182 5.00000000000000000000 We CCtrl 2 0.00000000000000000000 -5.00000000000000000000 0.00000000000000061232 Weight 1.00000000000000000000 CurvePt 1 0.00000000000000000000 0.00000000000000030616 5.00000000000000000000 CurvePt 0 0.00000000000000000000 -1.84047354780936323060 4.64894150531215188948 +CurvePt 0 0.00000000000000000000 -2.73604876692571208352 4.18497755609325672310 CurvePt 0 0.00000000000000000000 -3.53553390593273775266 3.53553390593273775266 +CurvePt 0 0.00000000000000000000 -4.18497755609325672310 2.73604876692571297170 CurvePt 0 0.00000000000000000000 -4.64894150531215188948 1.84047354780936434082 CurvePt 1 0.00000000000000000000 -5.00000000000000000000 0.00000000000000061232 AddCurve @@ -617,7 +623,9 @@ CCtrl 1 10.00000000000000000000 -4.99999999999999911182 5.00000000000000000000 W CCtrl 2 10.00000000000000000000 -5.00000000000000000000 0.00000000000000061232 Weight 1.00000000000000000000 CurvePt 1 10.00000000000000000000 0.00000000000000030616 5.00000000000000000000 CurvePt 0 10.00000000000000000000 -1.84047354780936323060 4.64894150531215188948 +CurvePt 0 10.00000000000000000000 -2.73604876692571208352 4.18497755609325672310 CurvePt 0 10.00000000000000000000 -3.53553390593273775266 3.53553390593273775266 +CurvePt 0 10.00000000000000000000 -4.18497755609325672310 2.73604876692571297170 CurvePt 0 10.00000000000000000000 -4.64894150531215188948 1.84047354780936434082 CurvePt 1 10.00000000000000000000 -5.00000000000000000000 0.00000000000000061232 AddCurve @@ -633,7 +641,9 @@ CCtrl 1 0.00000000000000000000 -5.00000000000000088818 -4.99999999999999911182 W CCtrl 2 0.00000000000000000000 -0.00000000000000091849 -5.00000000000000000000 Weight 1.00000000000000000000 CurvePt 1 0.00000000000000000000 -5.00000000000000000000 0.00000000000000061232 CurvePt 0 0.00000000000000000000 -4.64894150531215188948 -1.84047354780936300855 +CurvePt 0 0.00000000000000000000 -4.18497755609325672310 -2.73604876692571208352 CurvePt 0 0.00000000000000000000 -3.53553390593273864084 -3.53553390593273730858 +CurvePt 0 0.00000000000000000000 -2.73604876692571297170 -4.18497755609325672310 CurvePt 0 0.00000000000000000000 -1.84047354780936478491 -4.64894150531215188948 CurvePt 1 0.00000000000000000000 -0.00000000000000091849 -5.00000000000000000000 AddCurve @@ -643,7 +653,9 @@ CCtrl 1 10.00000000000000000000 -5.00000000000000088818 -4.99999999999999911182 CCtrl 2 10.00000000000000000000 -0.00000000000000091849 -5.00000000000000000000 Weight 1.00000000000000000000 CurvePt 1 10.00000000000000000000 -5.00000000000000000000 0.00000000000000061232 CurvePt 0 10.00000000000000000000 -4.64894150531215188948 -1.84047354780936300855 +CurvePt 0 10.00000000000000000000 -4.18497755609325672310 -2.73604876692571208352 CurvePt 0 10.00000000000000000000 -3.53553390593273864084 -3.53553390593273730858 +CurvePt 0 10.00000000000000000000 -2.73604876692571297170 -4.18497755609325672310 CurvePt 0 10.00000000000000000000 -1.84047354780936478491 -4.64894150531215188948 CurvePt 1 10.00000000000000000000 -0.00000000000000091849 -5.00000000000000000000 AddCurve @@ -659,7 +671,9 @@ CCtrl 1 0.00000000000000000000 4.99999999999999911182 -5.00000000000000088818 We CCtrl 2 0.00000000000000000000 5.00000000000000000000 -0.00000000000000122465 Weight 1.00000000000000000000 CurvePt 1 0.00000000000000000000 -0.00000000000000091849 -5.00000000000000000000 CurvePt 0 0.00000000000000000000 1.84047354780936300855 -4.64894150531215188948 +CurvePt 0 0.00000000000000000000 2.73604876692571163943 -4.18497755609325672310 CurvePt 0 0.00000000000000000000 3.53553390593273730858 -3.53553390593273864084 +CurvePt 0 0.00000000000000000000 4.18497755609325583492 -2.73604876692571297170 CurvePt 0 0.00000000000000000000 4.64894150531215188948 -1.84047354780936500696 CurvePt 1 0.00000000000000000000 5.00000000000000000000 -0.00000000000000122465 AddCurve @@ -669,7 +683,9 @@ CCtrl 1 10.00000000000000000000 4.99999999999999911182 -5.00000000000000088818 W CCtrl 2 10.00000000000000000000 5.00000000000000000000 -0.00000000000000122465 Weight 1.00000000000000000000 CurvePt 1 10.00000000000000000000 -0.00000000000000091849 -5.00000000000000000000 CurvePt 0 10.00000000000000000000 1.84047354780936300855 -4.64894150531215188948 +CurvePt 0 10.00000000000000000000 2.73604876692571163943 -4.18497755609325672310 CurvePt 0 10.00000000000000000000 3.53553390593273730858 -3.53553390593273864084 +CurvePt 0 10.00000000000000000000 4.18497755609325583492 -2.73604876692571297170 CurvePt 0 10.00000000000000000000 4.64894150531215188948 -1.84047354780936500696 CurvePt 1 10.00000000000000000000 5.00000000000000000000 -0.00000000000000122465 AddCurve diff --git a/test/constraint/pt_face_distance/reference.png b/test/constraint/pt_face_distance/reference.png index 8b064085e884f1b3bd6ed093961f83ec7e939656..4b813f84105448cba7fc0a237d79575ed0f7a16a 100644 GIT binary patch delta 2185 zcmb`IX;hO}8pm&9LRkYSL6iUjb)hK45r`%%QK9N6h$0#SLKw8zh5)f3f(?m6i#w&S z4GIWUj#7|BAPxKSA_cSziz3O8%2tL&As8fql1OO6QD#n0=i9tr-gEBq+~+?3-~YL@ zwwLX`{rG6t0q@<%&gV$`w@2glt^a2D_18|rKNC579cI_L^%+E!pRsyMZhjg{zS1>x zNS_6EG5>uCKlLLaf8xH*j-1?K!n@k5U8_tgTJB_p<-be{>Yuuk5qAwy{2jtfZCKg)H%gTbqNQ(^k zk|hzl&bVN*j8ZM%B`&!zam>(Kt>pTz4j@-2Ml*tP7f++jaZ1^f@qy^DvG3qr!gj@r z@eslE_MVu4sBN4~*p(7%-xJgGpg(`xv+_|*3frNw3mD1AY%v^X<=W^iYsJuudQT&I(OQZTv zOWx+tMfKdu$B3Q2w5A&;XQ8;m3$JPmQJtbYb-oyQB*zW~bRYiObQU@?q|a6_L@IPa zWFPbc%5vY>rv>B_>fcAwUz>u?@)R^M*;ER^W0W}{--eN()wOG*v*Uk{=sv797P(he zY(4F4EPpjS-qmXla!x}{M%XPJCU%j0SF=lZ4F!Pk`1vMe)#EpfOQG8I<4Kh0zv%QtU8YCkSltfheK^dPkjRd!vI#)u%hWk)uZ zPFI+K&8#X_n{sU0-<6f4R=-GCQuF_DZ>=jZx!c|!j`^PTE z{7Hd&WAJ5BWrHF{pdOaYK9`(TD;iV_->DO6fu>_O%9JG z@L3FQ=Xi4pJ8Z0WNcr2ZY?kWXY+Y<)!;(V2`9hV>q^&rj-q5Fh=5=3~DJWjplxMjn zoI>{cjBWeY`y4Mc_ueBRjGU9Ue_j}0Uz;_om=u5A9LuK8^%NfF2}KWz3i3YwiQckf zwWc^7d@TCq0|bY8#qnwtMCwKt>dxQ47Le+vcXU4uangjMdhSEpt-Tu*jxmSGhGsT+ zzG}YUtIv=IV8bCA0;K9Ka}Iw(+^i2`>F1zu6RewsxcpXK$%=g1wNYR2c)fc;j)0$# zRxExLw)XHII*+B47YRiY7vB~L_S8~j1<^2OYzwh_=AX8gIF(-Qyn+NTv#d1dX=Hv+ zS7@Lyh`loZX7EHhh~>h_8oX~nuvl2nQdK0GHBiLDB-GBBpudNT9QNc}YK60x!7jeN z_HeW|@8vjdLQ#(QM?iN4*^H_!w%zH8{9G{M`;58w!zGs&A74x1-v>Zv8B;3`bKAkE z?fM@gE%W|BB%yks0K6Z1hQwwJ;cVp*xeqskq=2}WCR&zP3fGI~(j5S2xAxvxYg$PA z(YNI*lgm}rw6o*J2!LNrf|z>ipu>iG88F6n@%H#@Jpw$G19K?fWW6ofOKY2af=`>#N=da*DJN;wTqLl#1(l)Aty_g#|7_j&HUjo# zDH&zX|HpDs|Ds$|qi7M;0|0zY4P0Eu-E#^72=ce*G`%Ex1;GzU{G}vw&!cM-m!N8+ z%c~;ewf`M#=|3f*5}pDajZwgy8REnG@lXYu@0ESTDz4NG>_9tSeivh4J>DJp`ThZ14>gh)<q5N$O^vt&yhOEGMe>P7k~uekzAu=rof zM8Gl7j8;&&BjIsVVn2^L^^8vpQZJ-w=@EIe(y*irM*=q2wvtW&_=en)lJ@MU(}dUf z;;#sXteG38u|@YrT0IA*7Vx)jvZjw2GCVrw@lSHrqd;_2e@C0UmwK=;S1`)VEP2(O zmd<7+|Gp$nGq%Z0*5Ii0@X-aO0rBrSWQCPC<0r4yJSL?PLK0=% zeUub989b=ec2r)>qP|_c23!1=|MVx#d+rG}8elEJhAB42^_RR{=k9Kx`40H_dGq(s GF8u)%$JPx1 delta 1989 zcmbVNX;4#H7QT5TArJyCfVK$8rXY);vagM%Y#KoY)Bqw-&@gs{P>pPX_!3c(MOj`K zQg&D@OAsU&Z~_4(2{Jv5qAVi>h#*kifGk0_2qcC~V6>~Jf6o1Ls_r@WY~Oe8xn;a; zRA73##pn39L8(mfh}}v59`Y%CptXfA6bdr%`qcU-L#p6(!l(5 z=^%@Y%KI*&jZm7CSJf-IPqDG+*;QfQSbTi6^l+SrAlhLaT9){x1q{PC1rWeJb|sRo_-otL zZ!C`;9Zh*x<|vx)t$&-@;m?Stz2*#Lal%7nVkA9M-1aQxV+fh$_m%_;jefN!E#yt# z&E&h;aIufihrXEZdlE-`ZI5cH(@K=Dl$YCFwMp|-d`^_$*klO5_D{2>XfWn95P^!# zwxV|qwp}|G>F7a7P3_FIZt@&lQdZR({l0Z=_6fh{1aRuq)Sc@oyH?4O6LkeKM9eY2D1l;0>zyE;I1zshaO-m1S2Ldx*#(ID|BnVD&B@w5Nqd@!{3vXncV1^W^VPHYY zWHS|-SDHth>|ELw>^;lVp~;mVehVp9Wa&OPW?%$sb1{prDutpDceKE#++d@gm+lng z$M=KbnJidw+O9WDCg<~;gm++fkt`?MW@R_2Gr(2#No<)f@4YfAFBjO@${jez8B8?qjZ>I z<3!{h3S$~y`M$s#!hg6X5Z$$b@aoP)9I~ithVWHY_1$@f6PEu2=U>2c{0n$nwt?h0 zmH{-zOrkjjwbEpbsXIc*;^nDs7Drfl>0lZ9(@V|5aYLjVza18EC!7C-{nqm&##!ai zfHC2ml0MhftN`7XfdSh-RZ;=nH{=waK))-)G?uszfbg+5k;O{Sp92{>tXZc&mW`05TD_x~}S%W+7`nw z7%FvHg=T*T6^0PGV=e~eRlb$_FGFu2I`4V4!I(ptZ^87O36ttyOe*Kd?x2e7A0TBZCrmJ-5-aH5%gf0dTqO5 zn}@_?s9XN%lhD5LssR}DR^GCTCsKFo%Q%7gw2X}2U%a663ku7gY!8)L=MGIlhjC|@ z4oEPOV}+4N+V*pR!?0{8#W_L7sjLDa>EUUWW2rOp&_y3_SI9{Autyd7SUV`f!#r)$^maJewB0< z2>j=uO-0=3< zM4C>5MF*i`Cv9E{+8t3STaP1@;xq2E`D)s-3E WYiy6@VHfuTpF9tb3NzG@BE(ocR%-Y z|4!;!FL!lSeN_N}`pOk<>j6OM@*hzdj#O^RdJ2Hn=t{RG8}{XNH!s=Qc2jt${@^cm z&r-LOBGqSqGpHYg`4{yKN}}EQ)!D~QgOppaEhoQSX*6&A8r4XgD#B;W1rT1EH3B3nJQQX%x#IZ-{Q(sSBbzvxAW;F-p$Jul(N3hM zKO8U)d_5J$`35!XE0BD9>O*w}o;5x2^XKT{K-3≶`BzWF0G(7lgw+72$+)a^Rhb zwAAwL5F93%rb>M?Szeuom2p3rK%{*N+C3S;Xp_( z#}`DA6yTIE+hd%L7EgsydLSB`s}7>pPKohA$i@r4V1V6G_LTw`vi-usq()F8u1!Vp zk2*23K-^#fN>dehN{ zxPLnp#Xm~acvgF-E_mvu04G#5Mw@xrUT=j_C?UC9mB6f@ro?!ho&f_@%qxpf^{!46XAre(diJC@%WpPWTTuU%eJ@q zUirr`#BPW-JwY}x-q{mB+bi)Rt0+KA2!gB-Y%uU>s2VON87hbdn0CrC-<60OP$jR0mcHxrW8(>8@X4D zNw{Lfi!du<3=u6Qde1xe7^&?$iXn;GDtX2$f<-Sc|5l8sg>oP1duaX(gM_{2!{9EJ zhr4lui$k=E7?tHGY7Xtklo8cGlA+_}LgHAm}`7oTiD zabMMvk?)e5n|O$9GoMN51?-JBC6Ntk;N8s{ms;dSBwsfC%6bjKqO3XgJII_?A+PH( zdz*Q{jNZ@~Qo)(U>+(aAI(y2ZD>sLpBD4vp#A)p_=%Z22)yOgao};}M-UXX)8H_$& zFuS$S(RreVWneIoajrF~YA@B^U^KT)wzHr{BmShgWppHSVklRbqU^MFJE2XR4uT)D zX>Y2M+jeP?U5{HW$rs-4F~Zwjor8fQOUxLre%kvbV03usA`iuTCH?(?sxE3P! zMT{SuTwHvuaZM>$GOpK`j3!)yG!cNSZWe|D6s_2|wTX?m1x8`*9!%Hs|$0vS2nzBw}g{bZOF{-q-(Xf}oB#d39J&Sp+`Yr`S zTILkBnDH24a6QgXms&&nXK=h&k)b=Dx;x~!vr7@479G30Ji#lY6nSGJV3enk zHIkaNzUE!_RT9^6JgwxrOyonYIE$S+~_Z4)F z*e;K2wY!o=jVA1eRjB;#6gzKdvsB;js_F_7RHf5vF8Xy@6z@N5*h`EVLUp@S5tgmz zea?zUBNT3YK+9GW9%By4((p}1DlII=n|o>LnhiLX5fsOT8d*o0w0&H4nS}7?e&MJ0 z+m$&#KBD7;HR8#F%QcdPvWh~M!U-v=i^y24z%3uLW>3a?OQ{?~Ff@ose7YLnLQA>+{>gqFd@qC9ixP^xUzr1j(&u}` zkG@ylA3I(wsi$x?fXG;|XH{tROnKY(zS|1h${rjM%{gKTI#}4_^EEfM{Xm@tQy9YD z2=R5V@9@Skol1PO%37njhgA*)9Q37kQ$s8sq82i_F(v9gAu zE3=nJj+YO$#K$GoYcTQ7)iS=T*~k|KtSd3NM2jL19%RBRd%^r)US({1uzADq6PtnS zo6;EZx`FnCeZS^fFMGw^6mNYfqWPtx#@GG_0Cs>|9(%W6BpYk#x%?twXx9Cjny@@; znJg|gwt3XNEMlOXN(2IL*w_WB!hUL`a$46|kok}g4mcLFusG`zZX{6mb7D_*SsI^3 znX3u}KPM`6EjCgEa~rp!6_;W{9kqai?*nD;(V>3*lJ*I6Nf2))%sB^A@-@91-*t*V z=Go8(9n6QLYDFNtHS4E8K05rLzl?8U$8Sz1(<9(d2&v_b7s0 literal 4758 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