在数组中绘制六边形
Draw Hexagon in Array
我需要编写一个函数,将如下所示的六边形绘制到二维数组中。我只知道数组的列大小,其余的需要计算。
但是,我正在努力解决它背后的数学问题。
这是我目前编写的代码:
function deg2rad(degrees) {
const pi = Math.PI;
return degrees * (pi / 180);
}
function getCos(deg) {
return Math.cos(deg2rad(deg));
}
function drawHexagon(cols) {
// upper left corner
const rows = parseInt(cols * getCos(30), 10);
const arr = [...Array(rows)].map(() => Array(cols).fill(''));
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (j > Math.floor(cols / 4) - 1 && j < (cols - Math.round(10 / 4))) { // middle section (square)
arr[i][j] = 1;
continue;
}
if (i < Math.floor(rows / 2)) { // top half
if (j < Math.floor(cols / 4)) { // left side (triangle)
if (rows / 2 / (i + 1) < cols / 4 / (cols / 4 - j)) { // seems to be right
arr[i][j] = 2;
}
} else { // right side (triangle)
if (rows / (i + 1) < cols / (j / 4 + 1)) { // wrong
arr[i][j] = 2;
}
}
} else { // bottom half
if (j < Math.floor(cols / 4)) { // Left side
if (rows / (i + 1) > cols / 4 / (j + 1)) { // seems to be right
arr[i][j] = 2;
}
} else { // bottom right
if (rows / 2 / (i + 1) > cols / 4 / (cols - j)) { // wrong
arr[i][j] = 2;
}
}
}
}
}
console.log(arr); // console.table() not available in snippet
return arr;
}
drawHexagon(8)
输出数组会给我这个:
所以左边和中间部分似乎是正确的。
如果有人能在这方面帮助我,我将非常高兴。
有两个问题,第一个是Math.sin()和Math.cos() returns结果有一些f浮点误差,因此计算不稳定。
第二个是几何计算,你忘记了斜边,如图所示三角形一定是一个直角三角形。
解决方法:
1- 计算 边 b 的长度,然后得到 斜边 (c) 并检查它。
2- 如果 a²+b² = c² 那么 (a, b, c) 是有效边,否则得到最接近的边边形成直角三角形。
3- 将数组内的点设置为二维网格(如上图)。
4- 连接点。最 有效的解决方案 我想是得到 最短路径 就像这些图中和线之间的正常连接一样,最短路径就是线本身.
5- Return 包含路径的数组,然后使用路径数组
为网格中的每个单元格分配值
这里link包含了我的实现,但是(没有最短路径函数,我把函数留空了)
我需要编写一个函数,将如下所示的六边形绘制到二维数组中。我只知道数组的列大小,其余的需要计算。
但是,我正在努力解决它背后的数学问题。
这是我目前编写的代码:
function deg2rad(degrees) {
const pi = Math.PI;
return degrees * (pi / 180);
}
function getCos(deg) {
return Math.cos(deg2rad(deg));
}
function drawHexagon(cols) {
// upper left corner
const rows = parseInt(cols * getCos(30), 10);
const arr = [...Array(rows)].map(() => Array(cols).fill(''));
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (j > Math.floor(cols / 4) - 1 && j < (cols - Math.round(10 / 4))) { // middle section (square)
arr[i][j] = 1;
continue;
}
if (i < Math.floor(rows / 2)) { // top half
if (j < Math.floor(cols / 4)) { // left side (triangle)
if (rows / 2 / (i + 1) < cols / 4 / (cols / 4 - j)) { // seems to be right
arr[i][j] = 2;
}
} else { // right side (triangle)
if (rows / (i + 1) < cols / (j / 4 + 1)) { // wrong
arr[i][j] = 2;
}
}
} else { // bottom half
if (j < Math.floor(cols / 4)) { // Left side
if (rows / (i + 1) > cols / 4 / (j + 1)) { // seems to be right
arr[i][j] = 2;
}
} else { // bottom right
if (rows / 2 / (i + 1) > cols / 4 / (cols - j)) { // wrong
arr[i][j] = 2;
}
}
}
}
}
console.log(arr); // console.table() not available in snippet
return arr;
}
drawHexagon(8)
输出数组会给我这个:
所以左边和中间部分似乎是正确的。
如果有人能在这方面帮助我,我将非常高兴。
有两个问题,第一个是Math.sin()和Math.cos() returns结果有一些f浮点误差,因此计算不稳定。
第二个是几何计算,你忘记了斜边,如图所示三角形一定是一个直角三角形。
解决方法:
1- 计算 边 b 的长度,然后得到 斜边 (c) 并检查它。
2- 如果 a²+b² = c² 那么 (a, b, c) 是有效边,否则得到最接近的边边形成直角三角形。
3- 将数组内的点设置为二维网格(如上图)。
4- 连接点。最 有效的解决方案 我想是得到 最短路径 就像这些图中和线之间的正常连接一样,最短路径就是线本身.
5- Return 包含路径的数组,然后使用路径数组
为网格中的每个单元格分配值这里link包含了我的实现,但是(没有最短路径函数,我把函数留空了)