<p>本质上,这使用点积的定义来求解角度。你可以在<a href="http://sharetechnote.com/html/Handbook_EngMath_Matrix_InnerProduct.html" rel="nofollow noreferrer">this link</a>阅读更多信息(也是我发现这些图片的地方)</p>
<p><a href="https://i.stack.imgur.com/8ScHR.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/8ScHR.png" alt="Vector Graph"/></a></p>
<p>要求解角度,首先需要将3个输入点转换为两个向量</p>
<pre class="lang-py prettyprint-override"><code># Vector from b to a
# BA = (a[0] - b[0], a[1] - b[1])
BA = a - b
# Vector from b to c
# BC = (a[0] - c[0], a[1] - c[1])
BC = c - b
</code></pre>
<p><a href="https://i.stack.imgur.com/kCyht.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kCyht.png" alt="Dot Product Formulas"/></a></p>
<p>使用这两个向量,你可以通过首先用第二个公式求出点积的值来求出它们之间的角度</p>
<pre class="lang-py prettyprint-override"><code># babc = (a[0]-b[0])*(c[0]-b[0])+(a[1]-b[1])*(c[1]-b[1])
dot_product = BA[0] * BC[0] + BA[1] * BC[1]
</code></pre>
<p>然后通过返回第一个定义,您可以划分两个输入向量的长度,所得值应该是向量之间角度的余弦。使用数组表示法可能很难理解,但它只是使用毕达哥拉斯定理</p>
<pre class="lang-py prettyprint-override"><code># Length/magnitude of vector BA
# norm_ba = math.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)
length_ba = math.sqrt(BA[0]**2 + BA[1]**2)
# Length/magnitude of vector BC
# norm_bc = math.sqrt((c[0]-b[0])**2 + (c[1]-b[1])**2)
length_bc = math.sqrt(BC[0]**2 + BC[1]**2)
# Then using acos (essentially inverse of cosine), you can get the angle
# radian = math.acos(babc/norm_babc)
angle = Math.acos(dot_product / (length_ba * length_bc))
</code></pre>
<p>大多数其他东西只是用来捕捉程序可能意外尝试除以零的情况。希望这有助于解释为什么它看起来如此</p>
<p><strong>编辑</strong>:我回答这个问题是因为我很无聊,没有看到解释代码背后的数学原理有什么害处,但是在将来尽量避免问类似“这个代码是如何工作的”这样的问题</p>