- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有由小单位六边形组成的六边形。每个六边形都有一个 hex number单位六边形。前几个编号如下:
Size 1:
0
Size 2:
0 1
2 3 4
5 6
Size 3:
0 1 2
3 4 5 6
7 8 9 A B
C D E F
101112
(最后一位为十六进制)
您可以将其旋转 60 度的倍数,以将每个索引映射到旋转后的索引上。这是它们顺时针旋转了 60 度。
Size 1:
0
Size 2:
2 0
5 3 1
6 4
Size 3:
7 3 0
C 8 4 1
10 D 9 5 2
11 E A 6
12 F B
我的问题是如何?我有这两个函数用于十六进制函数和反向十六进制函数:
function hex(n) {
return 3 * +n * (+n + 1) + 1;
}
function reverse_hex(n) {
n = (+n - 1) / 3;
var i = Math.floor(Math.sqrt(n));
// null if not a hex number
return i * (i + 1) === n ? i : null;
}
我可以轻松地进行 0 度和 180 度的旋转。只需旋转 60 度几次,我就可以推导出 60 度的其他倍数。
function rotate(index, direction, size) {
// The unit of direction is 60 degrees. So "1" == rotate by 60 degrees.
direction = ((+direction % 6) + 6) % 6;
switch (direction) {
case 0:
return index;
case 1:
// Something?
return transformed_index;
case 2:
return rotate(rotate(index, 1, size), 1, size);
case 3:
return hex(size) - index - 1;
case 4:
return rotate(rotate(index, 3, size), 1, size);
case 5:
return rotate(rotate(index, 3, size), 2, size);
default: // (NaN or +/-Infinity) % 6 is NaN
return null;
}
}
但我想不出一个算法来做到这一点。
最佳答案
一种方法是将十六进制排列成环,每个环作为一个数组,从 1 环到 6 环,依此类推。要旋转,您从每个环形阵列的顶部移动到底部。因此,如果您有一个大小为 4 的六边形,则外环从外环的顶部向底部移动 3,然后从下一个环向内移动 2,依此类推。
这确实使得在 2D 中获取索引变得棘手。您可以通过创建第二个行数组来解决此问题。每行都是环形结构中的一个索引数组。因此,如果您想要第 2 行的单元格,从左数第 4 行,您可以查找数组 pos[2][4] 以获得环索引。在示例中,我对环索引进行了编码,因此您只需要一个数字即可查找环,然后在环中定位。
该示例显示了一个大小为 5 的十六进制,创建时从左到右编号,然后是从左到右的下一行。六边形旋转了 60 度。
const ctx = canvas.getContext("2d");
const font = "arial";
const fontSize = 14;
function createHex(size) {
// create object to hold a hexagon
const hexagon = {
count: 0,
hex: [],
};
// do first two rows manualy
if (size >= 1) {
hexagon.hex.push([0]);
hexagon.count += 1;
}
if (size >= 2) {
hexagon.hex.push([0, 1, 2, 3, 4, 5]);
hexagon.count += 6;
}
// keep adding rings until correct size
for (var i = 3; i <= size; i++) {
const ring = [];
for (var j = 0; j < i * 2 + 2 + (i - 2) * 4; j++) {
ring.push(j);
}
hexagon.hex.push(ring);
hexagon.count += ring.length;
}
// get the max rign size to use as modulo for row column lookup
hexagon.maxRingLen = size * 2 + 2 + (size - 2) * 4
// create an array for row column lookup
hexagon.pos = [];
// pos to prevent the array from becoming a sparse array
// create each row array and fill with dummy data
for (var i = 0; i < size + size - 1; i++) {
const row = [];
for (var j = 0; j < ((size + size - 1) - (Math.abs((size - 1) - i) - 1)) - 1; j++) {
row.push(0); // add dummy data
}
hexagon.pos.push(row);
}
// this array contains row, column steps for the six ring sizes
const steps = [1, 0, 1, 1, -1, 1, -1, 0, 0, -1, 0, -1];
// each ring starts at the top left and goes round clockwise
for (var i = 0; i < size; i++) {
const ringIndex = size - 1 - i
const ring = hexagon.hex[ringIndex];
var x = size - 1 - ringIndex;
var y = size - 1 - ringIndex;
for (var j = 0; j < ring.length; j++) {
// add the ring position index
hexagon.pos[y][x] = ringIndex * hexagon.maxRingLen + j
// find the next row column pos
const side = Math.floor(j / ringIndex) * 2;
x += steps[side];
y += steps[side + 1];
}
}
// now that we have the row column lookup you can
// create the correct sequence of numbers in the hexagon
// starting at top left moving from left to right all the way to the
// bottom right last number
var count = 0;
for (var i = 0; i < hexagon.pos.length; i++) {
const row = hexagon.pos[i];
for (var j = 0; j < row.length; j++) {
const ringPos = row[j] % hexagon.maxRingLen;
const ringIndex = Math.floor(row[j] / hexagon.maxRingLen);
hexagon.hex[ringIndex][ringPos] = count++;
}
}
return hexagon;
}
// rotates a hexagon 60deg
function rotateHex(hexagon) {
const size = hexagon.hex.length;
for (var i = 1; i < size; i++) { // from inner ring do each ring
const ring = hexagon.hex[i];
for (var j = 0; j < i; j++) {
// move the top to bottom of ring array
ring.unshift(ring.pop());
}
}
}
// just renders for testing.
function renderHex(hexagon, pos) {
const steps = [1, 0, 0.5, 1, -0.5, 1, -1, 0, -0.5, -1, 0.5, -1]
ctx.font = (fontSize-4) + "px " + font;
ctx.textAlign = "center";
ctx.textBaseline = "middle";
const size = hexagon.length;
for (var i = 0; i < size; i++) {
const ringIndex = size - 1 - i
const ring = hexagon[ringIndex];
var x = pos.x - (ringIndex * fontSize * 0.5);
var y = pos.y - (ringIndex * fontSize);
for (var j = 0; j < ring.length; j++) {
ctx.fillText(ring[j].toString(36), x, y);
const side = Math.floor(j / ringIndex) * 2;
x += steps[side] * fontSize;
y += steps[side + 1] * fontSize;
}
}
}
var h = createHex(5);
renderHex(h.hex, {
x: canvas.width * (1 / 4),
y: canvas.height * (2 / 4)
});
rotateHex(h);
renderHex(h.hex, {
x: canvas.width * (3 / 4),
y: canvas.height * (2 / 4)
});
<canvas id="canvas"></canvas>
关于javascript - 旋转六边形上的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44607380/
可以用纯 CSS3 创建这样的六边形吗? 谢谢你的帮助! 最佳答案 一个简单的搜索就找到了:CSS Hexagon Tutorial 引用自网站: Put a 104px × 60px div wit
我有一个简单的六边形网格,我在其中选择一组六边形,然后用一些随机点填充这些六边形。 让我解释一下生成点的具体过程: 我使用六 Angular 坐标列表选择六边形。 将六边形分组为区域。 分别为每个区域
如何实现如下所示的六边形 ImageView 。 http://imgur.com/1PEGuQu 请注意,我尝试了这个问题的解决方案: How to give hexagon shape to Im
我正在尝试制作一款游戏,让用户获得经验值并提高等级,如下图所示。 我想通过使用进度条来实现这一点,但我无法制作一个六边形的进度条。 黄线应该随着用户积分的增加而增加。 谁能告诉我如何实现这一点?(我试
我正在尝试制作可以绘制五边形六边形等的函数。算法有问题,我应该将线条与 pygame.draw.line 进行比较吗?看起来围绕确定线坐标的工作太多了。有没有简单的方法来绘制它们?我也不知道另一个可以
我正在尝试创建一个六边形小部件。这应该看起来像这样: (请忽略横线) 在手机上是这样的: 现在六边形本身应该相当容易,网上有很多关于如何创建它们的文档。但是,关于如何添加这样的文本的信息很少。 通常,
我想用 ggplot 的漂亮框架创建一个绘图。这是一个六边形的密度图。我使用了 https://www.r-graph-gallery.com/329-hexbin-map-for-distribut
我是jointJS的新手,我需要使用JointJS创建自定义形状,我尝试使用矩形创建菱形,使其高度和宽度相同,然后旋转45度,如下所示, var diamond = new joint.shapes
这个问题在这里已经有了答案: How to make a curved edge hexagon by using CSS (6 个答案) 关闭 8 年前。 我正在尝试使用 CSS 制作一个形状:圆
我有一个由 CSS 创建的六边形。我试图在六边形内获取标题、段落和按钮,但所有这些元素都隐藏在格式化前后的六边形后面。这是代码的链接:https://jsfiddle.net/o8a3pm3h/6/
这不是关于如何使单个元素成为六边形的问题。有很多这样的。 这是一个问题,看看是否有办法创建纯 css 六边形背景。 我得到了 kind of close by creating triangles :
是否有机会在六边形内放置图像?我习惯了hexagonal shaped cells in html ,但我无法用(背景?)图像填充它。 这是我尝试过的: .top { height: 0; w
我喜欢将 CSS3 六边形置于 div 的中心(请查看下面的屏幕截图)。我使用 Foundation Framework,因此 Hexagon 由列包装器包装(在本例中使用类“warpper”)。 我
我有一个六边形,我想在它的每个 Angular 上写点东西。确切地说,我想从六边形的外部区域命名它的每个 Angular 。你可以在这个 jsfiddle 中看到代码.这是我现在拥有的: HTML:
我制作了一个具有笔划宽度的圆形六边形,但顶部和底部曲线较暗。如何给边框均匀的描边宽度?这是我的 svg 代码
我正在尝试在 Android 上实现圆角六边形 ImageView 完全像这个但是六边形: 我尽了最大的努力,但都失败了,我确实找到了this答案是完美的,因为它可以让你输入所需的边数,剩下的就由它来
我在这个网站上有问题:http://www.dark-project.cz/wesnoth/map-view/1 (点击单位)。在我的 Javascript 源代码中 http://www.dark-
我正在通过 Unity 创建一个简单的六边形几何数学游戏。这确实与 Unity 无关。 我借了Image来自 https://catlikecoding.com/unity/tutorials/ ,
我试图在六边形 div 周围放置一个边框,或者更准确地说是 3 个 div 的六边形可见区域。我已经尝试了一些不同的方法来创建一个边框来玩弄 div 的可见性。我在下面的示例中拥有的是我最接近的,但仍
是否可以创建一个属性设置为 % 而不是 px 的六边形?所以我可以在我的网站中创建一个宽度和高度为 100px 的 div 容器,设置为 100% 宽度和高度的六边形会占据整个 div?感谢您的任何回
我是一名优秀的程序员,十分优秀!