2 回答
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;
}
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))
添加回答
举报