From d4a02c3613746d00c5c3b633005c2f572a2bd721 Mon Sep 17 00:00:00 2001 From: sanine Date: Fri, 25 Feb 2022 11:37:03 -0600 Subject: add square:intersects() --- city/geometry-test.lua | 37 +++++++++++++++++++++++++++++++++++++ city/geometry.lua | 18 +++++++++++++++--- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/city/geometry-test.lua b/city/geometry-test.lua index 758ce95..d48abbc 100644 --- a/city/geometry-test.lua +++ b/city/geometry-test.lua @@ -132,6 +132,43 @@ test( end ) +test( + 'intersect various squares', + function() + local center = geom.point(0, 0) + local square = geom.square(center, 2) + + -- overlap x/y + assert(square:intersects( + geom.square(geom.point(1, 1), 2))) + + -- nest inside + assert(square:intersects( + geom.square(geom.point(0, 0), 1))) + + -- nest outside + assert(square:intersects( + geom.square(geom.point(0, 0), 5))) + + -------- non-intersections -------- + + -- share x on left + assert(not square:intersects( + geom.square(geom.point(-2, 0), 2))) + + -- share x on right + assert(not square:intersects( + geom.square(geom.point(2, 0), 2))) + + -- share y on top + assert(not square:intersects( + geom.square(geom.point(0, -2), 2))) + + -- share y on bottom + assert(not square:intersects( + geom.square(geom.point(0, 2), 2))) + end +) -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- diff --git a/city/geometry.lua b/city/geometry.lua index 5893731..a24e508 100644 --- a/city/geometry.lua +++ b/city/geometry.lua @@ -62,15 +62,27 @@ geom.square = class{ return false end, + -- check if the square intersects the given square + intersects = function(self, square) + local overlap = function(a, b) + return math.max(a.min, b.min) < math.min(a.max, b.max) + end + local x_overlap = overlap(self.x, square.x) + local y_overlap = overlap(self.y, square.y) + + if x_overlap and y_overlap then return true end + return false + end, + -- return an array of four squares covering the same -- area as their parent divide = function(self) local this = getmetatable(self).__index - + local x = self.center.x local y = self.center.y local d = self.span / 4 - + return { this(geom.point(x-d, y-d), d*2), this(geom.point(x+d, y-d), d*2), @@ -105,7 +117,7 @@ geom.qt_node = class{ -- point isn't even in this region return false end - + if self:is_leaf() and not self.point then -- no preexisting point, just store it self.point = point -- cgit v1.2.1