Давайте начнем с funcAngle
, так как позже он вызывает computeDegree.
Первое, что он делает, определяет a
как кортеж из двух элементов. Большая часть этого кода, кажется, использует два набора элементов, с двумя частями, на которые ссылаются v[0]
и v[1]
или аналогичные. Это почти наверняка какие-то двухмерные векторы.
Я запишу их как ? для вектора, а также vₓ и vᵧ, поскольку они, вероятно, являются двумя компонентами. [не смотрите слишком внимательно на этот второй индекс, он полностью да, а не гамма ...]
a
- это разность векторов между s
и p
: то есть
a = (s[0]-p[0], s[1]-p[1])
- это aₓ = sₓ-pₓ и aᵧ = sᵧ-pᵧ; или просто ? = ?-? в векторе.
b = (sn[0]-p[0], sn[1]-p[1])
снова; ? = ??-?
c = a[0] * b[1] - a[1] * b[0]
с = aₓbᵧ-aᵧbₓ; c
- это перекрестное произведение ? и ? (и это просто число)
if p != sn:
d = computeDegree(s, p, sn)
else:
d = 0
Я бы взял вышесказанное в обратном порядке: если ? и ?? одинаковы, то мы уже знаем угол между ними ноль (и, возможно, алгоритм плохо работает), поэтому не вычисляйте его. В противном случае вычислите угол (мы рассмотрим это позже).
if c > 0:
result = d
elif c < 0:
result = -d
elif c == 0:
result = 0
Если c указывает в нормальном направлении (через правило левой руки - правило правой руки - не помню) это нормально: если это не так, нам нужно отрицать угол, по-видимому.
return result
Передать число, которое мы только что разработали, в другой код.
Вы, вероятно, можете вызвать этот код, добавив что-то вроде:
print (funcangle((1,0),(0,1),(2,2))
в конце и запустив его. (На самом деле эти числа не проверялись)
Так что эта функция вырабатывает a и b для получения c; все просто, чтобы свести на нет угол, если он направлен не туда. На самом деле ни одна из этих переменных не передается в computeDegree.
, поэтому computeDegree ():
def computeDegree(a,b,c):
Первое, на что следует обратить внимание, - это то, что переменные до этого были переименованы. funcAngle
прошло s, p и sn, но теперь они называются a, b и c. И обратите внимание, порядок, в котором они переданы, не совпадает с тем, что они переданы funcAngle, что неприятно и сбивает с толку.
babc = (a[0]-b[0])*(c[0]-b[0])+(a[1]-b[1])*(c[1]-b[1])
bab c = (aₓ-bₓ) (cₓ -bₓ) + (aᵧ-bᵧ) (cᵧ-bᵧ)
Если ? 'и ?' - это ?-? и ?-? соответственно, это просто
a'ₓ c 'ₓ + a'ᵧ c' ᵧ, или скалярное произведение ? 'и ?'.
norm_ba = math.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)
norm_bc = math.sqrt((c[0]-b[0])**2 + (c[1]-b[1])**2)
norm_ba
= √ [(aₓ-bₓ) ² + (aᵧ-bᵧ ) ²] (и norm_bc
аналогично).
Это похоже на длину гипотенузы ? '(и ?' соответственно)
norm_babc = norm_ba * norm_bc
, которую мы затем умножаем вместе
radian = math.acos(babc/norm_babc)
Мы используем функцию arccosine (обратный косинус, cos ^ -1) с длиной этих умноженных гипотенуз в качестве гипотенузы и этого точечного произведения в качестве смежной длины ...
degree = math.degrees(radian)
return round(degree, 1)
но это в радианах, поэтому мы конвертируем в градусы и округляем его для хорошего форматирования.
Хорошо, так что теперь это в математике, а не Python, но это все еще не очень легко понять .
(sidenote: именно поэтому имена и документы описательных переменных - друг каждого!)