es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar elementos de un arreglo hasta alcanzar una longitud fija – JavaScript

Estoy intentando escribir una función de JavaScript que elimine elementos de un array hasta alcanzar una longitud definida. La función debería eliminar los “espacios” distribuidos de manera uniforme por el array. Necesito esta función para simplificar los vértices del polígono para dibujar en canvas.

Así es como debería funcionar:

Este es el código que he creado:

function simplify(array, vertices) {

  // Calcular el tamaño del espacio
  var gap = array.length - vertices;
  gap = Math.floor(array.length / gap);

  var count = 0;
  var result = [];

  // Rellenar un nuevo array
  for (var i = 0; i < array.length; i++) {
    if (count == gap) {
      count = 0;
    } else {
      result.push(array[i]);
      count++;
    }
  }

  // Eliminar 1 elemento en el centro si la longitud es impar
  if (result.length > vertices) {
    result.splice(Math.floor(result.length / 2), 1);
  }
  return result;
}

// ¡Esto da un resultado incorrecto según la longitud de la entrada!
// El resultado debería ser un array con una longitud de 3
console.log(simplify([
  { x: 10, y: 20 },
  { x: 30, y: 40 },
  { x: 40, y: 50 },
  { x: 50, y: 60 }
], 3))

Sin embargo, parece que esto solo funciona a veces y el problema puede estar en las matemáticas. ¿Cuál es el algoritmo que puede lograr esto o qué estoy haciendo mal?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con la implementación actual de la función simplify:

    1. El cálculo del tamaño de intervalo es incorrecto. Debería ser gap = Math.floor((array.length - vertices) / (vertices - 1)) para distribuir uniformemente los intervalos.
    2. El código solo elimina un elemento del medio si la longitud resultante del array es mayor que los vértices deseados. Debería eliminar elementos hasta que la longitud coincida con los vértices deseados.

    Aquí está el código corregido:

    function simplify(array, vertices) {
      // Calcular tamaño de intervalo
      var gap = Math.floor((array.length - vertices) / (vertices - 1));
    
      var count = 0;
      var result = [];
    
      // Llenar un nuevo array
      for (var i = 0; i < array.length; i++) {
        if (i == 0 || i == array.length - 1) {
          // Siempre incluir el primer y último vértice
          result.push(array[i]);
        } else if (count == gap) {
          count = 0;
        } else {
          result.push(array[i]);
          count++;
        }
      }
    
      // Eliminar elementos hasta que la longitud coincida con los vértices deseados
      while (result.length > vertices) {
        var index = Math.floor(result.length / 2);
        result.splice(index, 1);
      }
    
      return result;
    }
    

    Esto debería simplificar correctamente los vértices del polígono al número deseado de vértices mientras distribuye uniformemente los intervalos.

Comments are closed.