From 4b4944264bfd9b3570dc9ffabe175d2e513c6cc1 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 2 Aug 2016 11:48:16 +0000 Subject: [PATCH] Align constraint lines to pixel grid. This ensures that constraints always look crisp, no matter the camera position. --- src/drawconstraint.cpp | 88 ++++++++++-------- src/sketch.h | 1 + test/constraint/angle/normal.png | Bin 4969 -> 4967 bytes test/constraint/eq_len_pt_line_d/normal.png | Bin 4455 -> 4479 bytes test/constraint/eq_pt_ln_distances/normal.png | Bin 4435 -> 4434 bytes test/constraint/equal_angle/normal.png | Bin 5342 -> 5352 bytes test/constraint/equal_length_lines/normal.png | Bin 4367 -> 4413 bytes test/constraint/equal_radius/normal.png | Bin 5396 -> 5396 bytes test/constraint/horizontal/pt_pt.png | Bin 4251 -> 4251 bytes test/constraint/length_difference/normal.png | Bin 4490 -> 4535 bytes test/constraint/length_ratio/normal.png | Bin 4558 -> 4608 bytes test/constraint/parallel/normal.png | Bin 4769 -> 4792 bytes test/constraint/perpendicular/normal.png | Bin 5015 -> 5018 bytes test/constraint/proj_pt_distance/normal.png | Bin 4494 -> 4501 bytes test/constraint/pt_in_plane/normal.png | Bin 4211 -> 4211 bytes test/constraint/pt_line_distance/extended.png | Bin 4568 -> 4587 bytes test/constraint/pt_line_distance/normal.png | Bin 4459 -> 4461 bytes test/constraint/pt_on_circle/normal.png | Bin 4868 -> 4865 bytes test/constraint/pt_on_line/normal.png | Bin 4424 -> 4421 bytes test/constraint/pt_plane_distance/normal.png | Bin 4328 -> 4327 bytes test/constraint/pt_pt_distance/normal.png | Bin 4439 -> 4451 bytes test/constraint/same_orientation/normal.png | Bin 4444 -> 4454 bytes test/constraint/symmetric/normal.png | Bin 4347 -> 4345 bytes test/constraint/symmetric_horiz/normal.png | Bin 4347 -> 4345 bytes test/constraint/symmetric_line/normal.png | Bin 4478 -> 4486 bytes test/constraint/symmetric_vert/normal.png | Bin 4351 -> 4360 bytes test/constraint/vertical/pt_pt.png | Bin 4240 -> 4240 bytes test/constraint/where_dragged/normal.png | Bin 4246 -> 4239 bytes 28 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index f69f260..e14ebcc 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -36,6 +36,14 @@ std::string Constraint::Label() const { return result; } +void Constraint::DoLine(Canvas *canvas, Canvas::hStroke hcs, Vector a, Vector b) { + const Camera &camera = canvas->GetCamera(); + + a = camera.AlignToPixelGrid(a); + b = camera.AlignToPixelGrid(b); + canvas->DrawLine(a, b, hcs); +} + void Constraint::DoLabel(Canvas *canvas, Canvas::hStroke hcs, Vector ref, Vector *labelPos, Vector gr, Vector gu) { const Camera &camera = canvas->GetCamera(); @@ -79,7 +87,7 @@ void Constraint::DoProjectedPoint(Canvas *canvas, Canvas::hStroke hcs, Vector *r Canvas::hStroke hcsStippled = canvas->GetStroke(strokeStippled); Vector p = r->ProjectInto(workplane); - canvas->DrawLine(p, *r, hcsStippled); + DoLine(canvas, hcsStippled, p, *r); *r = p; } @@ -142,20 +150,20 @@ int Constraint::DoLineTrimmedAgainstBox(Canvas *canvas, Canvas::hStroke hcs, // Both in range; so there's pieces of the line on both sides of the label box. if(tmin >= 0.0 && tmin <= 1.0 && tmax >= 0.0 && tmax <= 1.0) { - canvas->DrawLine(a, a.Plus(dl.ScaledBy(tmin)), hcs); - canvas->DrawLine(a.Plus(dl.ScaledBy(tmax)), b, hcs); + DoLine(canvas, hcs, a, a.Plus(dl.ScaledBy(tmin))); + DoLine(canvas, hcs, a.Plus(dl.ScaledBy(tmax)), b); return 0; } // Only one intersection in range; so the box is right on top of the endpoint if(tmin >= 0.0 && tmin <= 1.0) { - canvas->DrawLine(a, a.Plus(dl.ScaledBy(tmin)), hcs); + DoLine(canvas, hcs, a, a.Plus(dl.ScaledBy(tmin))); return 0; } // Likewise. if(tmax >= 0.0 && tmax <= 1.0) { - canvas->DrawLine(a.Plus(dl.ScaledBy(tmax)), b, hcs); + DoLine(canvas, hcs, a.Plus(dl.ScaledBy(tmax)), b); return 0; } @@ -165,13 +173,13 @@ int Constraint::DoLineTrimmedAgainstBox(Canvas *canvas, Canvas::hStroke hcs, // and closer to b, positive means outside and closer to a. if(tmax < 0.0) { if(extend) a = a.Plus(dl.ScaledBy(tmax)); - canvas->DrawLine(a, b, hcs); + DoLine(canvas, hcs, a, b); return 1; } if(tmin > 1.0) { if(extend) b = a.Plus(dl.ScaledBy(tmin)); - canvas->DrawLine(a, b, hcs); + DoLine(canvas, hcs, a, b); return -1; } @@ -183,8 +191,8 @@ void Constraint::DoArrow(Canvas *canvas, Canvas::hStroke hcs, Vector p, Vector dir, Vector n, double width, double angle, double da) { dir = dir.WithMagnitude(width / cos(angle)); dir = dir.RotatedAbout(n, da); - canvas->DrawLine(p, p.Plus(dir.RotatedAbout(n, angle)), hcs); - canvas->DrawLine(p, p.Plus(dir.RotatedAbout(n, -angle)), hcs); + DoLine(canvas, hcs, p, p.Plus(dir.RotatedAbout(n, angle))); + DoLine(canvas, hcs, p, p.Plus(dir.RotatedAbout(n, -angle))); } //----------------------------------------------------------------------------- @@ -215,9 +223,9 @@ void Constraint::DoLineWithArrows(Canvas *canvas, Canvas::hStroke hcs, // Extension lines extend 10 pixels beyond where the arrows get // drawn (which is at the same offset perpendicular from AB as the // label). - canvas->DrawLine(a, ae.Plus(out.WithMagnitude(10*pixels)), hcs); + DoLine(canvas, hcs, a, ae.Plus(out.WithMagnitude(10*pixels))); if(!onlyOneExt) { - canvas->DrawLine(b, be.Plus(out.WithMagnitude(10*pixels)), hcs); + DoLine(canvas, hcs, b, be.Plus(out.WithMagnitude(10*pixels))); } else { Vector prj = be; DoProjectedPoint(canvas, hcs, &prj); @@ -232,8 +240,8 @@ void Constraint::DoLineWithArrows(Canvas *canvas, Canvas::hStroke hcs, if(within != 0) { arrow = arrow.ScaledBy(-1); Vector seg = (be.Minus(ae)).WithMagnitude(18*pixels); - if(within < 0) canvas->DrawLine(ae, ae.Minus(seg), hcs); - if(within > 0) canvas->DrawLine(be, be.Plus(seg), hcs); + if(within < 0) DoLine(canvas, hcs, ae, ae.Minus(seg)); + if(within > 0) DoLine(canvas, hcs, be, be.Plus(seg)); } DoArrow(canvas, hcs, ae, arrow, n, 13.0 * pixels, theta, 0.0); @@ -249,7 +257,7 @@ void Constraint::DoEqualLenTicks(Canvas *canvas, Canvas::hStroke hcs, Vector ab = a.Minus(b); Vector n = (gn.Cross(ab)).WithMagnitude(10/camera.scale); - canvas->DrawLine(m.Minus(n), m.Plus(n), hcs); + DoLine(canvas, hcs, m.Minus(n), m.Plus(n)); } void Constraint::DoEqualRadiusTicks(Canvas *canvas, Canvas::hStroke hcs, @@ -276,7 +284,7 @@ void Constraint::DoEqualRadiusTicks(Canvas *canvas, Canvas::hStroke hcs, Vector p = center.Plus(d); if(refp) *refp = p; Vector tick = d.WithMagnitude(10/camera.scale); - canvas->DrawLine(p.Plus(tick), p.Minus(tick), hcs); + DoLine(canvas, hcs, p.Plus(tick), p.Minus(tick)); } void Constraint::DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, @@ -400,7 +408,7 @@ void Constraint::DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, DoLineTrimmedAgainstBox(canvas, hcs, *ref, prev, p, /*extend=*/false, gr, gu, swidth, sheight); } else { - canvas->DrawLine(prev, p, hcs); + DoLine(canvas, hcs, prev, p); } } prev = p; @@ -459,7 +467,7 @@ bool Constraint::DoLineExtend(Canvas *canvas, Canvas::hStroke hcs, Vector ptOnLine = p0.Plus(dir.ScaledBy(k)); // Draw projection line. - canvas->DrawLine(pt, ptOnLine, hcs); + DoLine(canvas, hcs, pt, ptOnLine); // Calculate salient direction. Vector sd = dir.WithMagnitude(1.0).ScaledBy(salient); @@ -478,7 +486,7 @@ bool Constraint::DoLineExtend(Canvas *canvas, Canvas::hStroke hcs, } // Draw extension line. - canvas->DrawLine(from, to, hcs); + DoLine(canvas, hcs, from, to); return true; } @@ -550,8 +558,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, pp = pp.WithMagnitude(1); double d = dp.Dot(pp); Vector bpp = ap.Plus(pp.ScaledBy(d)); - canvas->DrawLine(ap, bpp, hcsStippled); - canvas->DrawLine(bp, bpp, hcsStippled); + DoLine(canvas, hcsStippled, ap, bpp); + DoLine(canvas, hcsStippled, bp, bpp); DoLineWithArrows(canvas, hcs, ref, ap, bpp, /*onlyOneExt=*/false); DoLabel(canvas, hcs, ref, labelPos, gr, gu); @@ -615,9 +623,9 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, if(fabs(ddl) > LENGTH_EPS * LENGTH_EPS) { double t = refClosest.Minus(lA).Dot(dl) / ddl; if(t < 0.0) { - canvas->DrawLine(refClosest.Minus(dl.WithMagnitude(10.0 * pixels)), lA, hcs); + DoLine(canvas, hcs, refClosest.Minus(dl.WithMagnitude(10.0 * pixels)), lA); } else if(t > 1.0) { - canvas->DrawLine(refClosest.Plus(dl.WithMagnitude(10.0 * pixels)), lB, hcs); + DoLine(canvas, hcs, refClosest.Plus(dl.WithMagnitude(10.0 * pixels)), lB); } } } @@ -716,10 +724,10 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, s *= (6.0/8); // draw these a little smaller } r = r.WithMagnitude(s); d = d.WithMagnitude(s); - canvas->DrawLine(p.Plus (r).Plus (d), p.Plus (r).Minus(d), hcs); - canvas->DrawLine(p.Plus (r).Minus(d), p.Minus(r).Minus(d), hcs); - canvas->DrawLine(p.Minus(r).Minus(d), p.Minus(r).Plus (d), hcs); - canvas->DrawLine(p.Minus(r).Plus (d), p.Plus (r).Plus (d), hcs); + DoLine(canvas, hcs, p.Plus (r).Plus (d), p.Plus (r).Minus(d)); + DoLine(canvas, hcs, p.Plus (r).Minus(d), p.Minus(r).Minus(d)); + DoLine(canvas, hcs, p.Minus(r).Minus(d), p.Minus(r).Plus (d)); + DoLine(canvas, hcs, p.Minus(r).Plus (d), p.Plus (r).Plus (d)); return; } @@ -734,8 +742,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, // degree rotations) around the point. int i; for(i = 0; i < 4; i++) { - canvas->DrawLine(u, uu, hcs); - canvas->DrawLine(u, ur, hcs); + DoLine(canvas, hcs, u, uu); + DoLine(canvas, hcs, u, ur); u = u.RotatedAbout(p, gn, PI/2); ur = ur.RotatedAbout(p, gn, PI/2); uu = uu.RotatedAbout(p, gn, PI/2); @@ -753,8 +761,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, p = p.Plus(n.WithMagnitude(10/camera.scale)); if(refs) refs->push_back(p); - canvas->DrawLine(p.Plus(u), p.Minus(u).Plus(n), hcs); - canvas->DrawLine(p.Minus(u), p.Plus(u).Plus(n), hcs); + DoLine(canvas, hcs, p.Plus(u), p.Minus(u).Plus(n)); + DoLine(canvas, hcs, p.Minus(u), p.Plus(u).Plus(n)); } return; } @@ -841,9 +849,9 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector p = e->VectorGetRefPoint(); Vector s = p.Plus(u).Plus(v); - canvas->DrawLine(s, s.Plus(v), hcs); + DoLine(canvas, hcs, s, s.Plus(v)); Vector m = s.Plus(v.ScaledBy(0.5)); - canvas->DrawLine(m, m.Plus(u), hcs); + DoLine(canvas, hcs, m, m.Plus(u)); if(refs) refs->push_back(m); } return; @@ -930,8 +938,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector u = (gn.Cross(n)).WithMagnitude(4/camera.scale); Vector p = e->VectorGetRefPoint(); - canvas->DrawLine(p.Plus(u), p.Plus(u).Plus(n), hcs); - canvas->DrawLine(p.Minus(u), p.Minus(u).Plus(n), hcs); + DoLine(canvas, hcs, p.Plus(u), p.Plus(u).Plus(n)); + DoLine(canvas, hcs, p.Minus(u), p.Minus(u).Plus(n)); if(refs) refs->push_back(p.Plus(n.ScaledBy(0.5))); } return; @@ -1007,7 +1015,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); - canvas->DrawLine(pt, closest, hcs); + DoLine(canvas, hcs, pt, closest); Vector refb; DoEqualLenTicks(canvas, hcs, pt, closest, gn, &refb); if(refs) refs->push_back(refb); @@ -1029,7 +1037,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); - canvas->DrawLine(pt, closest, hcs); + DoLine(canvas, hcs, pt, closest); Vector ref; DoEqualLenTicks(canvas, hcs, pt, closest, gn, &ref); @@ -1073,10 +1081,10 @@ s: d = d.WithMagnitude(20/camera.scale); Vector tip = tail.Plus(d); - canvas->DrawLine(tail, tip, hcs); + DoLine(canvas, hcs, tail, tip); d = d.WithMagnitude(9/camera.scale); - canvas->DrawLine(tip, tip.Minus(d.RotatedAbout(gn, 0.6)), hcs); - canvas->DrawLine(tip, tip.Minus(d.RotatedAbout(gn, -0.6)), hcs); + DoLine(canvas, hcs, tip, tip.Minus(d.RotatedAbout(gn, 0.6))); + DoLine(canvas, hcs, tip, tip.Minus(d.RotatedAbout(gn, -0.6))); if(refs) refs->push_back(tip); } return; @@ -1135,7 +1143,7 @@ s: Vector dp = cn.Cross(d); d = d.WithMagnitude(14/camera.scale); Vector c = o.Minus(d); - canvas->DrawLine(o, c, hcs); + DoLine(canvas, hcs, o, c); d = d.WithMagnitude(3/camera.scale); dp = dp.WithMagnitude(2/camera.scale); canvas->DrawQuad((c.Plus(d)).Plus(dp), diff --git a/src/sketch.h b/src/sketch.h index 3097d3a..3de3738 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -669,6 +669,7 @@ public: void DoLayout(DrawAs how, Canvas *canvas, Vector *labelPos, std::vector *refs); + void DoLine(Canvas *canvas, Canvas::hStroke hcs, Vector a, Vector b); bool DoLineExtend(Canvas *canvas, Canvas::hStroke hcs, Vector p0, Vector p1, Vector pt, double salient); void DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, diff --git a/test/constraint/angle/normal.png b/test/constraint/angle/normal.png index ab0b1766ae3c0c483c6ea5be5e5a599ddc965df9..1ab257310d8a539b4870e6be8b1a9d0603e18f96 100644 GIT binary patch literal 4967 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 E17_M>N&o-= diff --git a/test/constraint/eq_len_pt_line_d/normal.png b/test/constraint/eq_len_pt_line_d/normal.png index 709b9e3f64dfe72908ba1cd2abe87be335803e95..aa12011b0920495d8f173d6ec8ab271e27c9ac54 100644 GIT binary patch literal 4479 zcmeHL3sBN~7XFE%Cce!qGih~uYQC~GQ?d8MN>ej@BoyYY@EI9Fsc5&nx=!{K%QCBL zY6@a|5i=Fal5NSbhho0d3KGpyk(7`{6DKRX?auC<*_k`TAN~Vp{^$I@bH4AKLz3r~ zby^z68UO&T4eM8X0RTacTIK@jg)6cz_KwUkF9r3V=yjUz^S-{Uky;Q!cg@r3lJH`=psIgDM0_JmghR_!;PeJ5of?E?e7)fCE*Elzb%|e_%01`UoojzVd zsyQ@L>_ePL11!~3FsHzZmNKM7T5*1i(&)f7+aJ1~H92Q1CA`KUT0;$;-xEzZutK&+ zT%07aHN5ons=>TY785bt%R>ZxNH5fZ$V)H0D~IXPp6nH*HZZDrfo8#YA)8JQim3mH z!3rDr?K#%oBK_Xs+dhS}+c^l{zGG!QyrLb zGPY5xK)WY60UC)JUYYp*Jo*%7W3**ZDuysX{8+0IvDFRBbg59K8O1|A@1fphDu<)< z247E~*bDMu1y`|G0XV#POi0eASCk%g>d;q!_Kj-qgkUo{+FF1%?>~_=P(`<#lV~{M z`D1dHabzDQh8m>8+C6u|&yzF{dF%wM<@SJ;DbLDE*KO9oQ8ON@+k4ApZCXu&@`6!$ zOK@fMT!A)O$3tn#Pc2I#ATY;bghw$sHV%E6DP4H8ZCKqh3y$a)H?wodn#ZO!>BK`L zm9P6nqDFYS|E0JhKhCdL!u-u+q{p_#$+%({Ys#X=6XG`)*q&W|Y5aE-?sMOP2$}e% zECIJF3>|&IP9^zb1#jPZ_)*~lt^=z2w)5sf*UM7N**9_>T$?`r0`LNF1K&swm1#Ap zx0rd1Jj1CLrT%kiB+T-1&HCp7uuYV<*eRAI8*d9%m@!DWXISI^3a4 zNxI)3H6~y)()(+4&P25Nf7w^RGrOc<{WfY_D4P1HVTL~zD>4IM?XF1`^s}gFrK}75 zo2!&T*Ml*AliCcbQn!8C%O=ULe4=8Nq-DRPjW^N}Ls}la*w-2Y(0~2+OXN=&Mw#*_ z4F3l(G^5azT9}+__&E76Li=JIlFxMCQqk^~@bX*5>~(T!Hc&|OclVT9Xq_{8mN7tk zjIl|O_`o5Oa<%XH_|!OoeWL@j?@VOHD`PO-GYq}xZ~uUR~0-XfYxD;Og-@uLcLV>O$IPD+qSZG29c1aqmpfW2Zi=0j-h8aY zG!U?gG>wrzJ;8J?-;~)-4%on>^NbC z7dH2ZRX%DRaEvNoHFVNB1Z(MS9C`Tl^Jf~wcA=qQ_2u~JNAC05$Yz{-=3G=PsPPvr zqh+ppnzr{@U#`ANjgbta5|}S2dw=C+F4sjTo9sH^uNhYU5N{mJD6{{NmV0<_40!-I zRBsjYC_6Q52Or1fNgL)gGP=YR$@8JI9SsaewYH7Ioy7!KnS?i-vFI|s+Eq++CcE;R zFwc7l{1f=m-vWXFmZoC zW*ngU7$L>)f|4l?*5!$O2za}`wdao0B})@g8Z76Os9|Ueyb^oEyo=t!6fbMVGRXrd zIvl*cYYP$5*E{XA-ytNpU4l_~rZ`a_jrU%BBru@D51rr1hm)xN64L^5ixEz^ppwq+ zBinwC$j68FMNEVq%a&qaVG8r)iZG)f~ir?MJ{J>2loPriCz3hmfoR^Vmpq71b22J~NK z&n9q@5$;`GMY3m6tp-^6%wXPwh-#TWI9Md#;AM<%htPeg*DM{WTf=!utme^`ujS}u l%gSf1cJf8`zhESRCl-ci4VrXpmjAH=HmupQnz|C5@GmYU9xVU> literal 4455 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§MGh;_n9&#tYw2eD(j8yqS1;jZ!Z5-9sU;V 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 F{}-wsF}MH# diff --git a/test/constraint/equal_length_lines/normal.png b/test/constraint/equal_length_lines/normal.png index 50646cc6a305b9532d37c77651142478bc0868f3..6a59e7d61262d7f43975be35ab9923449c510187 100644 GIT binary patch literal 4413 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 E0O_Lzmvv4F FO#t_+688WA diff --git a/test/constraint/horizontal/pt_pt.png b/test/constraint/horizontal/pt_pt.png index b0a780457b82f49b90e0b65e31d43c9547416610..882c177ac116c510aa731d846fcaa914aa9e4dae 100644 GIT binary patch literal 4251 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 c>`#Tn@OA!hxV2OP@!ESD*d9^E{3dR)@Mizg+U zEm})9n>vx4La`B%3muKYM*&zt89U{=6@r{gNEF zZ`PhLa{>Tp+uLpU1^|H@`J&Vnzm)AwYXQ*PX}@9ZuE>jTo~{jUc19=G9Y4S789BQ$ zJp4N?58TxIclN9bs%TmpUe^_$leY8Z0y|l4#}SLm6ZEZeNSptZ$aZ(Et;f5~0x-w! z!T=DKBPPO}tppWF&@=;J(r2$1jAYHrY4dQ>8XT(eoG_ z5BgCk4JQGnCuxp{aki1jorNH6`%tN1qFHV%5FC}APj{))UpD4)SkNX7ALILS)+PEx~n%6X#LgNPI0opCjQh^4j`@Zj-6r}HA{)I%f#im>$B5eat zJe)O#)wF#24QC7j2n&=TeU6(163xbxN;qu&uE5DVH#@b35L(!EB7Id!2+D17 zkBaRHC9(?L9j*}b#MA*lR=9mo^=_~*jK4dV)o&6J7_BkqZbpk`0`K{O>c77VT^A8a?gq=p(9h{^)D(mqgNqL5l<7T7keZf6W@GY@a-L)J~<>%oIc>I)%1=d^>YL`w>DO!pdXIdeZPmfd?Tt2IF1S|ow5 zcYp92_j!9Fx;yFg+}7HkE4f_y%c>pxymK#v0=C151)G;EvS(SjPsC%!D_Y=HPi$ep zg%c+BsjclgoWju}TWR+!yUq)|2Z?Zg_8zZ)s_VLmhIXS7pev@wOj^`-Qw`10*;?GzsD|!s zjKwy24#`x9qyyNEXoF-9LfW@Jjvo_Eta9969)vO@MG!6^E0@x_+;j8U5)WDRIli18 z^MoyHmJbibmGnd%2xtmtVi?xPeY_aV#DTKCZcS{Nk*^%tnfQbw=-PvtY8gXqSc*mR zinCf{Rs_DaW=V;CJ8gIE42+H(n2#{1O*J96*{PvxlS|n7jC}p6rnm4WG*V?aaR#lJ zflkAh2Wgs-mN=Pm0%pR|AM|VS9T9p6tqS9{ZRsNu40&%~<8CDd6UkAFt(F5P^F5Tc zlfDaVbN+SY|HgEcYtHy%`dlJ@v@0n>=t5`FdR2H`^^RRCvL%D+hra!_wv`1x-K#h^ zQ!cgBes2nWyqx_3!{~(nfZ_iQhS?YzSAYb_wenOfb+13!AxS}t9ICvLV-{p5t0$CI zynZoR1;WSQS^s5)`l(hk+*LvKsy5kI&lNa_1sJ^(W$la1@)3 zTv8rezOV?gjl$wrwEb`Zb2(M(&uFkN3o^lJDEuB`esW}yV%)d<^}t_jU7H8m5MWrH z9UnH=Ca>&HyQR*NSRGh$YptsP);wpZ)rfCUaWaLQPIVsYYTRSX=m^p(3Y1!e z6X+&IK(dH$xNr{vIcnTxXOWPAB0FtlJl24Ux43vo@X^piIiUw0T@N#I!MP;t!FFqBLO_@>xYb`Sd~}H&wUT}`^C!`S(3~31t#Wwr@tn#0O5o|nr^_y` zVfZJP^k1WNN5AU0RpU{_+Q%Lc?(6Oj58yvHAkCsoDt;j9;Aah8T$Ehun{~t{OL1K6 ze#2V$sPB-h(T4gsh3e(Q9vEi4O<8eBwz{eRDO0#I;|-V6#jNWwzFp^jp`LY7D?O8m zp<-dx)rsW!%v7K52M)=-c;Li~WrpO(Rkw3ngP$!gdPwOJTV8aU?cI4s&gDf@WuDD( z4Y6R6P>CXkoE2ZG3oS@h30rvmp-rcN=S_XlGswIVUCeQAP(0b=)qo9-%EG*4UDje4 z)_6UF!zh_L*Rp4ZD=$ZwNpA^GB^D~;m4rwRO6qk^U7X7r@Jiq zVn&|F5g|2Z_CwYo#unx<)PHU5Vk9V=nz`e629Mj%91JYqTO3w&IwFa-<*rx@BJJp@ zC@Qkbt%B(0voBe8`OHuXt~hSUC`z6rs<=l@mNm0wdTwlA3g diff --git a/test/constraint/length_ratio/normal.png b/test/constraint/length_ratio/normal.png index 45a41c46c3c079a5b6921ee1db94405abfdcfa98..b67ffe0f8af994f3e7648d299b45c5c122838b5b 100644 GIT binary patch delta 1966 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 diff --git a/test/constraint/parallel/normal.png b/test/constraint/parallel/normal.png index 56591d7d1a1277502bffda13beed3b6ba3ced8a4..518845f8f3d96fc13fc77b572e109f2bcbd6d6cf 100644 GIT binary patch delta 2526 zcmds&=~q)p8pbOjfshz>q5`rLdKv^B1zS;BM%q?Xpuun@0s%#o$R@H2H$g^hKp~ye z2-+-4D>@`_ag0b1xNM?LD%?6B{W=}4bGrb!~u>OKr3;ZNJ)et?(+o_D{q2NJ#gO98HLt*-5UEaF=_ zlK53{TitJePl#0$n<9xMER098b+i(IZ*FLYh84^2`pm48zZ!2BFVp-=%HN$nx^(&# znX_EL;>|3TtjxCuSqCljw2qH91bykhk~xJR$s4CbMvrpgYY@)sm$A!*>NL$`a0n6g z#$*-q&OU6oVc7vY<|2V+m7xzTW(;f{Kh6Y&EvM=FF_}`4u)-6?-^NNg@ywkzpmi85 zm?4ipmaSMFY6%yAXd!@|7tr)W>NcDu9jI%4FcE?AlpSUQe|E?B^(v*?+@(}5(aBl> zlokl9JVW25kwBY-a}fNP?1lf#+wF)-Gnr*XhrA9zxSYK#SM6ZpCOa-s6NCTA8X0lT z&_`oPwtWQ%{+nXWUPF$za6-vEda%c`a+qCQkpQA~b!|yos_`x?*NX^#d4ln?Rx$_9 z{FC_DiFEg83QEvI2xbNhv13hIAiVHh3|93Rfu?DJfg@Kng~aw~R#lt7ZuFSd0FmYh z0L=s%a4A6XfHY&CaHhdG3V^vL0tKv-em~Q)8BYPG2Us|ep>7K}$epD*GdggZ6N%=8 z$+|#V`0pM5UaBS^U8Av9V28Y|oqPcR^UqC~qAmo`2U+h6_^v7zJe0`Kq8Q+#`TQ8t z4%p?fbesz6%n;z#AS!>Xweq%dZlrq)u~F z(ja%5Q7(#Ce!SjTvO6uQ!|P-dRw_qr)6?{0h5l^zlS0|T-cqlEjj`?F&jOeoFe{iam?$U-ND(5tiv{Hm9+7qW4;ed0gfbT-3@lhNZPF2nCv?G9c zK_~hN*A39iv+E%t)$mArGBXvd^J(Pv_UG|t7hk%&Q35yjl_ZSdu0=ENMedp{w&JN2-%$B`A&B{V6hRP=~---jI+k>Ph%2U}pehgI+UIbI1+Xigt0 z*Zn0{_ofH`7E}6Qc7o|qydq@Zob#GL%2?TrM=1+r0kf#CNYO8=J3A3od{9_wz5Ebg zG`0n?OPazj`X4V$d_A9Q0`5tYH3U5;#i0gq28Yvu^3}>ZoZ@S7DT{|aYDw4*}%H)wR8$yR_Dq|;R;v*trG|(c+ zkkQP!d8vH4kl8R@>`;@uQ`#VZeysM*f?d({a8>=AB=H-Cef4|hN-ToYmC2YHWwl%HI2Emd3yXK=%S|{=y+nz2phwKawJXM>wSc4YZovVvx2B|| zcKr1UFD??cH)+}4s~!J-aXR%`jlZH_d3XXulNLyVSl&J9NwM^lO8{9In_H_)>Kk8V z?yh8}K_iUbPG=DCPT>Gm)!V)8_PLPKDR+L3g)ON{w&&&u*xm{_zkYDWZuY30W(J6J zG1(siuSAyZQaWcyBPXneo!=!DDFkuiE5o-=NsSlSjhgb}niQ*I7=-HuR%p&P=ox!v zX38ZW&wWW~8jU`CCMO{q+28hg4d}bs&&-gfzutAMo*5FBJ?kS+^%NYDDJ`l>9z^CW zE-wY^gf^vJ`V_wb7+v_+Gh@Jyp<44wz4%>t^|gH~pnRW=ud^Gh0kE;p M{m`CDH&*&T0ou-IGynhq delta 2466 zcmds%|2vfV8pl8Lt!5hXW!5ONs0L+dsE}`o)K*HRGp3m%Bf4rySVY9kxU5bTt2swv zrPY#ZFkCwgcJLsnl;KRqoY4#?)%cn(gQ>wdkFIO?I=`HM;5@&4uFvy4pZ9&=@B8(+ z>q)I3Blm)QKpk#7zR3nB{$mgfXtlZ zFU;&in21hW^)!@?XF+90Si9iw={R!Z51&wl3<4EQT!YH+ZR^-~1F8h`V@dmr!Z1F0 z0el$=Ud3qQ@0)pG0|z>5nrQ;I%$Si6liD8bwq&*GLCuBC6TUPA#hKILhqG6nyW3Rk z(Sw0ESbLDWpIN&N4rG*O=b`qzT~gHPW*WR#Ixno(dLBJLJa!&VcCHhh^Yhfol6bGq z{foTRhH9W$ZtHLMyl4upopNn`M@e5Ac)E_g*+1!306%#H0ao>8);5S&?$8%m>iHU+ zJvgwHZ)XkXcc-6Od%bkUU9Bmum&+TgqeIe=L?04?>=N%-C(Eit$_zOExt7a2;>@U$ zA1!UbkQ17iaF~XexD91=W9`|?1X>Rc_K;C9W&xVEHD1D!WqZOfJ(e7d2Z;x?BtG+e zrisr=g|x_3%&{yOY7d=pN` zzhUp6*zny}A-InvXTcC8@8WduPlgH7>Edbxs4=4H*>0rXmLk~kXkxn|buFLV=K)fJ z5)_8Cgg{uu6`6Ahwszq#v)5r2rK42>b!jBt!U#s?M;uYHip)(GRK|drX)>lI9E8s# z!DryeDb{?M7mQ7e_o*1reYziRcTvUYyR}Y%tiX4X34fGc>mfYG1I!v2uGQxGD;#|9 zr>8e)s8(R21V=m<0Kfc)X@fe}h6+3bdM$Pm$UiiPewLfABH#xjFt4U*2M%WAVE}Al zGTDnpm%dJW2ww1P%rm+VBBrLlc2dp=kqGU7mshd;=RAfa(j1EOU)$ z0E8j&z$$==0GUT8g$7OtSuNKP=gxITIg`LJz2KH)9T~7Ge@azI<@6>TyZCB!RoY`E z8cO8u({pC|HdAAOOrL`>oUQWmFX+jz*wz>hht6mguzc}ujvNdhAtAfDa4-`C8q?0G z7G-Tri*9?}P%@g>lV`BJJU7$D$nwR*r6D}o-xD`=y`eLXbT27`=XV@QUyh2R4{D`@ z>B|yhr~)w(V7RrKE#1z_He^yR;gIk!fSqJy{OZ@1=| zfJ}N|!c`$D+(113|6bYkf4c!80haIwq!Y;;0gM^gpqPP~WrlNq!jtsmy~>pM=)gSK z%Pla9bYGqef9d&dK)EM}=)`;s(0iaG{_-3Np47pnRvGZ5FTeE!5OHCZebmTtmB)i2N?A^DyldoYp*$+xYpw}s!!tm7~sO`V_Q zFxU@ zS;yu3^(Sqq-k)j;kgRwc!DAw|0sjnAq=2kEm*F(LMXYcExGT8$AnBMW9K z#@49j6G-EkB?lx9l1fRXF}lZe zr4w5p+?zNY{^E3CNfzs$QK25DenREP)Qu5&qTQbhDpR9b{n9I6WYuY6L5-qO9Q0t( zJE?2IVZ1r9gi$Jtipq%xpMLxFu~603;;j+ColVp58v2GC7QAkM+vPBrGrX?U4BS08o_!#_rBJ11-yOe$j_ao zXEO#xb67D3Z2E4nrZr{HY1uf#QFMbBznJ=EL-)g6e!Pk`72n*~*e|W2uVwqm4l+w} zer-A+X*z})J9(ib^;Ms^ovIp~jZ@6FBZZIBb%>F}EwIvLqEp^o=eMceEBR~Kej~2@ z?kf=yAvujK;lzi#Ne@--LM+0LpU245G$xo&_O4iqE;Dw_=njd;Mdzy|O>-_se_xP= zE~dF@L<;+vCDifz)AY1TP5E@PyQilxSJmEvUw`dBH(bQX{LA)=^8j+}Q*IU!w@z&w zR~UORc%|-Bsb^nnrIuHgpC*RCS9NNoLfwE=pHM89*x?tV{w^E`LzJ&mub;cmn8}3@ hdig_!w~!d3Zf!@K{i)IKex?BUIplwAf3+_&<3D?kQ&j)} diff --git a/test/constraint/perpendicular/normal.png b/test/constraint/perpendicular/normal.png index 8acc73c86ae22bd104ebf68ba6fd237395f400f1..f1d36526df26d447c1ebcd76d15749df16eac903 100644 GIT binary patch literal 5018 zcmeHLdoH4YG3WDk4fOy3l0{6{$6nY8jEnl-dkU*8MVOCbm{1(w0kd=_1KY zrg{g(@Kfm~Nii-FU97vIY0O4r-se}@UAw2Y_mB5I=RIf7;XLOzzwh&XzQ51+^SwQB zn>ISAD9um;0H|zOZ?_o$ED`<3E5KjMcBi%gpy9p2ZuQo%Q~j+@$DX>LJXp(8@?Z1K zh07hSZ?-b+=Pc=KKGG2&L`uGYWBbs`KIvXoRE4VK#VLI3+KpQKH@M%;wbrZ1;}u!~ zKpy*!4*;VUZweR|OnETHhzr0CoHnpcMX&&`0Z;bEDg!+N2?Jsk|4TyFCv?IyJv@@L z=(MVCA^n%IVXEx6Kl3Zeej?96&-7}6@Rw5Wt4*_84?mn~riT4Hd%7HIZ(^AVS{X|x ze$JNBp|s@y#HN1olSUTS)SG}})^7*|Gkxk*!Q}h6k4U^+aGm^xKry0C9mPtFXPSR8 zgW}Ke!U1GG;gg6Bm@AhD#vnPD( z9|`^_(I?Lf^Cp`{lliS)5;1c6b{e)$yV+(aAD_x%H3u^o-o!14tm_imZx)-LBbl6TJYG< z2hJ10tR&=xA>lGurp~lKWvrd2H(o)7N^ff_GtN#S`rUx5fd;YkII6>fCy2VU zb8+XEi^ATKswGu>G_e*lG)%o7LZMnkQ>zXyQ;@Kp)){ddwa`_MJAWrU=>kr>1g^G1oOTY}IV}kxr@*x<4SBJzx6}X39Zgor z*S`l-X!_VmD;C=k6*=+YuxW9~i#hP{{ZH$*iFD!*v9lViq~hLKJW^9%|Vp}($LYv+#k%f0bh;S z!uf$590#q9G~^b0_z8H(F5?L!k*RI0mjc)v#j*=?gu zM5oKyjhAD!Z0XP^uZJsYi)MKrHe`blL+-Tu_${X1@{h{%cmi4I+=Ex6y@V0I@7^Bo zd2BHAVeaoXl-TR=O2{b~7w%0K%WI=DHBt2ty@A*sR&RgnhpJ{A(zMZFfQw zk?5R=dtGe%n1d>21R4>8p8FpTHeq`$M>l!G?1W_Ga~?P|lr07IK4n8m1u~XH&3kbI%ivT)|35NEKa`e2;-^Qyqzz zK^H8`dliZtIEOd=sxu1xlJy$I$^Cp|fh1UJTo|hbjIpe>D^&8$p;a);4v#qB^zXkD zQ=Xjj>d~wkYJY=cOs8ZQO2~G1BjRN0suIm#wOu{v>*jzv5GcXh>fRmayJatZt7_)s z0JC!c?6-NgkRgSeLRGb6TSZA$FpeE{vtGiWwZ4yI4ba{!cZK9Xr)YXzOduLspPd5s zsS$(ru;vw{lQBo<5+O^x#O_Q~7=lWv;x4M}sT+s9HN5@<71g2dhkD>U zEXf2Vc1_y?h$D=XK^G(9@usyX6}j>-w)^M2XZti5>Q|i&9efDy^PzB*jVRFzvvRlY z7+cH}%6NstZS!QW+vqZpq=BQ%h=vKKDB7JqvVMpkTOV2WZjX$DBb9sVzw#LlGajsd z%O`?CH7u*zsZBD|HTROeAWKÐZ@YPeH3N)X(Re}mT$hut%nmpEW(h!&#|yT_ zr86eGKUrY@)Im*axN>}!>v$!9Ux}=E0zr>GXz8F(`aQ(@VBg}8_4KnX7c9Qjfla3| zpm5g#`6;h?5g242-js2a+V8MS@$1H<_crNud5q5c7vrTm5zMrxKCn}Rh?GeKu52F> zC(uSmv-Fh{97q`HuWoc3T2#cnP2X1pKowI_$+T@0%Dp6;2shc4R}wlU3+=x_03;m-8EZ)9AQ{^tK&kCso7K zy=ak=P>hQ`f2g~|0kz=>Fqgg4FB4Ww_OZZVnf8pMN;kA_4{=U(+tCUDw|aoV=2 zd0OoYRlw>OO5bx{=i)I6FOTUBu0xT#W{3ZLgIX^ySec?T1CSg)y0q)iy`_T}{#@ff z;_) zKK&mU-h22T82;a2NSI2bh_P@S)iH;&hSgt2ETk9~Pws@2%gxj2uT7_n4qe0mEAq#| z=(7_noT5&4URf&#{O*06=cE>I6=r`I^lZw6xSu%C_{vo!dddO0iz;j%HFtpQ?=e?9 zYzjywFjyN$5MNGTCDiDx3***e3L3m0vU_P=b9AXMU>y1MwD~co&=itu%y1xtU4y*F z)B+?yJe|lC#>($q- zTq3BCgM`)t(hkZR=gmeR#Gzb8lVvRz++VOSTiY@?ux%P~NKxoe$S`KW?~G`G}wL zc4JK6i4=vbxa*F+CA_RB4I#afmXT(D@5<1!0ZNKrR+I4R=rswgghvhd3W*W4`ib6+ z6%HW2w zuF_he;f>nTrFq|EO-{=!O_t~~Cc%uQHjq;+d7k4CW)9kIN6IGk23_GcIGCMUC*X-Q z$_`R48uT>}*^FdTd2Jq}1CK5Q+Ik2rYV(1Nkt(H>#!k?R&FVstd$Ig znn;FmFIHAE7?*L9+y))DIc6GjzJJll?$LJkdCv2U`TW26zW05<-+TLg|EqR3mJ;IY z!~p;j`}dh20sxIe{zQf0O!lODReXtmHt013RX9o)T8cfHW6@d7gq>U z`#UT6U5lTJr-zCT*f;r}+38Yob1JgwM9{@;hCU_cqJL!F9Yu@PSd5|5#a_uJcHd%h zntwrojWw9%j{9r8*L`;sUHu~-Z9+*0O@Pi;=>=S3bBCf+zYr0wZgbl<5NQ89Gma3g zW|RQfO9)>M=%IQ&#{z(t`RIuebmKimAfG6<;E_7Vi?v_sFn-G5hzy{q8TyDW@vcoC zH7igG0A=0Ev0s?y%hh0I!yZOD)3>8wyFBfLSNxf@t87z&f zYzFfXO%#w4QkIQCuI>Q{CC*}T0i~3_eMAHZdoCbI@|AJZ{lXwMHF@(mP{`CL`uX~g zZbrhM0`nrr9Ruk5te1^_e#*}fO0p8N;9Ey+QrNqIeqv~uw+yh$KO6o58r3~W3e}zn z5pXyXpkb|>?uFH|zR3su=4U(#Jj6kwPNh;qjX1!_YEK8vph2I7tCGs#tAi_9Nm*0| zbFeiBuM6zzF)>Z9*lqS2AkGwD_;^YM3*z?RrTpf84F4GizD}UOQnfAwyVitRq^rr^ zO#P3C-Rst3Ntu#3?7L9j6$0Y02DiIb!;VvRjc@3^C77=_<4!4*84j(N< zKV?n1thQh;7TV~27fF>@1JF$QTXcc}GX9mmsDT}gNRj-gp$BTZa|s=D2=0vChcC2( z&&4H|pG2^sttPw)+dd zMZ%uk6(K_pDG`YoSKzyo8}At^{EG%Uu+kc(gy@;##;a|^7uPrgqfHd~s)X^{HBNxH zg);Q~U^cGmKCHfNi&cu7*Nl?=Gbl#UxyB9^QR5o$>k^iVRLuvOW*Fha&u z01L-_g|cq?)JcWj3*Tgw&OVK7^lEnx=tk3bSySX~eC#!(w~_uSs^LE@${~ntBl(JH zL_Qou#K>pR3B`MFB9r}+xRpe0dyS()=XOJHj0QlhJ9QTFTsMNFL?$41NaEPNd1{Qw zu1VI(6OOjf0B{niLd_y&61hREReA!ERVBy6E##itlY@@VG$4BVjL|V#>Dp5HsW`VE z(-C!XFcGD3Y^HKDy7^HWoB<530}YhC8LLqrV2YR(9En+dRJhMhA*N=I<=3z*^# zwhmYLQU^}1MU&`+UGeW6?!b_Ax%Wf_TgABYQ`11=2(x~$L=H=e-(Gn)NHI9>2K?O% z9dp)L+UY7xZBh_Mwx{#evr(84DqqGx{ntO4CcZ4QN;w|5A zJ|SdIa=2Cp|5JdZnTkh6T*+|<6xhEuz9#ZE9NvTV|LHw15#=)HS84W@U}WjS)(`qR zFtQY%(DKfFeqeq1{J*lFhWAV1OikunShk84wBuVJ_U(czu_-4i3)7)d&k{@modvrG zIiWrovp#~^3jVw{$G9o4X*7;AkkD?&9!=xC?c{iC@`?qS?25i_yY)DQTPwqqd?u)A z*%Ot1v-OS6Q=0~d+uCndV1G~_xn`?vqC`gpdsT_Ynd4FX6zbl&QLjj#Ni+=wsCvFpB=-p6Q2k=%4 zF*y|V%;4?4yHk-%q<)68EgvbLV~U^fc1ViSelGfM1@L~hK+pI(bHW=Of6G6Y=lC#d z9>1n6f$2+F(Q;9W%->Pm%%W%hmTN5mf9VxNzI}J{*G`K>@BKpm(|MY0F#tCCKbNu7 z)vwoIc4!IsZi&>-(ANI6!RyuH|0`MkgKv896b&Nn zL$BH$M*){q7$OW2C!(kJ27t%%kgHV~^7SEMYOFNJc)9T4Km1Y1GEU;>*n0rJp1V>* zQBnf1aT#H4OiF?uxqf5?J%uYlW<;0oyFE7#!+Ui81bl#W-fl0>P3v1sy7yv_;0) z(-c3Jo+AUME%9TC$k=#no&P>plqu`V>z?N&Dx!dIG>#!=+g_J*K38oc=ta94p2bUW zQ7yof)-UWtRKkLen!**i`p~!P$~pb630n1gD$FWcs<6x^jY&y)!x|9`FwH%6qzscZu|wHJ*LsRmvab%o`9x zSjxQak(q9uaj|=28tc;N<@k`XRE}3uh6kaddA@iuK|h~=q3Fz$0M?nEU70Q|0huhT zh|I_OIZx78rrs_~;wX|tVDFF`&%*KEzECcc1Lrmdv%a74FQT+tYL#6ha~Pai{jzMs zs$QdcOV(80Y>XH>jy?qS~pRHR+c(cQlN8pA`y9 zUrZR|+Q(x8W)lC=(m%IZ0!01lgQpGNNbu7hxqY}%**0hJ+hkGHR!Y28M0}~=S7U7~ z(Fr$()ozpFvW$54=y^@rf!1-_EHQM|1kES@FJ%Joa_eqq#gWHr-EE_8av1)-?~3sc zIt@GPo|xmZ2!XFhn6hP-mkf5>O5SAyK(BA`BrgkV%-}xVz>4v43w@S9eucz1Q#i-uqs6 zq1|P>zpq9_G3{;FDR-87u$~%IM$s+}r-PRNVsD6cU#Fju+=}?Ir@sOLOyrRYBmleZ zU>EEj*ct2QsSHaUPCs>$tez8bqP*2^qB=;)|JQ`zz$cz!4-u~~QFW@_%CqF8EG&75 znr{MIV+jNw?+d5QFv&IJ0vj#>4^U>n=c*71FeUvQaT@{CQxCkx$kfe+^K60 z+o9qS74SvWX2V}l`hY;BAi&%84Tm*>IM~s%9Rn45^dZylH~-rcjs(D=0|^uRn=pXR zyb9Z3EszTv;os19@F6`*<`0Iee7vtzWT1VLF0@-AKYPs8bp&*76)&|4wl=`SnTR-K z<3aeMt~IQMj7LPniAb-I=1>>#@<~~6^Q>|p3_%TW#v(sOvgS`9*M%d-W$%opg1+$S z%0EHh7cIH)nszopo4$EdYYy(J`r0iPpst5cplp_16L$cBSvtO#IXAhMp05+l$_kga+lQT+DWS6?cPvPCULq)CJ`_5oY= zlrAZWbOYRCT{GZ%yJEED$d}oIQW&Ahdrbi)srg$IU+clPv(KLG;6M}QB2Kyi5D~Z( zok-;Pv}$^~P{uEsKX<(Y>9vM|j-^`d%9q|Rta1{qhy)@VE~VUmpS)PCY%HjH$9cCn zD<9v;-(g=53U^Xk^|n2FTK;m&`wYbHHC*X8G+aew(a=s_+N+x4Yf#qlT5Vx3#_`F@}j=q9N>F+Wf@dSVK{kD6hN*tAh5keK%fjsBEcR4EpAF zQgO&g#wvUQE*$VQB*V*+*0-n%g*28ae%t6{*qvS{C+C__w|OjJ%4jgV>#i�xiV( zg|`v8gyFABH`WtbJ;ZWi4Op<{5{{lERzOZb^mdueXK{Q^cd7YER&e=NV|ok*rs~<4 zILY7D0h+QiLP>7I(0hp*eXfSWR*>XTsquimt(bzy{r#sHKs86|6NclI%gMg_MmNVV z6bq4I@-k+i zr?e}{ROcmOof+mdS3~4!CBzF}(!B&)AJy%jhO6bnWUrd$vM?HT3kWha`HLysY zjisLY$*`s{D9?u}n~QLgbEFGX%7JjXJ^n>?Suh^GYq{c|d_Ep4&CPZ{gpRZ2(zDxC zdz<#Me;{>sZ(^WV4k(TZ+lL}3U!%t~GI&5_1O5qsSr+b-a9QGqaW!Y57{;Fq6~NC8 zt>I=pj1g^9>t|IEn;C34)?f$18NOlQZsdT|NZplzo_RQI_3{?HPj83Le_F+AxJgg< z|IXI=%b5SWcW#NLMBiEgz{QW53^d@n!DsaC4JH!#LxQ`pVoN}AfSJ0^*iz!3Eu_O3 zPNG!*L!Jk>YFYV)S&^DYEP;8*Ns80AkC7nn0F)nc6ai@DE0-Sj=!7L43$_LnV-ZF} z8e?hs)FfjbMMn2?;tT;7hl3GVJUnTLffx!4(sqI+@ZxUQs^%TClST2nb?6%vRwTBe z1sPu!z51@SuvIP4N(xCH8sEZ=u=1>JpR-{C*Fv?%z{alH1+2_j4XwcFfE{ zer8~%+?lI=-D_fG;nIx`B>k;bTuutIk_CyuW1nyUw`T=DJlUWEx3bir}bl@2&Axpap|AZIeG#X^d znQ1z2FA>1ZqySg**P%TzQLQ)~)meS2Ou+CM*V&~76zv)?`Hq0HV$7(fXO|f;ao|Sa z$iU}2;Q~ac1#}Ze3VS?t0SHNj%Sn9PO@CZP99+p$l9Y-j`=Z6ZtcsqH`G~N^?MUI} zBj}!pBImI|<^4F8dbF=gFXN4PLr4C0Em<+mK}usDd&3-a@doj1#Yz&t^X_rW6syo2 zuh(C8x)rcSiN|9!F!|(GMKC& z(d5tF1ZIG0o7JKt%c!MxMLI|M_mnH5z0dpKvis2aYs}!+KT01<|Pi1Lgp+CKO@y*Vi3YMH`K81LC;0m&9$5X-i+s7n&Q=@YWvoV z!TJD!8g#AQ8eaCk*|aqHd`WN5?45b2^>|%MZ9!T-H{j literal 4494 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 diff --git a/test/constraint/pt_line_distance/extended.png b/test/constraint/pt_line_distance/extended.png index 3aa6c218d77a0d2780a30121a2d6cb65c38fcd0b..b608b38fc7d7bba89b5b1cdddf6e5cd5b98cfbb9 100644 GIT binary patch literal 4587 zcmeHLX;f3!8a)XF0ZV}@iXg^Ltb!3Yw<5Tt@}RyUsfK&i?kd_s+d^ z)WSqcQb7^`Aa&$>qvHU;(ZY|o81$s*WLygXvN=bL4p;{#a9a=D=rB@{H_v%3 z%{h~N#%O}U^gfm!o)ffiMc%L~*Q(yd3eej)wdt+mmp^yZrt}oKUY7Z%dJGMs_p8bD zplc%zEvZ|FMjD700frYPmOEfFlIK_mC)m74Aak`^3LapOZktC!-mdm){0gBF{HE5R z3PP>?*)mIT6yncU2H^0CbIT##!`N$=4X|?WTha%wcz^`*Hy0{@W|Ql-!d?;ZYNmWi zLfhI_-S@|uZLAfJYh5S~2-oA5ptN{ffmSti1hnzO0%`&MyS`OG%wxWC!dW?P+zQE) zjI20b2v62E9+i53EMY;7^%#8{4LHDVSpfMHx)Ja%{P>c zoP=if{p36}9@~yUGkB5 zP-nn%k7fjjn58WAy|mubBz&z1K)Ro!sbmin-o_`1t_S{e3Pn~Lymg*h_o2buo8AXO z4{2^<|MZfE(}V9bZ$~^hNFoMIcd$?gVPYUct7M12Pv}-MNVc5gkQ`>`-S7T{6Q;#K z=wjfr*v&1PpNxY-czvWm;Li^pW>1y50fItO#(K@1(I-iL&D-;fIaD;2-nL|; zb>PX}9~ov?Zdq4eRlW|)fhP}=V}+IRHj$;APPfME!01}yNi#Dh?8y-ZdvdJ)Rt*McP&nDeDs~x%_)+i`;i*>1i8buWz;$*vhx)-_I2>o< zoQLq1h8wcIWcQb=xNL3Y+O5SyY{5@lBORS&NvARK-=Hl^*%;hRmh&GI;S;>1yVI3E zK3;Mo-3E}_38li)_hNc|Qy4X>DYj2L3q06LZEVRiux#seew}786L_&#&d}t^s>|kM zB1#06oh8bgzf5N$y(tk^IWia=Wom2)2k1NrHJvW$VDJNKm&-=C4;_I}qo&iCy=fTu z&%AuvNNT7o7+nyf&pIijT;2I^>Hu)~u4K+(>5roWUo2JT<&{h`%j4U8@)85`@}&Hl zu^vW!&S5r_`iw!#sby_tk#Rywew&kHDgwO9MOSa`^y9+`t&mN9?b2-OE`e&ieotv9 z5g{|2I<)~qKP#a|kcvB5@|%PjmW|)7pEVWCD4Kj{cOAh{p%U=n4QxAPlFtT7l-`#_ z#GvSX`!i}nZ}IKAR+JfOKg1~xvJkpDdwP<@NhC3216UK2Wq#j`cvRxX+E`vFPSA8p zLUDWBQAM;;>lZ|2&HxS5O==J2x4yLFeVzR>Q$rVtFp}dxOG|T+Z71y4bw!vcLqGgt z%Dm8=l8mlB4O#LCH(ZhWFmGKPrbJk;rj;t4p$$YYsV38&XDf@!$Dj_h-x31%&{%w_ zihZ1O8W7CABqs%cHJvx4o}bHg2Or#FV~&f=Tn;F zVw-F}juOjTFa2?BYG=+8B0-D|%y1S3^zY49lJacVqj`>jKLG-2p4iFAZESi<^jpOx zyM87%%CmBAI@&H|huMWXw0|_&#Ywaej!UdimjcwSbIO7ke%h%RZ2hryFODo9b+ZE# zd!s_~gN#G*_CB*Y9hz65qBTE(pUt>vCv2r(Qz{HRa-W+k0zNKW7*L*vCogGnqXGXa9q`>XNqK!Qj#$xd1VL zh^{2z2M~8vdyvFH;)LYK9pu#!whYQKyO}=y`XAR~-EjMxVa2vt$o= zsRnwUru8AbI&9CG9TI(>KDEIS(2KrMK!R3(;;Z1yNf#oG>F_FqHQhv^6o=^0&LxgbN&4Tb zrWbTIOO0XN`Vhc+etu+!mNn+Zi@NEP82Ua{P2SLnat2NwPK27?%X%jVb|EjpATR7%{-__071Hb5>f_y1#CbBXuezDVZOi|2H;~@L?T+KT zGQjtV zVp1EC!bX+Ww%o3FvWPOXOswdarl0SF_lpmtq9zq@1kC9*js<~~URSnrsZCUK05X$%o zA}zxu5){-8gi*5!HM*OuqD-217farNCJ@l0#8YCv$xXjOi)ehYF#KjqS|sH&ubwa4y?XBe literal 4568 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 diff --git a/test/constraint/pt_line_distance/normal.png b/test/constraint/pt_line_distance/normal.png index 12a66c1525a042043ae3ce1fc97c1403f86fd61b..8b7653016547e07cb492ca5841a9987376edeb1f 100644 GIT binary patch delta 1908 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 diff --git a/test/constraint/pt_on_circle/normal.png b/test/constraint/pt_on_circle/normal.png index 656005a3303a77b002ed2ead75ac2ae38be81b30..ace08cd9c29bcfe2136fe47af0b6d4263047a2f8 100644 GIT binary patch delta 2411 zcmai0X;hQf7QJ5viG+CwC@A0%6j4D6O;HG_U=@(k*9RdA#3BncWoQwF&`jV%0X3wt z5k-*76SZOZ5Sc+fg^Eg>U>k;NDFK8a5u${UGK4g&XS?37_wKrD-5+P&z0ca`oW0Ij zB9~aO$?D0${r;b&U!NLG{A%>EbXpp_@;eViz#=O%%3JMHu1a6RpQ{3HXsHf=WV$R=0E2(~QvNGy> z8wj{rSn8#-b@n5VH!-k4gnOU0S-1@)Pz#XK;P)(URX5jpa0Ohnt)SGje^UjosM)Pl|{gSGs>ebHr9th1xAmE>;VNxA-i^-#)Q0lL6W0BO_MR{|a+C z?<-+u8b8FQM5FSZe6D?vXztS>Z?!r4IbL=YL)iDxBdga7*BWXz-v?rUn)}(Z!}&?E zK?%_HY=nK2e!y6i>D%voA3S!3Cq4~5mZpzf2&Fy$wxnZH*n_g|mr_L;n$C=*#K=QC zLT&`|3Z6SSAXn3!&ormx{LxsF0QG#x{b9J+smgcor5C1@jLPruR?r3ICwBdWnm9U0 zhh@1QIlVq51{~k3v@c0FN0Nz=fN4Ro&ud&@7e7Hw@Q@L=&feG!_|l!I{C#E-)w!-5 z7S8oqu1LL~;OBrLoO7(|+nsj&r&P5e2sfu(_Kw?x!F|e!wWM6G@%)2{vX&K2qPp+s zq@BH*Vur{}CJTlKiW{GqM}n?RaB1pZYgz6}C4Q(1uC9;G!=~7y@T(jt(4_!2t;X&b z(bUz?A^U73%O4lP88xH4c{F>HTuuRM457t5;-$(Stq*>lN_1INT}MkT^zq|ytXb`9d%gb{^d^*6vwBDhkv#MWwE_4~_R*mCojX&;fG%{;9*?=g z-ZLQ7%13!2x_6$afh;78`y0Nzd+e(ZPdlty1BSvI0utWOM3Q#?RjlqsqVG`l)vhD01_TfvpKr!mtS%Z`mTym`w=*ZRC0LmhL-;N5 z=du$st?5%1Ks2xcvody_8QEb#EG9Vpwl>c0ZFSeX`F#eDY-nU6B?UENNQ)s-+zMLS zm&czfH(+RX|Dacni+4*{olF{!rCYbCssjTzw(s>CH9i25w$%z(Ng=4ZmX3>o*vkk@ ztB&AfyWh$OvYhdm3*)w`2=w zr?OY|6$V#=Qd5)&T^&7UI;{Z-bMZKjsk+Nr)kINzL5ok)UXuNPejDyP2knWp5PnZ7jBr%BxpR zYuS?em?`x-jq}?f2#=P1*LB)z>v5 zdE{bin|A}rKo)YP!(O$tq;$}F(0!G~sY&YeXr{Qf>)yDkBuY8RV~%A|Rq7!9A6?bg z@fYdshc6|XN?JOG(=}U~lV@83NY~;8%`cy_3tm5cutx`4@9u!bZ>f28$mw8I7^pzhe*7VMc#Asxz{YH3wz|Uc2ucI0uwd?)$ zKI4<}VJXXMq*zF=4o+B(ZEtd+}{=ee{S{;44uTrw&%#YB=#i)WuRN-cDp>MvTlGlm-sB zEqta78h&>wJw0jNjdN@pdy@msUFk>8{?nyA9w1J=N#+j>zfoRL_jQU1^3W*F?wau> zF?nX*Qge}i!(nBU(Y?s%D7Tn%f0i}6c5KQUkc{<9huOF%|KV1C=^=ipu??()j;~pD UOz4*r0`%u#z~TK>dudsJ0v=IU*8l(j delta 2344 zcmai0doNvbWzce zbIRVxpdq)6F0@l7n?c)QMh-KXW{(|%T+dj$&iV6v>s#yl<6Ymgp7(v9_gOE~I>-9z zHygY6`uQF@TPz*qPc++ZLS#LOVe8 zUq{u%0S333zkNyrsK;dg3B^b;k{7W%3~bP)nC^pZaH*^Rybe1F?X-zOd!44#0*5zz zWme_D&0mBVzHGGS4l8L_-Ju#F4eF)t{tE51&JNETa1iDJV0uZDRc2~kikXRQgBf9n zFFa9|Xk0lBkiN72f@&JxTX2irt8JyXp2uP>PQ{iIs;UQ@rsG8aKY3@{-Rz$D0QtmT zKJ%J(Ez(GfYIE)GN`2oB>gQIF?@vn6nty6*?T2SCi>afhQC68q2i>uj6i*e99Zp=Ny3k{)sVARp{XKLM`@0cj|G$d;{JKIhBzN#tlcByf;k)R zP)^bmD89wdX1=?Jtk}x^D$>s(ZJ;xTQrF&%$!z#x?Xy_XIB~R;+o>NHz+M31E zCmtB$*zdxR>jczaRUd?)!unIFD2Tqur>!UhSV)PLD(mI)c8=GR(d`=}lDEKUlE(cb z$qu3M@`I@piYGtQk9?BQGlC_VG>K?+xlwZW=D>}N!KKeVCv4~9-=r-FB?nh zcJb(U=0uATZ6k9{L9o8OiR=TaSjdd6^)F=uGf1d zs4b|vl-Qeiiw_sbDdybzo5n>E9a)+(5(bRk5=WK8;n`C<*60#>wX36i zJVXs7ut|^^i>l3b)OPU|s^7pgsRQ*x=EQDn9bk<0CvCWl10=idgQ@Qp`Q+-49jYH= zrYb{n(*K_;4GI5A^&kVrl_It?Y(ZBUE>-=8=qL(oCUTe)CVpx_V<48q!zY|9k)2jT zq`(#R!|}WK3`i6X1`)|!q_s9Rca?e1S`e#s%#TQxwy}Uy!Kzv%Z>v?MOCJtMg{Dm5 zZviKDPA$p`v1qUuVnS34E^bI|i?MwK#0#CbNF|IoV=y}wpoAOff8c!YZ-pm*UDb5} zVxqcEmCXldrG+&oWoYJvsth`2#1q?jFvAN~rCSsM@lA}{x*7bPgit#mE#&XCU4L&j z#t|%2kbpX4r_k-ZVF_jxt%g-UK4G^$&bHBA6xs8uXVeEu+bzvNMdm1<9CQ)_cL6dGYCxK?UyjPhZwM7AwdqRD&9ZofgZ@8ATl%DeJMLaDEPRDa|Jw%DB{y%lxH|u z=ei(9Ik*8l+-%1kpgbzcR46=$7w^P|+DR|19b*R1ZXyc))dGp~aE65*qGeFZ8%QIK z?CHB5*MItuCM?ZcbB0I5(nSj)slxB+jb-VI6NSf5$?>9$tMVq7h3ge9jZeZQO|*m> zFNv^g;Ni@Gycu))9c`jD%2V*0L@sQ4;RceLH%}HxB=i+2=g3T!qByOxYi26#uICLG z&iqG;g7(o)(098g>V0d}O6G)neB@F_YQnj*qZYbdEdjmMa*_ShUXMHdBf<3Czyos= zpEblm8O)5_!Gl%QnP30vVFHq|)OK|lr7pR@G4gRiRe-F8rd@a_V5nS1pLY{Ywbt}R zWo!Y#Ds?Gs|6X7gq-fTuh%Hk}ox{ELzCTLu?&3{eKo0y&TZN?i+G{$R=bMY#9%w6$ z30&g<;cqlG8Ozg37S>Ot$Ji@c_j}g7!y-!g&J8G$GQs?`A}Ob)L201i%x2wH6wA)o zw*~bb^PD>ubs<17++rZ`1}<6(;R8yPR^fwZ&(dTI9?LD_WWr9j&S7lTL1#}jp!?IA zyy>v3=VPlHtni#L>VQ*{fb7Ta@0oB>-AME#V7b*KcB1<{H diff --git a/test/constraint/pt_on_line/normal.png b/test/constraint/pt_on_line/normal.png index 4c87b6a49a47ead0bae918efe7e7cd9a249d4ace..0f10f4e004d0ccee8f89497179fb5b6a986e0b8b 100644 GIT binary patch delta 1905 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 LjD4pn0?PdbOa^A- diff --git a/test/constraint/pt_pt_distance/normal.png b/test/constraint/pt_pt_distance/normal.png index 7d29abf94ffd15448f4769914221cea1f3e542ce..1b9add3f99832d36e8d6ecd7dcf3ce67dec046e6 100644 GIT binary patch literal 4451 zcmeHLc~FyQ8h?`z1d&4#K@mZ%s9cL8mz*AW0u@mS31Ad36_lfj$Q8aI*40JgRiO}( z)m22Uhy*YY@+lptB1A0&L?BR#L87D*!jW+F0}TVZnYx|bKX#^nWHOU^lJ9+f&+mBN zoZaQVRdx2F*#H35?b|l*1^|tlcqu6&pHv)5Z2@4e(e}+7_MD`>YkeQyS+%gL!{v2a znEv7AzAc%no<>}>YT3$E5}h$gKeTyXrr&RsW*H>KPTJRalhyjYDeChr8C)|}0Hwz7 z2?c<-4y^(VT!|=6+0i{1)*5EBm_WTD_>PeHhsTk4^dF))SD(w* zopEe>cHGF*#Q;auy3xcAlHnZBtbzNe)u>iqK`}D(=VLRGiqRV z8|qm)g58X99tq0xy=#pE=JPb=4c^)5^@HeHAV*17uumJeWfZ`fG6c=@Z`d800kV7o zbypYe5rS^F=MkG`u+0jgV?#OsI%k#TQ7%(osib| zSw409{k`u-g8tjx%%!q1PZp=+gHw9k07&{#L7pO>QKRzPP_WTd#|_x49!|h~l?=h8 zobKcwW}qxzS(1Au4R#>f^LVR#qMf*FCidmO?BLZuDPQR zbgsw{tlE3LTKqo23k(i>WhcV@PjTFk?q$ zcU>HchKD|WMY4v2V2X2*RnnR8+MY9>%t5rUCN#x~Y8vbyrFn6&L;3m*x*(ZvvE}x- zYgw+efjw^D*sOsU*%suMHHevS_$u8gghZHk+y1&oUw)~iw>o5)=CDj4d9c>>6b9+) zPy%+Pxc6}lYx@iFl{cc!4D6FMPE=s4uryB1t+>5KVFB&$?0z0!GAu5y99A;1Ia^?8 zFZ{OX&Ykkp{DGykQ*grNQkKh!qVA}yNT-2UeBXeFNEfu9yh`%w7UN?yi^BZSD(*cw z+SmR82}QB!JY^FbR*$xSeB0VGwF(m7Z{n;{J;MapQg{kG@@Bx{TJkU3VjeK~F=tSt zh+&O!$~JXKPV>|`ER%Fcl9IpRX(YiVl@T&)@Wz^RjOZI2D@m*fRU&q&=m*tYDAbx10!9A$#myv*<;0 zVQ;KciT!s6*ADKqHu!Z*=-5{-uCBMlBsXVgZF)!=<>4$Bn5l#a5w%>b7uPH^%o42DexBz|7S2X z4Wk9SStvj}&R0Q{ckMHs{#y?v#RzJ5N>A1UU?+d=n07-!7WCRmskSW{g2Fp?ue=3m?;3YTn^laxq*T(0t-4`*Q&5iTr2_Rx5=0s#?s{i z5lLIwbm$Q=zKvqNiW$I*X;mNI0Egt~io3jX~{=&b<&egG# z&aVdGrtUg=RX`9H#A)F4%o%7%TZ>f#!Ru{2jX^gRUcYMMJ*DKZjX^k4BU&z0t1{gH zx_MD6akJu9MulV57x!~a;XIKdH`B>r5x5iC1_!wXpg@^TB#~iQ2p}6uL)uSha6^H+ z@*)-_D&+>dgl4IOq%IsK!fpf8+9P`1VSHItGml5;8!5>DzIjvEG4Ig`1<1I1b}pm0 zwNBc@b6|?CIk)#c(~S3{xc4u_QDY-eV@8Fp_I)E=vp^mr10%3X&_Y-RGAP53KI0hi+9ZJOCE+sE=BeW{k z-+aa#OwGA|hE>Prcj860=-|ChmW?ZC3y@! z@hdLh>A-p5qU22RZ&}vT^ZaO0G8W+UqUJAXM`^*w{0b&mXU8Gks*F^|J+NzYr8U*HPt?FiFh)v2KYV zt4?|icfUfs)z2xsRcCnkUWGVsyqS5xQ>qjAF#LSq2|YlYylRRT$?lC`cnA2e|LxE; a4qi0%pR(1iLjF4eV7rU^=KPJsgx>){Vl7Gl literal 4439 zcmeHLc~sKr8va0W$vr13C#A`&HHl>lSuSX$QK_xwf*W3Qm@?7HOmGD=t?cUU=1ogW zYObXhP|{orp~j@#tt7WxvXm<+C8CL^G%pbrx@Sg8`dEV!Jp7;Ho zKd=v@wn%3Y06=ZeZks~@KwTzZN(!=XO212K1wc!0kIi;RVp`v;&L6sV!Ozym`u!tN zZ=X+I%8mnTeD5CHs)4`zUc+@u^*?w2y`*EOX-(FSraXPrwIoGRpPa1&BR?MkG(~n| z*@?UKnE*VJhXd;r4iqS9%dYZ!0)QbE`{ ztMRKM*LDf7uvE+lh!C)!U{6*BRg-kpG3+=&>`$GB3q@;r9(y72Edh0(fK9c z%u749d9=0)0#=sEFZBQF5=q%@5RTz201dD!2d#j~8trKyF4Fi3SHBP^$z5cFIS4&` z>Xqg^P$%IJ)doO+!^4FDAN09F3jxgYvo{4(d|zk))ry(SyVjQYd|^$8sYII(Ibz{LZ%Tr3C9Y@E)VQ*@y}lznd-E zrxW6Ha~*|%?@%ASa~{RF6|pSXr} zYGXcE5>{3>$UVAO0poOv`wsKem9n!)HQMryMY6yP^8{1p5!uQ*&@`~EmOe_a6g?Q& z21~HRJ$$M}jyP{jMNwdPJ~Rz>A1S<-0AISKaG(_(6Qt!5xC5hd!e|(5$((5I`|9KijgpW3rIpGpte}9AG(0aN zHWP~0XOh{vDD|NWKPKr5)iS?fl20ZJ4+d{?y7KmBZPSB(({n~!i{b_4M#{*J48r3B z13`Kt%gCFp)+$a*yaNLj@C16sToPYaTmDk693Q=q-1E5>&O(6Gp6%XVXk{h>EK5?J zHjnZn)A&fGkspK;#S(GA`ZkqPy}*rza|BTOv0bJEWCwY88fUOQD^$h(y_o!Awr9Kj zb#RWQ;t7{<%MM3bf0KVOMzyb)Z&ImPKR>Y{*fP?D4WqTmb0X%Rzo2W;ROqC2<|x3q z@q1(gEPI)ol;-qXl5t`nFMr61rA!{3Irx)aDibe}`|0C=Y<%a8;ycTVCug%tjqh;=!vH_tPm?4Yu*X@bNhcMu$HmQ}XU(~N;Z_Ke>f^Qoi?~`e z-c4q*ov07{+t?5Ebch0$AAeQ*)u@EbD;T`Y%*^xJ6;oKLQsYx zrkuwu=F_u<%w4L3nzA5Z=;$vbBuA!%%O$QYAYZ`;%_mSWlq+jih6bHip=SX&dI?&xzLlGN^PU=i z%Ip|@(t~o~-NG~B^xh=c#2kCK19WgCsz|GqI$$dkEl11u))%-3&@_NguPGDz^~PLu zvN-fuW*Y}hFnF@rhDz^C?|^~?-#SjoCB4J#-UC{3 zmR1U~YEUUC!^1{^e}>ab&RPO2viKef^1O#vu@LJhdEWNPPxb?cpCIRDF{ubr$fROh zPt=${G~=5;jW;Ulq(%`S+1E{(3Q|Ztux5!Aocva)fX2tgax|0-%ra#<&jt=O4VdV2 zNU+id=dm`_JObd5+(mSO@-t`c47ba-8Ga|EQkFsO#5-)3r6W4I!3zV50_mLQURnz& zT^dkGkXGkqEg39JccyAbDDaHaJ;+w^NbN+6s1b;@AESp;l5pGjd8Qz9v3%Xq39b^+ zu|BvlUab5L4@=NN4#*gY-uf6ctA8Wtgvr?qNInxUjsODreO1d-f#C4#< zMiQyUdwaAqGoUzdxvN*7a9~4thS{T1vx$&&5sSwvjBGFiX^%EQ1+?8}$2VK{no$X7 zdCrN&5>lgJEDW7(+>T@(5sNgeoh1=!JbX?(Nu1PKFB-Aa0sC&Yb0if;`U1}vmU+pT zwu~F2t*hjzoDBpmbT7~Up7Vq)QCQ&lT6!7H8>zv*4EvA&wbR18QA5G92{X*`^@t*M zS7*M&QE1os;S`Zb&_%>ez*neaR&$AkN;F6NT0q|UZP$9#mEXMnp1VyhIGO#AgQB4K47*P# U-rsai_P_+}vE65ry#p8hGc9`um;e9( diff --git a/test/constraint/same_orientation/normal.png b/test/constraint/same_orientation/normal.png index c229e78af474f8a4b17f3525989e5ed4d7028287..b4a7a1c076ccca12141a9a689b3f37b43e6b8fa2 100644 GIT binary patch delta 2218 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 IYCZ>7teeu9@GKSvgIRRGPD`@Pbp8slW&8Yt3B5 zKBu(Rv~<Jb@5KWbn4gi!MLhcc~gxAw>7OmhEcg0`0>}Fr< z;duGwK=nk+unXb^`MI^xyt?bF48=+muyvvWa2jO~ywcBQk&z_mBWNFT7Yc^h$SgV@ zb?uh$nFrEMBp}C8cF-V_h>AnCq#_Y$PodHd4|4;KEI7it4N1r_Djsbtw?pn>ToD## zBcw&nqT~NPs%Rdp7wN6=WpQ|dGRnqf=Ju=UpTzov*%{>$C!<&Y>B1hkpu||t@elKt zC=|xR*MiP>OKG2fbA?y1PW7;&>=<`HEVm69dSHf$G)3NaIB=Du+p^1GomNe}7Lf9; zDT|z_?^^Q%`^?8g@nOF#>SMop-leT-TW*n(c~;)ke2NfT?L=jv6juJq2$TDCrOJHl zzoTth2Gl;AbV<483wh)o>wc?Y&j(81EmURF7mhW|U*G8^Qv*A#4o^T(al&^VnJCP}$cAaP!Xr5zLlSe`L z83e-b!GM<^{^J22DIho_M{#%@xh4dfSv8=Z=*OExF)O-a9Dro2QviIO)aL;l4>F)j z%jsFd&C(&ts!nzR@ZHL(gfF4-%@Xi6<9p2b773hcF^s&O(Bj^hDitLGp(H+L{w3MU zG0%<$9=wMc_m%)TeAeYompYMt;L99$(QbAq;U+DY1SgQNq)KJ3k`pRoWN=RxiAX#nuBTJN)g29(J+@Bb-X;P)jCT*QI?_Tbf|F}(hc zn^@d;`)w?ut7C4Gj%5xe0zwgz)m_#efmmEZz z;!=^hGRaRmguZCy;^dTP?CR;iG5U4i*udHIB&yiKjV8Wz2BOq;*orhdA10-j%yXuJ zZb6IEoi!pY>!Kq{hYd{gd!M`e9M`<@e+=MMw_OtBkDcoC<*l8kRRRbc3i*=p?H_79 zSn`tWWt_u+pbzuQAU>P*;3ViK@!7}MdQes`i!!o`8H>`rUrH|m-3n8T#BnKRZUk=( zotUP>%y9=%1doD{9X)yHee8kldTLpTE`|hLyXsMf{GwcDRc=;~l>M!kq^Hj<*VW#5 zesDC0W@X#J_MLc&bOut*wC?1WPDrh-%ou-K#{F3J(kt_BDyePzSj|I%szOET z0W7=~s|ieTqY0{vH`>BY+ZV#eT)Y7fb1nPo49%Qb%~>E_5@Z@S>&UM-Kd40Pwldv= zvjR^`RLW(#>cyk?R#|uB>-rw%r{Dz-+uL&tdF18hAy(+#unt)y_5Nr1SgyrqvOZ%F(hwwk@@x6xM{);w4)(DJd0E7<+55}A=bq1fIrr7N zesTSU4LfDK;$l+2tAF=WUohH3s!;CeNxZ{v7f>TV#y3!pdcC1!?t5K%JtT4WhCfRb zm6`RS#~&|@WCZFxN~i6s>KJS`8u*U$1$k%eEn{3NYzr0q=1G|La;_XxHcU$OM8p@h z!Lx+!tGIdHS|Njg!$))gzJLh8_i$dD7Rf}#q5_bss1Q^M@&TO&ovsxqy%3%~7GdG- zkz@#m(jp8f6)O5G5`*>;$Z&XGY2a>?Gf(6C6466x(3Kh_1y4eB7$<~<#-Yr}A#~dR z-D3jG(~7j}j#6`?PY34*p4lN#7dA-yoShi?V#fViz8W9ics<~t_AmYTw??BE%{*a) zZ4tLlJWNW;M3Rkh|1Xe+A_m~W4OQLZCyGjP%P-Yai5T!Aw;cHgj)H6< zxM0E9rvLT>kHC&@NU}ZNE_moNxHEuUbqs-{`}k8%pmMz!#Ac1Kb8tc77gnkR5qu|q zvN;Cn?ql3#&Iz}5FEH+$!!XO+Xj_nFEm{BGS3XOmN7I%jjm`XEvL`+$d`%hlJ$41T z?}loG@zwZ%v>DErF=&~C7FFlcl7ZE>J-8)kwBI}?P$$1VAm3IzUw7m{32YD^u$6N^ zJ(6AcO(>>npH!V!%Q|j&Dr8A7Cw+f8OY-8kwCL27{9@}&C{(ZD`-^l57 zlbh@2B8I=1xBp(T_zben$pc$5 z1i+t=0*EBIY7bi+1GV?of^cyZS{`=F4mgVjWO+xP_eH3Cr_iz*i<3xIaaPo6%-qnf zTX)>{y}dMAS<+zq9it69jo}r{k?Ac?o*6B*2T{>&Jq{vO7KI%>2rsY1R`9!IB+je$ zYI%G`ECHO)ug9ryH7hu>G%Y`y-01@6ko=NW^PzVDZ@=eO@zEc9pB<~Y|LBW>HWb(y z_GR|D$ItM<;wz5G&clMFO_qzOvO>;{bf6%Y6(+CpVDca*`qc_%oT*uNHohDvx@Y%@ zoh`d&Ug3|1PYRhl_JortraNXUNH*Rt8>;Jrz_$g{vb@9`6exh;=4}Ejh{K7({0P8- zNUyGn+Cv5&@|%#MsC-Tt_eS;OAp?mCm*zj7rQJ)BJ-Z=H(x8H1X8v>XDhc5xy7 zD-~OP4W82sl(>G%B+q8r4eyO275h(VMzxYcDr;22`r0_rF+DqClG2KDtWUZIT5p@W zUNV{W==WDmTY4k4OCREw`!BJ~eRW*P6>j&qiak7IIQoN8Dddhv99gvO7FplIn}x$; zDs4cow9+um3HRAvHSJ}K^7DS$vg@TOrw^Wc&Az(?A{(jV{`Xl`E#$1C3N{J^{L9Q0 zQv(R`w!V|{KFgPIb(@|tM4VSH(zs8}470|PW&j*~uY-v1_oh)f*J$8%xiQF+@hO8? zy=X4ZWJ>AT%~OUo(R(c=YgAn0nZ>C;{Ig+Vwt6e5kL@lq3EIwzxGCl*aF);F#iHqz zt>Hnv-^DF7GWklWCHMiCZ*ma|=Q{dxRb86h`Gf7;Hk(9S$!{HPa8Z+aq?6{U&r7H$ z)q{HdNQB0DIVjxw{GRh4e2D2yHCIreGSzzOeb$BIgQCuj-_Fx%g_?nfb*2{DjODbo zr%&CxdN95=R3yG57GA{mZu_;j5O7GVU+4*UWtIE|Fw=b*%2_Vjh>gvVffd@dV^3Ub IYCZ>7teeu9@GKSvgIRRGPD`@Pbp8slW&8Yt3B5 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 literal 4478 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 YTMw|FCN`wPe{6v5c8=R}w%}v`0GuG=RsaA1 diff --git a/test/constraint/vertical/pt_pt.png b/test/constraint/vertical/pt_pt.png index fbbab878d96b79b84dc2139a25fa761a3a0487df..9c4a3e0a95f056fe15100528cf036caa316302a4 100644 GIT binary patch delta 1772 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 diff --git a/test/constraint/where_dragged/normal.png b/test/constraint/where_dragged/normal.png index 681fc2e2114be85678a5e89dd5c33c4c4d6527df..cc92f24301e6d6c7fe83ead446d4a5ee7f4af639 100644 GIT binary patch literal 4239 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 LZ!2pH;mm&lV4