def find_angle(atoms, target_coordinates, point1, point2): b, c = 0, 0 for i in range(3): o = find_intersection_point(point1, point2, atoms[i]) r = Vector(o, atoms[i]) f = Vector(o, target_coordinates[i]) if (r.len() < eps**10): print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") return Angle(0, 1) # если эти 3 точки лежат на одной прямой, что бы я ни делала, это ни на что не повлияет axis = Vector(point1, point2) / Vector(point1, point2).len() r1 = r / r.len() s1 = vmul(r1, axis) b += 2 * r.len() * (f * r1) c += 2 * r.len() * (f * s1) return Angle(c / sqrt(b**2 + c**2), b / sqrt(b**2 + c**2))
def renew_len(): for i in range(len(crd) - 1): for bond in bond_length[i]: if i < bond[0]: v = Vector(crd[i], crd[bond[0]]) k = bond[1] / v.len() tmp = crd[bond[0]] crd[bond[0]] = crd[i] + (v * k) for l in range(bond[0] + 1, len(crd)): v = Vector(tmp, crd[l]) tmp = crd[l] crd[l] = crd[l - 1] + v