TransWikia.com

Unir dos coordenadas de una matriz usando distancia mínima con R

Stack Overflow en español Asked by rral on December 1, 2020

Estoy trabajando en un proceso de completación (no estoy seguro si es el término correcto) de una matriz basada en dos coordenadas de preferencia considerando la distancia mínima, me explico.

Tengo una matriz de nxm (filas y columnas), de valores NA y 1 ver figura 1:

introducir la descripción de la imagen aquí

El objetivo es:

  1. Encuentre los puntos extremos de los elementos contiguos que están unidos por una distancia igual a 1 (adyacente en la horizontal y vertical) o 1.4142 (adyacente en la diagonal). Las coordenadas extremas en el ejemplo están representadas por los rectángulos de la figura 1.

  2. Después de ubicar las coordenadas extremas de los grupos que tengas las distancias indicadas en el punto uno, se requiere completar las coordenadas que permita unir los dos extremos "de preferencia" considerar la distancia mínima entre los dos puntos. (ver líneas en la figura 1)

Suponiendo que encuentro las coordenadas extremas (a y b, ver figura 2), estoy tratando de usar la ecuación vectorial de una línea:

introducir la descripción de la imagen aquí

completa <- function(a, b, k){
  x <- y <- NULL
  resta <- b - a
  u_ba <- resta / sqrt(sum(resta^2))
  for (i in seq(0, 1, k)) {
    posi <- a + i * u_ba
    x <- c(x, posi[1])
    y <- c(y, posi[2])
  }
  coordenadas  <- cbind(x, y)
  return(coordenadas)
}

La matriz de ejemplo está en:

data_mat <- read.csv ("https://www.dropbox.com/s/hz42scjuf9uib9y/data_test.csv?dl=1")

considerando como ejemplo las coordenadas a y b
a <- c (25, 6)
b <- c (20, 10)

Al utilizar la función con las coordenadas con k = 0.5 (el valor de k puede variar entre 0 y 1), se obtiene lo siguiente:

completa (a, b, 0.5)
# x y
# [1,] 25 6
# [2,] 25 6
# [3,] 24 7

pero el resultado esperado es:

# x y
# [1,] 25 6
# [2,] 24 7
# [3,] 23 8
# [4,] 22 9
# [5,] 21 10 # o 21 9,
# [6,] 20 10

Es evidente que existe más de una solución para la línea, por lo que comentar que se puede considerar de preferencia la distancia mínima.

Finalmente, luego de tener estas coordenadas, solo bastaría con asignarles un valor igual a uno. La idea principal es hacer que este proceso sea recursivo. Y que al final se pueden unir todas las coordenadas de la matriz.

Por favor, cualquier sugerencia es bienvenida, gracias.

One Answer

Se me escapa un poco la forma en que lo estás resolviendo. En sí, para calcular los puntos y por cada x y poder completar los puntos de la recta que unen a y b, solo necesitamos averiguar la pendiente, que en este caso sería:

a <- c(25, 6) 
b <- c(20, 10)

# diff(y)/diff(x)
(a[1]-b[1]) / (a[2] - b[2])
-1.25

Con la pendiente, podemos ir generando valores para x, según la resolución k y obtendremos los puntos y. Como se trata de una cuadrícula, los valores de y deberían ser discretos, por lo que podríamos redondearlos:

completa <- function(a, b, k) {
  
  x <- y <- numeric(0)
  
  resta <- b - a
  pendiente <- resta[1]/resta[2]
  u_ba <- c(pendiente, 1)
  
  for (i in seq(0, resta[2], k)) {
    posi <- a + (i * u_ba)
    x <- round(c(x, posi[1]),0)
    y <- round(c(y, posi[2]),0)
  }
  cbind(x, y)
}

Como verá, el ciclo ha cambiado ya que se va haciendo de x1 a x2 y con la pendiente calculamos el valor de y, también agregamos un redondeo a cada eje.

Ejemplo, con k = 0.8 llegamos a una solución bastante óptima:

a <- c(25, 6) 
b <- c(20, 10)

completa(a, b, .8)

      x  y
[1,] 25  6
[2,] 24  7
[3,] 23  8
[4,] 22  8
[5,] 21  9
[6,] 20 10

Answered by Patricio Moracho on December 1, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP