Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 8, 2010 21:13:08

miksayer
От:
Зарегистрирован: 2009-02-17
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти центр масс

Есть список точек, описанных таким классом:

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'е этот код можно сделать гораздо проще и нагляднее(а возможно и быстрее). Только мне опыта не хватает :-)



Офлайн

#2 Сен. 8, 2010 21:14:22

miksayer
От:
Зарегистрирован: 2009-02-17
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти центр масс

и еще: в Python'е есть перегрузка операторов? если да, то где о ней почитать? что-то ничего не гуглится



Офлайн

#3 Сен. 8, 2010 23:45:03

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Найти центр масс

Офлайн

#4 Сен. 9, 2010 06:15:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Найти центр масс

Может так?

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)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Сен. 9, 2010 12:07:45

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти центр масс

>>> math.hypot.__doc__
'hypot(x,y) Return the Euclidean distance, sqrt(x*x + y*y).'



Офлайн

#6 Сен. 9, 2010 13:23:11

miksayer
От:
Зарегистрирован: 2009-02-17
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти центр масс

PooH, спасибо, попробую
Dimka665, здесь я привел старую версию класса Point, сейчас я вычисляю квадрат расстояния(т.е. избавился от корня), что дает небольшой прирост скорости
и что там насчет перегрузки операторов?



Офлайн

#7 Сен. 9, 2010 18:27:09

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Найти центр масс

Чтобы, например, перегрузить оператор + для двух точек, надо в класс добавить функцию __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__ ‘+= ’ и т.д.



Офлайн

#8 Сен. 9, 2010 20:09:51

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти центр масс

miksayer
Центром масс этих точек будет точка, координатами которой будут средние арифметические значения координат точек списка.
Вы чего, все опухли что ли? Центр масс, это среднее, взвешенное по массе, т.е радиус-вектор надо домножить, на ту долю массы которую он вкладывает во всю систему wiki, да простят меня физики если здесь такие есть, вроде нигде не соврал. А то что в примерах выше найдено, это к центру масс весьма отдалённое имеет отношение.



Отредактировано (Сен. 9, 2010 20:11:46)

Офлайн

#9 Сен. 9, 2010 20:11:49

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Найти центр масс

Считаем, что массы всех точек одинаковые.



Офлайн

#10 Сен. 9, 2010 20:20:31

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти центр масс

Isem
Считаем, что массы всех точек одинаковые.
Ведь это очевидно. Без комментариев.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version