JS:如何通过算法突出显示 x/y 坐标的菱形选择?

发布于 2024-09-27 23:49:55 字数 282 浏览 4 评论 0原文

如果给定一个创建 nxn 瓷砖贴图的数组数组,是否有一种方法可以循环遍历算法来突出显示形成菱形形状的瓷砖? (关键问题不是对其进行硬编码,因此它可以适用于任何尺寸的地图)

例如:如果地图是 5x5 的图块,如下所示:

XXXXX  
XXXXX  
XXXXX  
XXXXX  
XXXXX  

算法如何突出显示菱形形状,如下所示:

XXOXX  
XOOOX  
OOOOO  
XOOOX  
XXOXX  

If given an array of arrays creating an n x n map of tiles, is there a way to loop through an algorithm that would highlight tiles which form a diamond shape? (the key problem is not to hardcode it, so it could work for any sized map)

For example: if the map was 5x5 tiles like so:

XXXXX  
XXXXX  
XXXXX  
XXXXX  
XXXXX  

How could an algorithm highlight a diamond shape like so:

XXOXX  
XOOOX  
OOOOO  
XOOOX  
XXOXX  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梨涡少年 2024-10-04 23:49:55

我知道这是一个老话题,但我想我刚刚找到了最好的方法。

如果 cX,cY 是钻石的中心,r 是“半径”(不是直径),则在循环中使用此条件:

if (Math.abs(x-cX)+Math.abs(y-cY)<r)
    arr[x][y] = 1;      

因此 cX=2, cY=2, r=3 将绘制

0,0,1,0,0
0,1,1,1,0
1,1,1,1,1
0,1,1,1,0
0,0,1,0,0

现在您可以设置 cX 和 cY到您的鼠标位置并使用 r 增加/减少菱形大小。

I know this is an old topic but I think I just figured out the best method.

If cX,cY is the center of the diamond and r is the "radius" (not the diameter) use this condition in your loop:

if (Math.abs(x-cX)+Math.abs(y-cY)<r)
    arr[x][y] = 1;      

so cX=2, cY=2, r=3 would draw

0,0,1,0,0
0,1,1,1,0
1,1,1,1,1
0,1,1,1,0
0,0,1,0,0

Now you can set cX and cY to your mouse position and increase/descrease the diamond size using r.

情徒 2024-10-04 23:49:55

[工作示例]

function diamond(arr) {
  var len = arr.length;
  var mid = Math.floor(len / 2);
  for (var i = 0; i < len; i++) {
    var d = Math.abs(i - mid);
    for (var j = d; j < len - d; j++) {
      arr[i][j] = arr[i][j] = 1;
    }
  }
  return arr;
}

请注意,您尚未定义预期的偶数的行为

[Working example]

function diamond(arr) {
  var len = arr.length;
  var mid = Math.floor(len / 2);
  for (var i = 0; i < len; i++) {
    var d = Math.abs(i - mid);
    for (var j = d; j < len - d; j++) {
      arr[i][j] = arr[i][j] = 1;
    }
  }
  return arr;
}

Please note that you haven't defined the expected behavior for even numbers

恰似旧人归 2024-10-04 23:49:55
function diamond(arr) {

var m = Math.floor(arr.length / 2); // mid
var i = 0;
for (; i < arr.length / 2; i ++) {
  for (var j = 0; j <= i; j ++) {
    for (var k = 0; k <= j; k ++) {
      arr[i][m + k] = arr[i][m - k] = 1;
    }
  }
}

for (; i < arr.length; i ++) {
  for (var j = arr.length - 1 - i; j >= 0; j --) {
    for (var k = 0; k <= j; k ++) {
      arr[i][m + k] = arr[i][m - k] = 1;
    }
  }
}

return arr;

}

>>>示例:(9x9 数组)

diamond((function(n) { var a = []; for (var i = 0; i < n; i ++) { a[i] = []; for (var j = 0; j < n; j ++) { a[i][j] = 0; } }; return a;})(9)).join('\n');

=>输出:

0,0,0,0,1,0,0,0,0
0,0,0,1,1,1,0,0,0
0,0,1,1,1,1,1,0,0
0,1,1,1,1,1,1,1,0
1,1,1,1,1,1,1,1,1
0,1,1,1,1,1,1,1,0
0,0,1,1,1,1,1,0,0
0,0,0,1,1,1,0,0,0
0,0,0,0,1,0,0,0,0
function diamond(arr) {

var m = Math.floor(arr.length / 2); // mid
var i = 0;
for (; i < arr.length / 2; i ++) {
  for (var j = 0; j <= i; j ++) {
    for (var k = 0; k <= j; k ++) {
      arr[i][m + k] = arr[i][m - k] = 1;
    }
  }
}

for (; i < arr.length; i ++) {
  for (var j = arr.length - 1 - i; j >= 0; j --) {
    for (var k = 0; k <= j; k ++) {
      arr[i][m + k] = arr[i][m - k] = 1;
    }
  }
}

return arr;

}

>> Example: (9x9 array)

diamond((function(n) { var a = []; for (var i = 0; i < n; i ++) { a[i] = []; for (var j = 0; j < n; j ++) { a[i][j] = 0; } }; return a;})(9)).join('\n');

=> Output:

0,0,0,0,1,0,0,0,0
0,0,0,1,1,1,0,0,0
0,0,1,1,1,1,1,0,0
0,1,1,1,1,1,1,1,0
1,1,1,1,1,1,1,1,1
0,1,1,1,1,1,1,1,0
0,0,1,1,1,1,1,0,0
0,0,0,1,1,1,0,0,0
0,0,0,0,1,0,0,0,0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文