from vector1 import AC, r, reduce '''revised 190227''' '''vector operations''' '''zero vector''' O = [0, 0, 0] '''basis vectors''' I = [1, 0, 0] J = [0, 1, 0] K = [0, 0, 1] def va(a, b): '''vector addition''' return [a_i + b_i for (a_i, b_i) in zip(a, b)] def vs(aList): '''vector sum: add together a list of vectors''' return reduce(va, aList) def vm(a, n): '''multiplication of vector a by scalar n''' return [n * i for i in a] def vdist(a, b): '''distance from a to b, i.e. b - a''' return va(b, vm(a, -1)) def u(a): '''unit vector''' return vm(a, 1.0/r(a)) def md2v(m, d): '''magnitude (m) and direction (d) to vector''' return vm(u(d), m) def cp(a, b): '''cross product''' if len(a) == 2: return a[0]*b[1] - a[1]*b[0] if len(a) == 3: return [a[1]*b[2] - a[2]*b[1], a[2]*b[0] - a[0]*b[2], a[0]*b[1] - a[1]*b[0]] def dp(a, b): '''dot product''' return sum([i * j for (i, j) in zip(a, b)]) def stp(a, b, c): '''scalar triple product''' return dp(a, cp(b, c)) def ang(a, b): '''angle between a and b''' return AC(dp(a, b) / (r(a) * r(b))) def axangs(a): '''angles between vector a and each axis''' return [ang(a, i) for i in (I, J, K)] def comp(a, b): '''scalar projection of a onto b''' return dp(a, u(b)) def proj(a, b): '''vector projection of a onto b''' return vm(u(b), comp(a, b)) def orth(a, b): '''proj(a, b) + orth(a, b) == a''' return vdist(proj(a, b), a)