javascript - 如何使用javascript检查html5画布中的未占用空间?
问题描述
如何检查画布中的空白区域?
这里的想法是创建如下所示的地图:
目前我正在使用一种方法来循环置换父节点周围的子节点,如下所示:
function getCircularAngles(points) {
return [...Array(points).keys()].map(
(num) => num * ((Math.PI * 2) / points)
);
}
function getCoorByAngle(
origin,
angle,
radius
) {
return {
x: origin.x + Math.sin(angle) * radius,
y: origin.y + Math.cos(angle) * radius,
};
}
function getCircularCoords(
origin,
points,
radius
) {
return getCircularAngles(points).map((angle) =>
getCoorByAngle(origin, angle, radius)
);
}
但是上面的方法并不是那么好。&我想要一种更有效的方法来做到这一点,以便更多地保留空间,并且节点感觉它们是以网格状方式而不是圆形方式排列的。
所以新的想法是
- 以最小距离检查最近的空白空间。
- 以不会与其他节点重叠的方式放置子节点。
- 继续所有节点和子节点的过程。
有人可以为此建议一个实现吗?
我尝试 过的尝试将整个画布转换为小单元格,然后将每个节点分配给每个单元格 && 将单元格的状态更新为已占用(这样不会发生重叠),并继续为其余节点执行此操作。但是这种方法效率不高,因为它在计算上非常昂贵(因为我必须遍历所有单元格,找到最近的未占用然后将节点分配给该单元格)&& 需要花费大量时间来分配位置应用程序初始化。
另一个想法是检查画布中占用的像素。像这样
var ctx = yourCanvas.getContext();
var pixelData = ctx.getImageData(0,0,ctx.canvas.width, ctx.canvas.height);
在上面pixelData.data
将是一个Uint8ClampedArray(16000000)
.
但随后还要检查空/未占用的空间将不得不循环并且计算成本很高
解决方案
推荐阅读
- android - RecyclerView 使用 Room 和 PagingListAdapter 向下滚动数据更新
- c# - 如何调查 Process.Start() 失败?
- dart - double.infinity 和 MediaQuery 有什么区别?
- javascript - 在指定的时间间隔内切换两次
- r - navbarPage Shiny 上的倍数文件输入
- angular - Angular 6 Firebase 返回重复数据
- mongodb - 构建包含字符串和正则表达式模式的 $in 数组
- ruby-on-rails - 使用委托给 getter/setter 时,Rails 无法将值大量分配给 DB
- spring - Lombok @RequiredArgsConstructor 不起作用,在 Eclipose 编译期间导致“空白最终字段可能尚未初始化”错误
- java - 为什么 JBoss 在部署之前就启动了?