Алгоритм отображения матрицы в относительном положении координат - PullRequest
0 голосов
/ 31 августа 2018

Существует ли какой-либо стандартный способ или алгоритм для преобразования матрицы ниже в относительном положении в пространстве, рассматривающий x=0 and y=0 как начало координат и вниз y-axis и вправо x-axis как положительные оси.

[ [{x:36,y:14},{x:242,y:14}],
  [{x:36,y:133}],
  [{x:36,y:252}],
  [{x:36,y:371},{x:242,y:371},{x:446,y:371},{x:651,y:371}],
  [{x:242,y:490},{x:446,y:490},{x:651,y:490}] ]

Теперь, поскольку длина этого массива массивов 5 и длина самого длинного массива в нем 4 , мне нужна преобразованная матрица размера 5 * 4 в нижнем формате.

[ [{x:36,y:14},{x:242,y:14},null,null],
  [{x:36,y:133},null,null,null],
  [{x:36,y:252},null,null,null],
  [{x:36,y:371},{x:242,y:371},{x:446,y:371},{x:651,y:371}],
  [null,{x:242,y:490},{x:446,y:490},{x:651,y:490}] ]

В указанном выше случае относительные позиции сохраняются.

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Решение сначала уменьшает все уникальные значения x в отсортированный плоский массив.

Затем переберите каждую строку данных и пройдите через каждый массив строк, вставив null в отверстия

let data =[ [{x:36,y:14},{x:242,y:214}],
  [{x:36,y:133}],
  [{x:36,y:252}],
  [{x:36,y:371},{x:242,y:371},{x:446,y:371},{x:651,y:371}],
  [{x:242,y:490},{x:446,y:490},{x:651,y:490}] ]
  
  
let xVals  = [...new Set(data.reduce((a,c)=>a.concat(c.map(({x})=>x)),[]))].sort((a,b)=>a-b)

data.forEach(row=>{
   xVals.forEach((x,i)=>{
      if(row[i] === undefined  || row[i].x > x){
          row.splice(i,0, null)
      }
   });
});

 data.forEach(arr=>console.log(JSON.stringify(arr)))
0 голосов
/ 31 августа 2018

Проверьте на этот кусок кода. Пояснение там будет прокомментировано.

function normalize(array){

	// Get the largest sub-array. We will save this as a reference
	// to use it later
	var longest_value = array.reduce((a,b)=>a>b?a:b)


	// map each element in the main array
	return array.map(function(a){ 

		// for each item return a modified copy of the largest one.
		// To do this we map it
		return longest_value.map(function(b,i){

			// we the item with the same x position in the current main array item
			var v = a.filter(r=>r.x==b.x)

			//if there is, we return it, is not we return null
			return v.length? v[0] : null
		})
	})
}


console.log(normalize([ [{x:36,y:14},{x:242,y:214}],[{x:36,y:133}],[{x:36,y:252}],[{x:36,y:371},{x:242,y:371},{x:446,y:371},{x:651,y:371}],[{x:242,y:490},{x:446,y:490},{x:651,y:490}] ]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...