如何在一个矩阵点图中计算一个区域内的宽高(这个标题真没有办法说清楚)
图片是一个8*8的矩阵图
请求后台接口会返回一个二维数组,数组元素是
[
[
'id' => 1,
'x' => 0,
'y' => 0,
'state' => 0
],
[
'id' => 2
'x' => 1,
'y' => 0,
'state' => 1
],
]
这里面的
x
,y
是每一个矩阵点的坐标
然后组成图片这样的排列
现在需要把请求的数据转换为
[
[
'x' => 0,
'y' => 0,
'size' => 4
'state' => 1
],
[
'x' => 3
'y' => 3
'size' => 3
'state' => 2
],
]
里面的
x
,y
是每一个区域块的起始坐标,例如最大的区域块需要的结果是 x = 0, y = 0, size = 4, state = 1
虽然 0-0不属于这个区域块的,但是这个区块的起点是0-0
而最长的那个区域块需要的结果是 x = 6 y = 0, size = 6 state = 1
size 其实就是 maxX - minX 和 maxY - minY 这 2 个值 谁大谁就是 size
所以求 size 前需要把 maxX minX 和 maxY minY 求出来
目前已经有思路,验证中
这个周末一直在研究这个
可惜在下实在是没有办法搞定这个需求
请求大家给一些思路
如果1和2是贴在一起的,那么是2个区域块
我尝试过的思路,计算每一个区块内元素可以延伸的最长宽度和高度,然后宽高最大的那个就是size,
结果我没有办法解决怎么区分每一个区域
尝试使用递归来区分区域块,但是执行的效率太低了
= =# 自问自答了,代码已经上传
简单说一下我的解题逻辑。
坐标数组,key 的范围是 [0-63], 和 xy 的关系
key = x * 8 + y
直接循环坐标数组,找到第一个state != 0 的数组作为基点,然后从它上面的元素开始,顺时针判断这些元素块,但是不找到全部,只要找到一个元素块,就把之前的基点 state = 0 ,基点更改为新的元素块,然后就一直找下去,最后周围都没有一个元素块的时候,基点把自己的 state = 0
在寻找的过程中,minx miny maxx maxy 都在不断的进行对比,最终确定这个区域的四个坐标值,然后计算起点坐标 宽度和高度
有这四个坐标值以后 直接清空这个区域内的所有同区域元素块
递归重新寻找下一个区域的基点
目前这套逻辑基本满足需求
但是还是有很多需要优化的地方