Python: неожиданный результат при преобразовании радиан в градусы и наоборот - PullRequest
0 голосов
/ 18 апреля 2020

При работе с наборами растровых данных, содержащих данные об уклоне местности, иногда необходимо преобразовать градусы в радианы или радианы в градусы.

В одной руке, чтобы преобразовать радианы в градусы, угол необходимо умножить на коэффициент преобразования

180 / π

, что эквивалентно 57,2958.

Это потому, что

1 радиан = 180 / π градусов

В другой руке, при преобразовании градусов в радианы, угол необходимо умножить на коэффициент преобразования

π / 180

, что приблизительно равно 0,01745.

Это потому, что

1 ° = π / 180 радиан

Однако, несмотря на наличие Ниже приведены правильные коэффициенты преобразования в переменных. Я продолжаю получать сообщение о том, что преобразование НЕПРАВИЛЬНО в моем коде PYTHON.

Переменная с указанием коэффициента преобразования для преобразования градусов в радианы:

deg2rad = pi / 1 80

Переменная с указанием коэффициента пересчета в радианы в градусы

rad2deg = 180 / pi

Насколько я Я обеспокоен тем, что я сравниваю правильные методы преобразования градусов в радианы и радианы в градусы, используя Python:

Преобразование синуса 1 в радианах в градусы, используя следующий код с коэффициентом преобразования:

sine_r2d = round (sin (1 * (rad2deg)), 2)

Должен привести к тому же выводу, что и код ниже:

sine_d = round (sin (math.radians (1)), 2)

Аналогично преобразование синуса 1 в градусах в радианы с использованием следующего кода:

sine_d2r = round (sin (math.radians (1 * (deg2rad))), 2)

Должен обеспечивать тот же вывод, что и код ниже:

sine_r = round (sin (1), 2)

К сожалению, это не то, что происходит. Странно, но вместо умножения я получаю вывод «Коэффициент преобразования ПРАВИЛЬНО» в моем коде, когда делю углы (в градусах или радианах) на соответствующие коэффициенты преобразования.

Например, если я использую :

sine_r2d = round (sin (1 / (rad2deg)), 2)

Я получаю такой же вывод, как:

sine_d = round (sin (math.radians (1)), 2)

Или, если я использую:

sine_d2r = round (sin (math.radians ( 1 / (deg2rad))), 2)

Я получаю тот же вывод, что и при использовании:

sine_r = round (sin (1), 2)

Это совершенно неожиданно для меня, и я просто не могу понять, что я делаю неправильно.

Решение этого поможет мне продвинуться вперед в увеличенном коде Python ( этот код: arcpy: значение RUSLE S - для значения NULL в растре не устанавливается значение NULL ).

# -*- coding: utf-8 -*-
"""
Created on Fri Apr 17 20:15:00 2020

@author:
Filipe S C Pinhati
PhD candidate
University of Queenland
School of Civil Engineering
Aquatic studies group

With the help of Mark Meyer
Mark Meyer sad: "math.sin() expects radians, not degrees."

This is code is related to the question in
Geographic Information Systems website
"https://gis.stackexchange.com/questions/357950/arcpy-usle-s-value-set-null-in-raster-is-not-setting-values-to-null"

Description: 

A series of IF/ELIF statements to compare manual conversion trigonometric methods
against the standard PYTHON methods

Background:

To convert radians to degrees the angle need to be multiplied by a conversion factor of
"180/π", or approximately 57.2958.
This is because 1 radian is equal to 180/π degrees

To convert degrees to radians the angle need to be divided by a conversion factor of
"180/π", or approximately  57.2958.
This is because 1 degree is equal to π/180 radian

"""

import math
from math import sin

#define the angle
a = 45

# defining the value of pi
pi = round((math.pi),8)

# conversion factor (cf)
cf = round(180/pi,6)

# output in degrees using no conversion factor
sine_d = round(sin(math.radians(a)),5) #correct

# output in radians using no conversion factor
sine_r = round(sin(a),5) #correct

# converts sine in degrees to radians using the conversion factor
sine_d2r = round(sin(math.degrees(a/cf)),5) #correct

# converts sine in radians to degrees using the conversion factor
sine_r2d = round(sin(a/cf),5) #unexpected conversion produces a correct result


# testing conversion factors
print "pi is ",pi
print "The conversion factor (cf) is ,", cf
print "You are converting the angle (",a,")"
print "The sin of ",a,"in radians is ",sine_r
print "The sin of ",a,"in degrees is ",sine_d
print " "
if sine_r2d == sine_d:
    print "*--The conversion factor sine_r2d is CORRECT --*"
    print ""
    print " Converting sin(",a,") in radians to degrees by multiplying it by 'cf'' is ", sine_r2d,
    print ",which is the same as using 'sin(math.radians(",a,")' = (", sine_d, ")"
    print ""
elif sine_r2d != sine_d:
    print "*--The conversion factor sine_r2d is INCORRECT--*"
    print ""
    print " Converting sin(",a,") in radians to degrees by multiplying it by 'cf'' is ", sine_r2d,
    print ", and it should be the same as using 'sin(math.radians(",a,")' = (", sine_d, ")"
    print ""
if sine_d2r == sine_r:
    print "*--The conversion factor sine_d2r is CORRECT--*"
    print ""
    print " Converting sin(",a,")  in degrees to radians by dividing it by 'cf'' is ",  sine_d2r,
    print ",which is the same as using 'sin(",a,")' = (", sine_r, ")"
    print ""
elif sine_d2r != sine_r:
    print "*--The conversion factor sine_d2r is INCORRECT--*"
    print ""
    print " Converting sin(",a,") in degrees to radians by dividing it by 'cf'' is ",  sine_d2r,
    print ", and it should be the same as using 'sin(",a,")' = (",sine_r, ")"
    print ""


...