Найти - Пользователи
Полная версия: Найти центр масс
Начало » Python для новичков » Найти центр масс
1 2
miksayer
Есть список точек, описанных таким классом:
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def distance(self, point):
return sqrt((self.x - point.x) ** 2 + (self.y - point.y) ** 2)
Нужно найти центр масс этих точек. Центром масс этих точек будет точка, координатами которой будут средние арифметические значения координат точек списка. Сейчас это делаю так:
newKernel = Point()
newKernel.x = 0
for point in group:
newKernel.x += point.x
newKernel.x /= len(group)
(для координаты y аналогично), где group - список точек, newKernel рассчитываемый центр масс. Но как-то все это опять же не очень красиво. Как этот код можно покрасивее переделать?
Просто я уверен, что в Python'е этот код можно сделать гораздо проще и нагляднее(а возможно и быстрее). Только мне опыта не хватает :-)
miksayer
и еще: в Python'е есть перегрузка операторов? если да, то где о ней почитать? что-то ничего не гуглится
Андрей Светлов
http://docs.python.org/reference/datamodel.html
PooH
Может так?
class Point:

def __init__(self, x = 0, y = 0):
self.x = x
self.y = y

def distance(self, point):
return sqrt((self.x-point.x)**2+(self.y-point.y)**2)

def __str__(self):
return "Point(%d,%d)" % (self.x, self.y)


def mass_center(points):
if points:
return Point(sum(pt.x for pt in points)/len(points),
sum(pt.y for pt in points)/len(points))


group = [Point(10,10),Point(10,20),Point(20,25),Point(30,20),Point(30,10)]
print mass_center(group)
Dimka665
>>> math.hypot.__doc__
'hypot(x,y) Return the Euclidean distance, sqrt(x*x + y*y).'
miksayer
PooH, спасибо, попробую
Dimka665, здесь я привел старую версию класса Point, сейчас я вычисляю квадрат расстояния(т.е. избавился от корня), что дает небольшой прирост скорости
и что там насчет перегрузки операторов?
Isem
Чтобы, например, перегрузить оператор + для двух точек, надо в класс добавить функцию __add__
Например:
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def __add__(self, point):
return Point( self.x+point.x, self.y+point.y )
def __repr__(self):
return "Point({},{})".format( self.x, self.y )

a, b = Point(1,2), Point(3,4)
print(a+b)
Аналогично другие операторы: __sub__ ‘-’, __iadd__ ‘+= ’ и т.д.
alexx11
miksayer
Центром масс этих точек будет точка, координатами которой будут средние арифметические значения координат точек списка.
Вы чего, все опухли что ли? Центр масс, это среднее, взвешенное по массе, т.е радиус-вектор надо домножить, на ту долю массы которую он вкладывает во всю систему wiki, да простят меня физики если здесь такие есть, вроде нигде не соврал. А то что в примерах выше найдено, это к центру масс весьма отдалённое имеет отношение.
Isem
Считаем, что массы всех точек одинаковые.
alexx11
Isem
Считаем, что массы всех точек одинаковые.
Ведь это очевидно. Без комментариев.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB