<p>正负角的定义很大程度上取决于参考系或参考点。尽管它的定义是“正确的”,但基本的计算基本上可以根据两点之间的<a href="https://en.wikipedia.org/wiki/Slope" rel="nofollow noreferrer">slope</a>和由此产生的倾斜角来完成,该倾角可以通过对坡度应用<a href="https://en.wikipedia.org/wiki/Trigonometric_functions#tangent" rel="nofollow noreferrer">tan</a>来计算。在</p>
<p>在编程中应用<a href="https://en.wikipedia.org/wiki/Arctangent" rel="nofollow noreferrer">inverse tan</a>可能有点烦人,因为许多编程语言为此提供了两种不同的函数:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Inverse_trigonometric_functions" rel="nofollow noreferrer">^{<cd1>} or ^{<cd2>}</a>在Python的<a href="https://docs.python.org/3/library/math.html#math.atan" rel="nofollow noreferrer">^{<cd3>}</a>或{a6}中实现</li>
<li><a href="https://en.wikipedia.org/wiki/Atan2" rel="nofollow noreferrer">^{<cd5>} or ^{<cd6>}</a>由<a href="https://docs.python.org/3/library/math.html#math.atan2" rel="nofollow noreferrer">^{<cd7>}</a>或{a9}传送</li>
</ul>
<p>无论<code>math</code>模块或<code>numpy</code>包中的实现如何,这两个函数都会返回以弧度表示的计算角度,该角度基本上是基于数字Pi而不是度数,因此需要进行进一步的转换。这可以手动完成,也可以通过应用<a href="https://docs.scipy.org/doc/numpy-1.10.4/reference/generated/numpy.rad2deg.html" rel="nofollow noreferrer">^{<cd11>}</a>这样的函数来完成。为了获得数据点的基本概念,并对计算结果进行一些眼花缭乱的估计,我建议使用<code>matplotlib</code>绘制数据点。在</p>
<p>将前面提到的所有注意事项粘在代码中可以如下所示:</p>
<pre><code>import pandas as pd
import matplotlib
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
# Define some sample data points
coords = {
'A': (1.5, 3.0),
'B': (3.0, 5.0),
'C': (5.5, 4.5),
'D': (5.8, 2.2),
'E': (2.8, 1.2)
}
# Extract data values from `coords` dict
values = np.array(list(coords.values()))
# Calculate the averaged point of all data points
avg = np.mean(values, axis=0)
# Plot sample data for better overview
for k, v in coords.items():
plt.plot(*v, marker='o', linestyle='')
plt.text(*v, k)
plt.plot(*avg, marker='o', linestyle='')
plt.text(*avg, 'avg')
plt.show()
# For further information about slope and angle of incline
# see Wikipedia (https://en.wikipedia.org/wiki/Slope).
# Calculating the angle from `avg` to each point. Please adopt
# to your own needs if needed for other pairs of points.
# Calculate the distance in x- and y-direction from each point to point `avg`
distances_x_y = (values - avg)
# Depending on your definition of the 'reference point' consider using
# distances_x_y = (avg - values)
# For further explanation on `atan` and `atan2` see
# https://stackoverflow.com/q/35749246/3991125 and
# https://en.wikipedia.org/wiki/Atan2 .
# Using a for loop instead of numpy's array/vectors is not very elegant,
# but easy to understand and therefore has potential for improvements.
# Calculate angle from point `avg` to each other point based on distances
angle_radians = np.array([np.arctan2(element[1], element[0]) for element in distances_x_y])
# since `.arctan2()` or `.arctan()` return the angle in radians,
# we need to convert to degrees
angle_degrees = np.rad2deg(angle_radians)
# print results
print(angle_degrees)
</code></pre>