擅长:python、mysql、java
<p>如注释中所述,错误在于使用了错误的向量进行规范化。你知道吗</p>
<p>我想补充一点,<a href="https://stackoverflow.com/a/53797371/7207392">Binet-Cauchy</a>在这里也可以工作,而且比使用交叉积快得多。你知道吗</p>
<pre><code>import math
def angle_BC(plane1, plane2):
planes = np.concatenate((plane1[:2]-plane1[2], plane2[:2]-plane2[2]), axis=0)
a = (planes@planes.T).ravel().tolist()
return math.acos((a[2]*a[7]-a[3]*a[6]) / math.sqrt((a[0]*a[5]-a[1]*a[1])*(a[10]*a[15]-a[11]*a[11])))...
def angle_CP(plane1, plane2):
n1 = np.cross(*plane1[:2]-plane1[2])
n2 = np.cross(*plane2[:2]-plane2[2])
return math.acos(n1@n2 / math.sqrt(n1@n1 * n2@n2))
plane1, plane2 = np.array(((-1,1,0),(1,1,0),(1,1,1))), np.array(((0,0,0),(1,1,0),(1,1,1)))
angle_BC(plane1, plane2), angle_CP(plane1, plane2), np.pi/4
# (0.7853981633974484, 0.7853981633974484, 0.7853981633974483)
from timeit import repeat
min(repeat(lambda: angle_BC(plane1, plane2), number=10000))
# 0.08035301300697029
min(repeat(lambda: angle_CP(plane1, plane2), number=10000))
# 0.9213669009623118
</code></pre>