Lo siento si esto es un poco confuso, pero he estado atascado en esto durante mucho tiempo. Estoy trabajando en una aplicación de mapeo con coordenadas lat/lng. Para simplificarlo, usaré números enteros.
Digamos que tengo una línea de n puntos donde n > 0 (en este caso n = 3).

Esta línea se representa en el código como una matriz de puntos x, y
[ [1, 1] // E [2, 2] // F [3, 3] // G ]Necesito encontrar una manera de convertir esto en una matriz de segmentos de línea donde el siguiente segmento comienza en el punto del último.
Por ejemplo, la nueva matriz convertida a partir de la última se vería así:
[ [ //Line segment 1 [1, 1] // Point E [2, 2] // Point F ], [ //Line segment 2 [2, 2] // Point F [3, 3] // Point G ] ] Espero que esto tenga sentido. Esto debería funcionar si n es 1, 5, 200, etc.
Solo necesito el algoritmo para que el psuedocódigo funcione bien. Si debe tener un idioma que mecanografiado o c # son mis mejores.
Gracias de antemano por cualquier ayuda/consejo. Lo aprecio.
Este es un problema clásico del poste de la cerca .
El algoritmo es que cada elemento en el índice i en la matriz de salida es un par que consiste en el elemento en la posición i y el elemento en la posición i+1 de la matriz de entrada. La matriz de salida contiene uno menos elementos que la matriz de entrada. Si hay N elementos en la matriz de entrada, hay N-1 elementos en la matriz de salida.
En JavaScript se puede hacer con algo de ingenio como este:
const input = [ [1, 1], [2, 2], [3, 3] ]; const output = input.map((_, i, a) => [a[i], a[i + 1]]).slice(0, -1); console.log(output); Aquí el map se usa para preparar un par para cada elemento en la matriz original. Ese par consiste en el artículo y el artículo que le sigue. Podemos aceptar el hecho de que el lenguaje JavaScript tolerará el acceso a elementos más allá del final de la matriz al devolver undefined . El último elemento en el resultado contendrá un segundo elemento indefinido del par mientras intenta acceder al elemento justo después del final de la matriz. Esto es legal, pero no deseado, por lo que podemos slice ese último elemento (eliminarlo).
La mayoría de los lenguajes fuertemente tipados no le permitirán acceder al elemento en el índice N de una matriz de N elementos, por lo que, en realidad, construir su matriz de salida con un bucle o mapa directo donde i va de 0 a N-2 es lo mejor y solo seleccione elementos en el índice [i] y [i+1] para su par.
const input = [ [1, 1], [2, 2], [3, 3] ]; const output = new Array(input.length - 1); for (let i = 0; i < input.length - 1; ++i) output[i] = [input[i], input[i + 1]]; console.log(output); Escribí lo anterior como output[i] = [input[i], input[i + 1]] y predeclaré la longitud de la matriz de salida porque esto produce el código que más se acerca a la forma en que se expresa el algoritmo.
En C#, esto se puede hacer con una simple expresión LINQ:
var result = input.Zip(input.Skip(1)).ToArray();Recibirá una matriz de tuplas de valor, donde cada tupla contiene un par de puntos.
Demostración en línea: https://dotnetfiddle.net/b6z0es
var pts = new[] { (1, 1), (2, 2), (3, 3) }; var prevPt = pts[0]; var segments = pts.Skip(1).Select(pt => { var seg = new { a = prevPt, b = pt }; prevPt = pt; return seg; }); foreach (var s in segments) Console.WriteLine(sa + "-" + sb);producción: