straight right obtuse angles acute angle

right - straight angle



Convertir la dirección del viento en ángulos a palabras de texto (12)

Al revés:

function getDir($b) { $dirs = array(''N''=>0, ''NNE''=>22.5,"NE"=>45,"ENE"=>67.5, ''E''=>90,''ESE''=>112.5, ''SE''=>135,''SSE''=>157.5, ''S''=>180,''SSW''=>202.5, ''SW''=>225,''WSW''=>247.5, ''W''=>270,''WNW''=>292.5,''NW''=>315,''NNW''=>237.5, ''N''=>0,''North''=>0,''East''=>90,''West''=>270,''South''=>180); return $dirs[$b]; }

Tengo datos de dirección del viento que vienen de una veleta, y los datos están representados en 0 a 359 grados.

Quiero convertir esto en formato de texto (compás rosa) con 16 direcciones diferentes.

Básicamente, quiero saber si hay una forma rápida y elegante de escalar la lectura del ángulo a una matriz de 16 cuerdas para imprimir la dirección correcta del viento sin utilizar un montón de declaraciones if y verificar los rangos de ángulos

La dirección del viento se puede encontrar here .

¡Gracias!


Aquí hay una implementación de javascript de la respuesta de steve-gregory, que funciona para mí.

function degToCompass(num) { var val = Math.floor((num / 22.5) + 0.5); var arr = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]; return arr[(val % 16)]; }

Ver su respuesta para una explicación de la lógica.


Creo que es más fácil:

  1. Cambia la dirección por 11.25
  2. Agregue una "N" al final de la lista de direcciones para manejar ''más de 360'',

DirTable = ["N","NNE","NE","ENE","E","ESE", "SE","SSE","S","SSW","SW","WSW", "W","WNW","NW","NNW",**"N"**]; wind_direction= DirTable[Math.floor((d+11.25)/22.5)];


Lo comprobé y funciona muy bien y parece preciso. Fuente: http://www.themethodology.net/2013/12/how-to-convert-degrees-to-cardinal.html por Adrian Stevens

public static string DegreesToCardinal(double degrees) { string[] caridnals = { "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" }; return caridnals[(int)Math.Round(((double)degrees % 360) / 45)]; } public static string DegreesToCardinalDetailed(double degrees) { degrees *= 10; string[] caridnals = { "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N" }; return caridnals[(int)Math.Round(((double)degrees % 3600) / 225)]; }


Probablemente solo haría una simple división de grados para obtener una posición en una matriz o un valor de enumeración o algo que le dé el texto que necesita. Sólo redondea hacia abajo en toda tu división. 360/16 = 22.5, por lo que querría dividir por 22.5 para obtener la posición.

Cadena [] a = [N, NNW, NW, WNW, ..., NNE]


Se utiliza en Excel: VLOOKUP (MROUND (N12,22.5), N14: O29,2, FALSE)

La celda N12 es la dirección hacia en grados para la que se necesita una respuesta. La gama N14: O29 está buscando el sector (A a R):

SECTOR EÓLICO 0 A 22.5 B 45 C 67.5 D 90 E 112.5 F 135 G 157.5 H 180 J 202.5 K 225 L 247.5 M 270 N 292.5 P 315 Q 337.5 R


Si llegaste aquí y solo estás interesado en dividir tus títulos en una de las 8 direcciones.

function degToCompass(num){ const val = Math.floor((num / 45) + 0.5); const arr = ["N","NE","E", "SE","S","SW","W","NW"]; return arr[(val % 8)]


Tenga cuidado con el redondeo, los ángulos entre 349 ... 11 deben ser "N", por lo tanto, agregue primero la mitad del sector (+ (360/16) / 2), luego maneje el desbordamiento sobre 360 ​​por% 360, luego divida por 360/16:

["N","NNW",...,"NNE"][((d+(360/16)/2)%360)/(360/16)]


Yo uso R fuertemente y necesitaba una solución para esto. Esto es lo que se me ocurrió y funciona bien para todas las combinaciones posibles que lo he alimentado:

degToCardinal <- function(degrees) { val <- as.integer((degrees / 22.5) + 0.5) arr <- c("N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW") return(arr[((val+1) %% 16)]) }


esto funciona bien

#!/usr/bin/env python def wind_deg_to_str1(deg): if deg >= 11.25 and deg < 33.75: return ''NNE'' elif deg >= 33.75 and deg < 56.25: return ''NE'' elif deg >= 56.25 and deg < 78.75: return ''ENE'' elif deg >= 78.75 and deg < 101.25: return ''E'' elif deg >= 101.25 and deg < 123.75: return ''ESE'' elif deg >= 123.75 and deg < 146.25: return ''SE'' elif deg >= 146.25 and deg < 168.75: return ''SSE'' elif deg >= 168.75 and deg < 191.25: return ''S'' elif deg >= 191.25 and deg < 213.75: return ''SSW'' elif deg >= 213.75 and deg < 236.25: return ''SW'' elif deg >= 236.25 and deg < 258.75: return ''WSW'' elif deg >= 258.75 and deg < 281.25: return ''W'' elif deg >= 281.25 and deg < 303.75: return ''WNW'' elif deg >= 303.75 and deg < 326.25: return ''NW'' elif deg >= 326.25 and deg < 348.75: return ''NNW'' else: return ''N'' def wind_deg_to_str2(deg): arr = [''NNE'', ''NE'', ''ENE'', ''E'', ''ESE'', ''SE'', ''SSE'', ''S'', ''SSW'', ''SW'', ''WSW'', ''W'', ''WNW'', ''NW'', ''NNW'', ''N''] return arr[int(abs((deg - 11.25) % 360)/ 22.5)] i = 0 while i < 360: s1 = wind_deg_to_str1(i) s2 = wind_deg_to_str2(i) print ''%5.1f deg -> func1(%-3s), func2(%-3s), same:%s'' % (i, s1, s2, (''ok'' if s1 == s2 else ''different'')) i += 0.5


EDITAR:

Dado que hay un cambio de ángulo en cada 22.5 grados, la dirección debe cambiar de manos después de 11.25 grados.

Por lo tanto:

349-360//0-11 = N 12-33 = NNE 34-56 = NE

El uso de valores de 327-348 (todo el espectro NNW) no produjo un resultado para la respuesta de eudoxo. Después de pensarlo un poco, no pude encontrar la falla en su lógica, así que reescribí la mía.

def degToCompass(num): val=int((num/22.5)+.5) arr=["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"] print arr[(val % 16)] >>> degToCompass(0) N >>> degToCompass(180) S >>> degToCompass(720) N >>> degToCompass(11) N >>> 12 12 >>> degToCompass(12) NNE >>> degToCompass(33) NNE >>> degToCompass(34) NE

PASOS:

  1. Divida el ángulo por 22.5 porque 360deg / 16 direcciones = 22.5deg / cambio de dirección.
  2. Agregue .5 para que cuando trunca el valor pueda romper el ''empate'' entre el umbral de cambio.
  3. Truncar el valor utilizando la división entera (para que no haya redondeo).
  4. Indice directamente en la matriz e imprima el valor (mod 16).

Función Javascript 100% funcional.

function degToCompass(num) { while( num < 0 ) num += 360 ; while( num >= 360 ) num -= 360 ; val= Math.round( (num -11.25 ) / 22.5 ) ; arr=["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"] ; return arr[ Math.abs(val) ] ; }

pasos

  1. Dado un ángulo de 360 ​​grados
  2. Como el norte está entre -11.25 y 11.25, restamos 11.25 para mayor precisión.
  3. Divida el ángulo por 22.5 porque 360deg / 16 direcciones = 22.5deg / cambio de dirección
  4. Math.abs para como negativo sigue siendo el norte
  5. Seleccione el segmento desde arr desde la respuesta

Espero eso ayude