2d векторы

  1. # coding: utf8
  2. import math
  3.  
  4. class Vector(object):
  5.     #Класс для работы с векторами в двухмерном пространстве.
  6.  
  7.  
  8.     def __init__(self, x, y):
  9.         self.x = float(x)
  10.         self.y = float(y)
  11.  
  12.     def __repr__(self):
  13.         return u'<Vector: (%f; %f)>' % (self.x, self.y)
  14.  
  15.     def __str__(self):
  16.         return u'(%.2f; %.2f)' % (self.x, self.y)
  17.  
  18.     def __add__(self, other):
  19.         # сложение
  20.         return self.__class__(self.x + other.x, self.y + other.y)
  21.  
  22.     def __sub__(self, other):
  23.         #вычитание
  24.         return self.__class__(self.x - other.x, self.y - other.y)
  25.  
  26.     def __mul__(self, other):
  27.         # скаляр
  28.         if other.__class__.__name__ in self.__class__.__name__:
  29.             # если скаляр векторов
  30.             return self.x * other.x + self.y * other.y
  31.         # скаляр вектора на число
  32.         return self.x * other + self.y * other
  33.  
  34.     def length(self):
  35.         # длинна вектора
  36.         return math.sqrt(self.x ** 2 + self.y ** 2)
  37.  
  38.     def distance(self, other):
  39.         # расстояние до другого(other) вектора -> float
  40.         v = self - other
  41.         return v.length()
  42.  
  43.     def normal(self):
  44.         # нормализация    
  45.         return self.__class__(self.x / self.length(), self.y / self.length())
  46.  
  47.     def angle(self, other):
  48.         # угол между векторами        
  49.         return ((self.x * other.x + self.y * other.y)/(self.length() * other.length()))
  50.  
  51. if __name__ == '__main__':
  52.     v1 = Vector(2, 3)
  53.     v2 = Vector(15, -5)
  54.     print "%s + %s = %s" % (v1, v2, v1 + v2)
  55.     print "%s - %s = %s" % (v1, v2, v1 - v2)
  56.     print "%s * %s = %s" % (v1, v2, v1 * v2)
  57.     print "%s * %s = %s" % (v1, 5, v1 * 5)
  58.     print "length(%s): %f" % (v1, v1.length())
  59.     print "distance(%s %s): %f " %(v1, v2, v1.distance(v2))
  60.     print "normal(%s): %s" % (v2, v2.normal())
  61.     print "angle(%s, %s): %f" % (v2, v1, v2.angle(v1))
класс для работв с 2д векторами, поддерживает операции сложения, вычитания, скаляр на число, скаляр на вектор, длинна, нормализация, расстояние между векторами, угол между векторами. блок в конце кода if __name__ .. для теста. результаты вывода теста: http://upwap.ru/2979892 .
зы. наконецто раздуплился с магическими методами в питоне:)

Реклама

Мы в соцсетях

tw tg yt gt