javascript - 使用 JS/HTML5 Canvas 检测六边形中的所有像素
问题描述
在javascript中,我有一张地图,我想用六角形覆盖,并根据六角形中有多少土地将这些六角形变成绿色(土地)或蓝色(水)。我假设它与检测像素颜色有关,如果它在我认为蓝色的范围内,那么一旦它达到一定数量的水像素,它就会变成水瓦。
我遇到的问题是我知道我必须定义在哪里扫描我想要进行颜色检测的所有像素,但我不知道如何使用十六进制来做到这一点。使用方形网格,我可以做一个嵌套循环,但不知道如何用十六进制来做。
要绘制十六进制,我使用以下
function hex(x = 0, y = 0, side = 0, size = 10) {
ctx.beginPath();
ctx.moveTo(x + size * Math.cos(0), y + size * Math.sin(0));
for (side; side < 7; side++) {
ctx.lineTo(x + size * Math.cos(side * 2 * Math.PI / 6), y + size * Math.sin(side * 2 * Math.PI / 6));
}
}
但我不知道如何使用它来确定要检测的像素。我数学不好。
解决方案
您可以像矩形一样逐行扫描十六进制。但是你的内部循环应该改变它的限制。
你的六边形是平顶的,因为 (0,0)-centered hex left top vertex has coordinates (-side/2, -side * Sqrt(3)/2)
。让p = Sqrt(3)/2
.
所以外部(y坐标)循环限制是
-side * p .. side * p
对于给定的 y 坐标 x 限制是
-(side - 0.5 * Abs(y)) / p .. (side - 0.5 * Abs(y)) / p
德尔福代码:
var
ix, iy, side: Integer;
cf: Double;
begin
cf := Sqrt(3) / 2;
side := 100;
for iy := - Round(cf * side) to Round(cf * side) do
for ix := - Round((side - 0.5 * Abs(iy) / cf)) to
Round((side - 0.5 * Abs(iy) / cf)) do
Canvas.Pixels[ix + 200, iy + 200] := clBlue;
生成
推荐阅读
- python - 我不断收到模块'pandas'没有属性'DataFrame',我无法删除并重新安装pandas包
- android - 带有 DatePicker 的 AlertDialog 使用 Android Studio 进入 Fragment
- python - 如何理解 OpenCV-Python 中的 max() 函数
- java - 使用java删除XML DOM上的特定节点
- angular - 我可以在没有回调的情况下使用 `trackBy` 吗?
- database - ubuntu 中的直线:hive-jdbc-*-standalone.jar':未找到
- c - fwrite() 写入我期望的数量,而不是我想要的数据
- mongodb - Mongoose - 在嵌套数组中搜索,没有限制
- sql - 获取没有帖子或没有活跃帖子的用户
- php - 419 页面在 laravel 7 中已过期