为了账号安全,请及时绑定邮箱和手机立即绑定

有没有更简单的方法来分割图像?

有没有更简单的方法来分割图像?

皈依舞 2023-05-25 17:14:37
我有一个带有脚本的 HTML 文件,该文件给出了一个上面有扇区的地图。和A1、B2一样,但是有子扇区,每个扇区有1-9。例如,A1-5、B2-9 等。截至目前,我对每个子行业都有一堆 IF 语句。这是一个例子if (x > 2093-161/3 && x < 2093 && y < 1932-161*2/3 && y > 1771) {    var isnumber = "9";    }  if (x > 2093-161*2/3 && x < 2093-161/3 && y < 1932-161*2/3 && y > 1771) {    var  isnumber = "8";    }  if (x > 1932 && x < 2093-161*2/3 && y < 1932-161*2/3 && y > 1771) {    var  isnumber = "7";    }  if (x > 2093-161/3 && x < 2093 && y < 1932-161*1/3 && y > 1932-161*2/3) {    var  isnumber = "6";    }  if (x > 2093-161*2/3 && x < 2093-161/3 && y < 1932-161*1/3 && y > 1932-161*2/3) {    var  isnumber = "5";    }  if (x > 1932 && x < 2093-161*2/3 && y < 1932-161*1/3 && y > 1932-161*2/3) {    var  isnumber = "4";    }  if (x > 2093-161/3 && x < 2093 && y < 161*12 && y > 1932-161*1/3) {    var  isnumber = "3";    }  if (x > 2093-161*2/3 && x < 2093-161/3 && y < 161*12 && y > 1932-161*1/3) {    var  isnumber = "2";    }  if (x > 1932 && x < 2093-161*2/3 && y < 161*12 && y > 1932-161*1/3) {    var  isnumber = "1";    }有没有更简单的方法来做到这一点?
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

首先我们需要得到相对于每个扇区的x和坐标,这意味着我们需要将坐标转换为和之间的相对坐标。像这样:y0161


var xRelativeToSector = x % 161;

var yRelativeToSector = y % 161;

然后我们需要将这些相对坐标转换成列索引和行索引,我们有 3 种可能的列和 3 种可能的行,所以:


var column = Math.floor(3 * xRelativeToSector / 161);

var row = Math.floor(3 * yRelativeToSector / 161);

最后,我们使用column和row来计算使用此公式的数字row * numberOfColumns + column。请注意,我们案例中的行是从下到上排序的,因此我们使用(2 - row)代替row。我们还需要添加1到结果中,因为公式给了我们一个从 0 开始的索引,而我们想要一个从 1 开始的索引。像这样:


var isnumber = 3 * (2 - row) + column + 1;

因此,您可以简单地将这段代码分组到一个函数中,并使用它来获取子部门编号:


function getSubSectorNumber(x, y) {

    var xRelativeToSector = x % 161;

    var yRelativeToSector = y % 161;


    var column = Math.floor(3 * xRelativeToSector / 161);

    var row = Math.floor(3 * yRelativeToSector / 161);


    return 3 * (2 - row) + column + 1;

}


查看完整回答
反对 回复 2023-05-25
?
哔哔one

TA贡献1854条经验 获得超8个赞

数学的基本思想是使用除法和 mod 来得到余数。


var width = 2160;

var sectorW = 161;


function getSector (x) {

   var sectorX = Math.floor(x / sectorW);

   var sub = x - (sectorW * sectorX % x);

   var subSectorX = Math.floor(sub / (sectorW / 3))

   return {

     sectorX: sectorX, 

     subSectorX: subSectorX

   }

}


console.log( 100, getSector(100))

console.log( 180, getSector(180))


扩展它。我不确定你的实数系统是什么样的......但只是玩弄它。下面是基本思路


所以一个数字10,10像A1 a1


+-----------+-----------+-----------+

|A1         |B1         |C1         |

|  a1 b1 c1 |  a1 b1 c1 |  a1 b1 c1 |

|  a2 b2 c2 |  a2 b2 c2 |  a2 b2 c2 |

|  a3 b3 c3 |  a3 b3 c3 |  a3 b3 c3 |

+-----------+-----------+-----------+

|A2         |B2         |C2         |

|  a1 b1 c1 |  a1 b1 c1 |  a1 b1 c1 |

|  a2 b2 c2 |  a2 b2 c2 |  a2 b2 c2 |

|  a3 b3 c3 |  a3 b3 c3 |  a3 b3 c3 |

+-----------+-----------+-----------+

|A3         |B3         |C3         |

|  a1 b1 c1 |  a1 b1 c1 |  a1 b1 c1 |

|  a2 b2 c2 |  a2 b2 c2 |  a2 b2 c2 |

|  a3 b3 c3 |  a3 b3 c3 |  a3 b3 c3 |

+-----------+-----------+-----------+

var width = 2160;

var sectorW = 161;


function calcalateZone (x) {

   var sectorX = Math.floor(x / sectorW);

   var sub = x - (sectorW * sectorX % x);

   var subSectorX = Math.floor(sub / (sectorW / 3))

   return {

     sector: sectorX, 

     subSector: subSectorX

   }

}


function getLetterCode (v, upper) {

 // use base 36 to get letter code

 var letterCase = upper ? "toUpperCase" : "toLowerCase";

 return (v + 10).toString(36)[letterCase]();

}


function getSector(x, y){

  const coorX = calcalateZone(x);

  const coorY = calcalateZone(y);

  return {

    sector: getLetterCode(coorX.sector, true) + (coorY.sector+1),

    subSector: getLetterCode(coorX.subSector, false) + (coorY.subSector+1)

  }


}


console.log( 100, 100, getSector(100, 100))

console.log( 180, 100, getSector(180, 100))

console.log( 100, 180, getSector(100, 180))

console.log( 180, 180, getSector(180, 180))


查看完整回答
反对 回复 2023-05-25
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信