From fd64ca6bcee83a71c5fb50d81b245b33489e2772 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Fri, 30 Aug 2019 13:45:08 +1000 Subject: [PATCH] region: correct the point-region distance2 calculation --- region.hpp | 7 ++++--- test/region.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/region.hpp b/region.hpp index 83a32347..df6edb8a 100644 --- a/region.hpp +++ b/region.hpp @@ -233,11 +233,12 @@ namespace cruft { distance2 (region r, point p) { auto const clamped = cruft::max ( - cruft::min (p, r.p + r.e), - r.p + r.p - p, + vector (0), + p - (r.p + r.e) ); - return distance2 (r.p, clamped); + return sum (clamped * clamped); } diff --git a/test/region.cpp b/test/region.cpp index fae3ac98..af63325f 100644 --- a/test/region.cpp +++ b/test/region.cpp @@ -102,5 +102,39 @@ main (int, char **) tap.expect (success, "make_range(region2i)"); }; + // test distance2 for points + { + struct { + cruft::region2f r; + cruft::point2f p; + float distance2; + char const *message; + } const TESTS[] = { + { + { cruft::point2f { 1, 1 }, cruft::point2f { 3, 5 } }, + { 0, 0 }, + 2.f, + "origin to offset rect" + }, + { + { cruft::point2f { 1, 1 }, cruft::point2f { 3, 5 } }, + { 2, 2 }, + 0.f, + "point inside region" + }, + { + { cruft::point2f { 1, 1 }, cruft::point2f { 3, 5 } }, + { 4, 7 }, + 1 + 4, + "offset point to offset rect" + }, + }; + + for (auto const &t: TESTS) { + auto const d2 = distance2 (t.r, t.p); + tap.expect_eq (d2, t.distance2, "region-point distance2: %!", t.message); + } + }; + return tap.status (); }