5 votos

Casco convexo en R

Tengo que dibujar un polígono que unirá los cuatro vértices de la parcela en R . Para ello necesito
valor mínimo de X que tiene el valor mínimo de Y.

X <- c(-62,  -40,   9,  13,  26,  27,  27)
Y <- c( 7, -14,  10,   9,  -8, -16,  12)
plot(x = X, y = Y)
abline(h = 0, v = 0, lty = 2.5, col = "green", lwd = 2)

enter image description here

Me cuesta encontrar cuatro vértices

  • mínimo de X y mínimo de Y (que es (-40, -14))
  • mínimo de X y máximo de Y (que es (-62, 7))
  • máximo de X y mínimo de Y (que es ( 27, -16))
  • máximo de X y máximo de Y (que es ( 27, 12))

en R.

6voto

user4812 Puntos 1149

Creo que quieres el casco convexo de tus datos. Prueba con esto

library(grDevices) # load grDevices package
df <- data.frame(X = c(-62,  -40,   9,  13,  26,  27,  27),
                 Y = c( 7, -14,  10,   9,  -8, -16,  12)) # store X,Y together
con.hull.pos <- chull(df) # find positions of convex hull
con.hull <- rbind(df[con.hull.pos,],df[con.hull.pos[1],]) # get coordinates for convex hull
plot(Y ~ X, data = df) # plot data
lines(con.hull) # add lines for convex hull

EDITAR

Si quieres añadir una línea desde el origen a cada lado del casco convexo de forma que cada línea sea perpendicular al casco convexo, entonces prueba esto:

getPerpPoints <- function(mat) {
  # mat: 2x2 matrix with first row corresponding to first point
  #      on the line and second row corresponding to second
  #      point on the line
  #
  # output: two points which define the line going from the side
  #         to the origin

  # store the inputs more conveniently
  x <- mat[,1]
  y <- mat[,2]

  # define a new matrix to hold the output
  out <- matrix(0, nrow = 2, ncol = 2)

  #  handle special case of vertical line
  if(diff(x) == 0) {
    xnew <- x[1]
  }
  else {
    # find point on original line
    xnew <- (diff(y) / diff(x)) * x[1] - y[1]
    xnew <- xnew / (diff(y) / diff(x) + diff(x) / diff(y))
  }
  ynew <- -(diff(x) / diff(y)) * xnew

  # put new point in second row of matrix
  out[2,] <- c(xnew, ynew)

  return(out = out)
}

Después de haber trazado los puntos iniciales, así como el casco convexo de los datos, ejecute el código anterior y el siguiente:

for(i in 1:4) {
  lines(getPerpPoints(con.hull[i:(i+1),]))
}

Tenga en cuenta que algunas de las líneas que van desde el origen a cada lado no terminarán dentro del interior del casco convexo de los datos. Esto es lo que obtuve como resultado:

enter image description here

4voto

Mohit Jain Puntos 412

No hay nada a priori que diga que tiene que ser así y (creo) las oscilaciones de los neutrinos han demostrado que tienen una masa que implica que existen tanto neutrinos diestros como zurdos. Dicho esto, el lagrangiano sigue estando muy sesgado hacia la interacción de los zurdos. Así que, en cierto sentido, sigue siendo muy zurdo, pero no hay nada que diga que un acoplamiento con partículas diestras esté descartado.

Simplemente no vemos un acoplamiento fuerte experimentalmente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X