Учитывая, что ты изначально даешь матрицу, то и вот тебе код соответствующий. Алгоритм в целом будет именно таким.
const shapeA = [
[0,0,0,0,0],
[0,0,0,1,0],
[0,0,0,1,1],
[0,1,1,1,1]
];
let shapeB = shapeA.flat();
let shapeC = [];
let x1 = 1;
let y1 = 1;
let l1 = shapeA.length;
let l2 = shapeB.length;
let l3 = l2 / l1;
shapeB.forEach((e,i) => {
if (i % l3 == 0) x1 = 1;
if (e == 1) shapeC.push({ x:x1, y:y1 });
if (i % l3 == l1) y1++;
if (i % l3 <= l1) x1++;
})
console.log(shapeC);
// [
// { x: 4, y: 2 },
// { x: 4, y: 3 },
// { x: 5, y: 3 },
// { x: 2, y: 4 },
// { x: 3, y: 4 },
// { x: 4, y: 4 },
// { x: 5, y: 4 }
// ]
Самое банальное, что приходит на ум для более реальной реализации поиска углов/вершин, это нарисованная фигура в canvas. Там можно использовать цикл вкупе с методом isPointInPath()... однако это очень локальный случай, и даже не вижу смысла заморачиваться.
На каком языке реализация не важно (но желательно на js), хочется именно понять алгоритм
Пример на картинках