Say you have a 2d matrix:
const matrix = [
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]
];
Which is represented as a list:
const list = [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5];
You can easily generate the list index in the list using the following:
function coordsToListIndex({ x, y }, width) {
return x + (y * width);
}
// index = 7
const index = coordsToListIndex({ x: 1, y: 1 }, 6);
What is the best way to translate in the opposite direction, from list index to coordinates?
What I've come up with is as follows, but I suspect there could be a better way.
function listIndexToCoords(index, width) {
let count = 0;
let x = 0;
let y = 0;
for (let i = 0; i < width; i++) {
count++;
x++;
if (count === index) {
break;
} else if (i == width - 1) {
x = 0;
y++;
i = 0;
}
}
return {
x,
y
};
}
// cords = { x: 1, y: 1 }
const coords = listIndexToCoords(7, 6);
Based on input and solutions from
Mike 'Pomax' Kamermans and shawn_halayka in the comments above.
function coordsToListIndex({ x, y }, width) {
return x + (y * width);
}
function listIndexToCoords(index, width) {
return {
x: index % width,
y: Math.floor(index / width)
};
}