Вычислить центр масс поверхности из набора координат x, y - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь определить центр масс поверхности, определенный набором СЛУЧАЙНЫХ неэквивалентно расположенных точек x, y. Вот быстрый набор тестов, чтобы показать, что я имею в виду.

from scipy.spatial import ConvexHull
import numpy as np
import matplotlib.pyplot as plt

def PolyArea(x, y):
    return 0.5*np.abs(np.dot(x, np.roll(y,1))-np.dot(y, np.roll(x,1)))

points = np.random.rand(30, 2)   # 30 random points in 2-D
hull = ConvexHull(points)

plt.plot(points[:,0], points[:,1])
for simplex in hull.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1])

plt.plot(points[hull.vertices, 0], points[hull.vertices, 1], 'r--', lw=2)
plt.show()

Отсюда получаем:

x = points[hull.vertices, 0]
y = points[hull.vertices, 1]

surface_size = PolyArea(x, y)

Я хочу определить центр масс области по заданным точкам (x, y), а не по среднему значению точек. Я знаю, что это рассчитывается по двойному интегралу поверхности (см .: http://tutorial.math.lamar.edu/Classes/CalcII/CenterOfMass.aspx),, но я не знаю, как реализовать это в Python.

Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Конечно, есть гораздо более элегантное решение, но вот быстрое и грязное, возможно медленное и излишнее, основанное на изображениях, которое работает.

import skimage.measure
import skimage.draw

GRIDW = 1000
GRIDH = 1000

img = np.zeros((GRIDW, GRIDH))

rr, cc = skimage.draw.polygon(x*GRIDW,y*GRIDH)
img[rr,cc] = 1

label = skimage.measure.label(img)
rprops = skimage.measure.regionprops(label)

print rprops[0].centroid / np.asarray([GRIDW, GRIDH])
...