2d векторы
- # coding: utf8
- import math
- class Vector(object):
- #Класс для работы с векторами в двухмерном пространстве.
- def __init__(self, x, y):
- self.x = float(x)
- self.y = float(y)
- def __repr__(self):
- return u'<Vector: (%f; %f)>' % (self.x, self.y)
- def __str__(self):
- return u'(%.2f; %.2f)' % (self.x, self.y)
- def __add__(self, other):
- # сложение
- return self.__class__(self.x + other.x, self.y + other.y)
- def __sub__(self, other):
- #вычитание
- return self.__class__(self.x - other.x, self.y - other.y)
- def __mul__(self, other):
- # скаляр
- if other.__class__.__name__ in self.__class__.__name__:
- # если скаляр векторов
- return self.x * other.x + self.y * other.y
- # скаляр вектора на число
- return self.x * other + self.y * other
- def length(self):
- # длинна вектора
- return math.sqrt(self.x ** 2 + self.y ** 2)
- def distance(self, other):
- # расстояние до другого(other) вектора -> float
- v = self - other
- return v.length()
- def normal(self):
- # нормализация
- return self.__class__(self.x / self.length(), self.y / self.length())
- def angle(self, other):
- # угол между векторами
- return ((self.x * other.x + self.y * other.y)/(self.length() * other.length()))
- if __name__ == '__main__':
- v1 = Vector(2, 3)
- v2 = Vector(15, -5)
- print "%s + %s = %s" % (v1, v2, v1 + v2)
- print "%s - %s = %s" % (v1, v2, v1 - v2)
- print "%s * %s = %s" % (v1, v2, v1 * v2)
- print "%s * %s = %s" % (v1, 5, v1 * 5)
- print "length(%s): %f" % (v1, v1.length())
- print "distance(%s %s): %f " %(v1, v2, v1.distance(v2))
- print "normal(%s): %s" % (v2, v2.normal())
- print "angle(%s, %s): %f" % (v2, v1, v2.angle(v1))
класс для работв с 2д векторами, поддерживает операции сложения, вычитания, скаляр на число, скаляр на вектор, длинна, нормализация, расстояние между векторами, угол между векторами. блок в конце кода if __name__ .. для теста. результаты вывода теста: http://upwap.ru/2979892 .
зы. наконецто раздуплился с магическими методами в питоне
зы. наконецто раздуплился с магическими методами в питоне