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))
添加回答
舉報