早上好,晚上或晚上,
我已经在这里和网络上彻底搜索了答案,但是找不到解决方案。 假设我在像这样的网格上有一个与轴对齐的矩形:
o o o o o o o
o x x x o o o
o x x x o o o
o x x x o o o
o o o o o o o
o o o o o o o
o o o o o o o
现在假设我像这样移动矩形(在x轴上移动1,在y轴上移动2):
o o o o o o o
o o o o o o o
o o o o o o o
o o x x x o o
o o x x x o o
o o x x x o o
o o o o o o o
现在有3个不同的区域:
o o o o o o o
o F F F o o o
o F F F o o o
o F B B N o o
o o N N N o o
o o N N N o o
o o o o o o o
F是前一个位置所填充的区域,B是两个位置都覆盖的区域,N是新位置所覆盖的区域。
给出2个中心位置(此处是(2,2)表示前一个位置,(3,4)表示新位置)及其延伸(这里1个表示两个矩形,表示矩形的宽度和高度始终为1 + 2 * extend-它们是正方形,是的,但是我想要一个没有设置此要求的解决方案)如何合理地有效地找到3个区域,尤其是F和N区域?
F和N显然总是点对称的,但是要考虑3种不同的情况:
在一个轴上移动位置只会导致区域F(因此也将N)变成单个矩形(例如3x3矩形在x轴上移动2)
o o o o o o o
o F F B N N o
o F F B N N o
o F F B N N o
o o o o o o o
在两个轴上的移动位置都可能导致区域F和N为“复杂形状”,每个形状都可以用2个矩形来描述(例如在第一个示例中,顶部在x轴上移动了1个矩形, y轴上乘2)
-在至少一个轴上移动超过extendFormer + extendNew + 1,导致再次出现单个矩形,如
o o o o o o o
o F F F o o o
o F F F o o o
o F F F o o o
o o o N N N o
o o o N N N o
o o o N N N o
如果答案是B区域为1个矩形,F区域和N区域分别为2个矩形(它们的左上角和右下角坐标),我将很高兴。 (在区域F和N如上面所描述的那样适合于单个矩形的情况下,我可以使它们的第二个矩形的大小为0x0)
并快速地将其放入上下文中:给定玩家的位置和loadRange,它是在玩家周围加载块。目前,我将球员的旧位置和新位置周围的所有块都放入2个单独的列表中,这样我就可以从另一个列表中减去这些列表,从而获得F或N中的块
但这需要我遍历很多块,我只是感觉有一个更优雅的解决方案,它为我每个区域B和N提供2个矩形,然后我可以遍历以触发加载或卸载,而不必在两个示例中都可以迭代所有块
在这些示例中,区域B似乎很小,但是在游戏中,loadRange为16,玩家通常只能移动一个块(尽管他们可以一次移动几个块),所以不必重复遍历B区域有很大的好处
已经在此先感谢了来自郡的问候, samwise