def eigenpairs(self): a, b, c, d = self.flat l1 = (d + a + self._sqrt(d * d - 2 * a * d + a * a + 4 * c * b)) / 2 l2 = (d + a - self._sqrt(d * d - 2 * a * d + a * a + 4 * c * b)) / 2 try: v1 = Vec(b / (l1 - a), 1) except ZeroDivisionError: v1 = Vec(1, 0) try: v2 = Vec(b / (l2 - a), 1) except ZeroDivisionError: v2 = Vec(1, 0) return [(l1, v1.normalize()), (l2, v2.normalize())]
def eigenpairs(self): a, b, c, d = self.flat l1 = (d + a + self._sqrt(d * d - 2 * a * d + a * a + 4 * c * b)) / 2 l2 = (d + a - self._sqrt(d * d - 2 * a * d + a * a + 4 * c * b)) / 2 try: v1 = Vec(b / (l1 - a), 1) except ZeroDivisionError: v1 = Vec(1, 0) try: v2 = Vec(b / (l2 - a), 1) except ZeroDivisionError: v2 = Vec(1, 0) return [(l1, v1.normalize()), (l2, v2.normalize())]
def normals_aabb_circle(A, B): # Encontra o vértice mais próximo do centro D = float('inf') pt = Vec(0, 0) for v in A.vertices: delta = B.pos - v dnew = delta.norm() if dnew < D: D = dnew pt = delta return [pt.normalize(), e1, e2]
def test_clamp(): u = Vec(3, 4) assert u.clamp(1, 10) == u assert u.clamp(10) == 2 * u assert u.clamp(2, 4) == u.normalize() * 4