Tengo un bucle en el que itero sobre los datos de píxeles recibidos del método getImageData(). Allí encuentro las coordenadas de cada píxel (coordX y coordY). Luego filtro los píxeles según el color y quiero insertar los píxeles que necesito en el objeto de la siguiente manera:
result.coords[coordX][coordY].countedSi con números, entonces así:
result.coords = { 1: { 1: { counted: false, }, 2: { counted: false, }, }, 2: { 5: { counted: false, }, 8: { counted: false, }, 9: { counted: false, }, }, };Hice esto pero hay problemas:
var result = { coords: {}, }, pixel = new app.Color(), array = {}, coordX, coordY, i; for (i = 0; options.imageData && i < options.imageData.data.length; i += 4) { pixel.x = options.imageData.data[i]; pixel.y = options.imageData.data[i + 1]; pixel.z = options.imageData.data[i + 2]; pixel.a = options.imageData.data[i + 3]; coordX = (i / 4) % options.imageData.width; coordY = Math.floor(i / 4 / options.imageData.width); // Pixel filter by color if (pixel.x == 255 && pixel.a == 255) { array[coordY] = { counted: false, }; result.coords[coordX] = array; // .. next is the code that is not important .. } } Problema del siguiente tipo: cuando presiono una nueva coordenada Y , se agrega a la matriz para todas las X Pero puedo tener casos en los que, por ejemplo, la coordenada Y=5 no estará en la coordenada X=1 , sino solo en X=2 (como en el ejemplo anterior). Pero en mi caso, Y=5 también se agregará a X=1 .
Dígame cómo crear correctamente un objeto con la propiedad 'coords', en el que habrá propiedades X , en el que se almacenará todo Y relacionado con él, en el que también habrá propiedad 'contado' con valor False.
Editar:
me gusta esto:
data = {}; if (pixel.x == 255 && pixel.a == 255) { if (result.coords[coordX]) { for (var item in result.coords[coordX]) { data[item] = result.coords[coordX][item]; } } data[coordY] = { counted: false, }; result.coords[coordX] = data; data= {}; }Dada una i , el OP calcula coordX y coordY . Lo que se necesita es algo así como un inverso para producir una clave para la estructura de datos de conteo.
const width = options.imageData.width; function keyForXY(x, y) { return y * width + x } function setValueAtXY(object, x, y, value) { const key = keyForXY(x,y); object[key] = value; } function getValueAtXY(object, x, y) { const key = keyForXY(x,y); return object[key]; }Reemplace su acceso a la estructura de datos con estos, como...
if (pixel.x == 255 && pixel.a == 255) { setValueAtXY(array, coordX, coordY, { counted: false }); setValueAtXY(result.coords, coordX, coordY, array); }Tenga en cuenta que no estoy seguro exactamente de lo que está sucediendo en el OP semánticamente ... por qué, por ejemplo, estamos colocando un bool en un objeto o cómo se relacionan entre sí "matriz" y "result.coords", así que no estoy respaldando algo de eso, simplemente mapeando la lógica OP en una estructura de datos más apropiada (aparente).