Как найти центр неправильного многоугольника

Here are six different approaches I have tried.

  1. cv2 based center of mass (get_center_of_mass)
  2. shapely based representative point (get_representative_point)
  3. cv2 + skimage.skeleton based center of mass of the skeletonized shape (get_skeleton_center_of_mass)
  4. scipy based furthest distance to border (get_furthest_point_from_edge)
  5. cv2 based version of the previous furthest distance to border -algorithm (get_furthest_point_from_edge_cv2)
  6. the “center point of half-area line” algorithm proposed in this thread by @T.Austin (get_center_of_half_area_line)

Let’s begin with imports and some helper functions

import numpy as np
import cv2
from shapely.geometry import Polygon, LineString, MultiLineString, Point, MultiPoint, GeometryCollection
from skimage.morphology import skeletonize, medial_axis
from scipy.optimize import minimize_scalar
from scipy.ndimage.morphology import distance_transform_edt
import matplotlib.pyplot as plt

H, W = 300, 300

def get_random_contour():
    xs = np.random.randint(0, W, 4)
    ys = np.random.randint(0, H, 4)
    cnt = np.array([[x,y] for x,y in zip(xs,ys)])
    mask = draw_contour_on_mask((H,W), cnt)
    cnt, _ = cv2.findContours(mask, 1, 2)
    cnt = cnt[0]
    return cnt

def draw_contour_on_mask(size, cnt, color:int = 255):
    mask = np.zeros(size, dtype='uint8')
    mask = cv2.drawContours(mask, [cnt], -1, color, -1)
    return mask

def get_center_of_mass(cnt):
    M = cv2.moments(cnt)
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    return cx, cy

def split_mask_by_line(mask, centroid:tuple, theta_degrees:float, eps:float = 1e-4):
    h, w = mask.shape[:2]
    mask = mask[..., None]
    cx, cy = centroid
    # convert theta first to radians and then to line slope(s)
    theta_degrees = np.atleast_1d(theta_degrees)
    theta_degrees = np.clip(theta_degrees, -90+eps, 90-eps)
    theta_rads = np.radians(theta_degrees)
    slopes = np.tan(theta_rads)[:, None]
    # define the line(s)
    x = np.arange(w, dtype="int32")
    y = np.int32(slopes * (x - cx) + cy)
    _y = np.arange(h, dtype="int32")
    # split the input mask into two halves by line(s)
    m = (y[..., None] <= _y).T
    m1 = (m * mask).sum((0,1))
    m2 = ((1 - m) * mask).sum((0,1))
    m2 = m2 + eps if m2==0 else m2
    # calculate the resultant masks ratio
    ratio = m1/m2
    return (x.squeeze(), y.squeeze()), ratio

def get_half_area_line(mask, centroid: tuple, eps: float = 1e-4):
    # find the line that splits the input mask into two equal area halves
    minimize_fun = lambda theta: abs(1. - split_mask_by_line(mask, centroid, theta, eps=eps)[1].item())
    bounds = np.clip((-90, 90), -90 + eps, 90 - eps)
    res = minimize_scalar(minimize_fun, bounds=bounds, method='bounded')
    theta_min = res.x
    line, _ = split_mask_by_line(mask, centroid, theta_min)
    return line

Now let’s define the functions for finding the visual center

def get_representative_point(cnt):
    poly = Polygon(cnt.squeeze())
    cx = poly.representative_point().x
    cy = poly.representative_point().y
    return cx, cy

def get_skeleton_center_of_mass(cnt):
    mask = draw_contour_on_mask((H,W), cnt)
    skel = medial_axis(mask//255).astype(np.uint8) #<- medial_axis wants binary masks with value 0 and 1
    skel_cnt,_ = cv2.findContours(skel,1,2)
    skel_cnt = skel_cnt[0]
    M = cv2.moments(skel_cnt) 
    if(M["m00"]==0): # this is a line
        cx = int(np.mean(skel_cnt[...,0]))
        cy = int(np.mean(skel_cnt[...,1]))
    else:
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
    return cx, cy

def get_furthest_point_from_edge(cnt):
    mask = draw_contour_on_mask((H,W), cnt)
    d = distance_transform_edt(mask)
    cy, cx = np.unravel_index(d.argmax(), d.shape)
    return cx, cy

def get_furthest_point_from_edge_cv2(cnt):
    mask = draw_contour_on_mask((H,W), cnt)
    dist_img = cv2.distanceTransform(mask, distanceType=cv2.DIST_L2, maskSize=5).astype(np.float32)
    cy, cx = np.where(dist_img==dist_img.max())
    cx, cy = cx.mean(), cy.mean()  # there are sometimes cases where there are multiple values returned for the visual center
    return cx, cy

def get_center_of_half_area_line(cnt):
    mask = draw_contour_on_mask((H,W), cnt, color=1)
    # get half-area line that passes through centroid
    cx, cy = get_center_of_mass(mask)
    line = get_half_area_line(mask, centroid=(cx, cy))
    line = LineString(np.array(list(zip(line))).T.reshape(-1, 2))
    # find the visual center
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    contours = [c for c in contours if cv2.contourArea(c) > 5]
    polys = [Polygon(c.squeeze(1)) for c in contours if len(c) >= 3]  # `Polygon` must have at least 3 points
    cpoint = Point(cx, cy)
    points = []
    for poly in polys:
        isect = poly.intersection(line)
        if isect.is_empty:
            # skip when intersection is empty: this can happen for masks that consist of multiple disconnected parts
            continue
        if isinstance(isect, (MultiLineString, GeometryCollection)):
            # take the line segment intersecting with `poly` that is closest to the centroid point
            isect = isect.geoms[np.argmin([g.distance(cpoint) for g in isect.geoms])]
        if isinstance(isect, Point):
            # sometimes the intersection can be a singleton point
            points.append(isect)
            continue
        isect = isect.boundary
        if poly.intersects(cpoint):
            points = [isect]
            break
        else:
            points.append(isect)

    if len(points) == 0:
        # multiple reasons for this one:
        # - if len(polys)==0
        # - if len(polys)==1, but for some reason the line does not intersect with polygon
        # - if the above search does not match with any points

        return cx, cy

    points = points[np.argmin([p.distance(cpoint) for p in points])]
    if isinstance(points, Point):
        return np.array(points.xy)
    
    points = [np.array(p.xy).tolist() for p in points.geoms]
    visual_center = np.average(points, (0, 2))
    return visual_center

Here’s my analysis on the topic:

  • get_center_of_mass is the fastest but, as mentioned in this thread, the center of mass can be located outside the shape for non-convex shapes.
  • get_representative_point is also fast but the identified point, although always guaranteed to stay inside the shape (or with minor edits even multiple disconnected shapes!), does not have much if anything to do with the center of the object
  • get_skeleton_center_of_mass returns a perceptually nice center point, but is slow and requires logic for disconnected shapes
  • get_furthest_point_from_edge is relatively fast, generalizes easily to disconnected shapes and the center point is visually pleasing
  • get_furthest_point_from_edge_cv performs otherwise similarly as get_furthest_point_from_edge but is an order of magnitude faster
  • get_center_of_half_area_line performs neatly: the result is usually closest to where I myself would annotate the visual center. Unfortunately, at least my implementation is quite slow.
rows = 4
cols = 4
markers = ['x', '+', "*", "o", '^', "v"]
colors = ['r','b','g','orange', 'purple', 'lime']
functions = [
    get_center_of_mass, 
    get_representative_point, 
    get_skeleton_center_of_mass, 
    get_furthest_point_from_edge,
    get_furthest_point_from_edge_cv2,
    get_center_of_half_area_line
]

plt.figure(figsize=(2*cols, 2*rows, ))
for i in range(rows*cols): 
    cnt = get_random_contour()
    mask = draw_contour_on_mask((H,W), cnt)
    
    plt.subplot(cols,rows, i+1)
    plt.imshow(mask, cmap='gray')
    for c, m, f in zip(colors, markers, functions):
        l = f.__name__
        cx, cy = f(cnt)
        plt.scatter(cx, cy, c=c, s=100, label=l, marker=m, alpha=0.7)

plt.tight_layout()    
plt.legend(loc=3)
plt.show()

enter image description here

Here’s how the algorithms, run on 100 random examples, compare in speed:

N_EXAMPLES = 100
cnts = [get_random_contour() for _ in range(N_EXAMPLES)]

for fn in functions:
    print(fn.__name__+":")
    %time _ = [fn(cnt) for cnt in cnts]
    print("~ "*40)
get_center_of_mass:
CPU times: user 2.35 ms, sys: 777 µs, total: 3.13 ms
Wall time: 1.91 ms
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
get_representative_point:
CPU times: user 15.7 ms, sys: 0 ns, total: 15.7 ms
Wall time: 14.8 ms
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
get_skeleton_center_of_mass:
CPU times: user 6.52 s, sys: 104 ms, total: 6.62 s
Wall time: 6.62 s
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
get_furthest_point_from_edge:
CPU times: user 413 ms, sys: 63 µs, total: 413 ms
Wall time: 413 ms
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
get_furthest_point_from_edge_cv2:
CPU times: user 47.8 ms, sys: 0 ns, total: 47.8 ms
Wall time: 47.8 ms
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
get_center_of_half_area_line:
CPU times: user 1.66 s, sys: 0 ns, total: 1.66 s
Wall time: 1.66 s
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 

Центроид треугольника — точка пересечения его медиан

В математике барице́нтр, или геометри́ческий центр, двумерной фигуры — это среднее арифметическое положений всех точек данной фигуры. Определение распространяется на любой объект в n-мерном пространстве. Радиус-вектор барицентра в трёхмерном случае вычисляется как

{displaystyle {vec {r}}_{b}=V^{-1}int _{V}{vec {r}}dV},

где интегрирование выполняется по объёму тела. Другое название барицентра в этом значении — центроид.

Неформально, геометрический барицентр есть точка равновесия фигуры, вырезанной из картона, в предположении, что картон имеет постоянную плотность, а внешнее гравитационное поле однородно.

В физике термин «барицентр» — синоним понятия «центр масс», используемый, в основном, в задачах космической механики. Центр масс объекта является средним арифметическим всех его точек с учётом локальной плотности массы. Для физических объектов с постоянной плотностью центр масс совпадает с барицентром фигуры той же формы.

Ниже барицентр рассматривается в математическом (геометрическом) смысле, о барицентре в физике см. статью Центр масс.

Свойства[править | править код]

Геометрический барицентр выпуклого объекта всегда лежит внутри объекта. Невыпуклый объект может иметь барицентр, лежащий вне фигуры. Барицентр кольца или миски, например, лежат вне фигуры.

Если барицентр известен, он является фиксированной точкой группы изометрии симметрий фигуры. Барицентр объекта лежит на пересечении всех его гиперплоскостей симметрии. Барицентры многих фигур (правильного многоугольника, правильного многогранника, цилиндра, прямоугольника, ромба, окружности, сферы, эллипса, эллипсоида, суперэллипса, суперэллипсоида и т. д.) можно найти исходя исключительно из этого принципа.

В частности, барицентром треугольника является точка пересечения его медиан (см. рисунок). Барицентром параллелограмма является точка пересечения его диагоналей, но это неверно для других четырёхугольников.

Барицентр объекта с трансляционной симметрией не определён (или лежит вне пространства фигуры), поскольку сдвиг не имеет фиксированной точки.

Центроид треугольника[править | править код]

  • Барицентр треугольника называется центроидом и лежит на пересечении трёх медиан, также лежит на прямой Эйлера (проходящей и через другие ключевые точки, включая ортоцентр и центр описанной окружности)[1][2].
  • Если в вершины треугольника поместить равные массы, то центр масс (барицентр) полученной системы будет совпадать с центроидом. Более того, центр масс треугольника с равномерно распределённой массой также находится в центроиде.
MA^{2}+MB^{2}+MC^{2}=GA^{2}+GB^{2}+GC^{2}+3MG^{2}[3].
  • Сумма квадратов сторон треугольника равна утроенной сумме квадратов расстояний от центроида до вершин треугольника:
AB^{2}+BC^{2}+CA^{2}=3(GA^{2}+GB^{2}+GC^{2})[3].
  • Центр масс сторон треугольника совпадает с центром вписанной окружности дополнительного треугольника (треугольника с вершинами, расположенными в серединах сторон данного треугольника). Эту точку называют центром Шпикера. Если стороны треугольника сделать из тонкой проволоки одинакового сечения, то центр масс (барицентр) полученной системы будет совпадать с инцентром дополнительного треугольника, или с центром Шпикера.
  • О других свойствах центроида треугольника смотрите ниже.

Минимаксные свойства центроида треугольника[править | править код]

  • Центроид или точка пресечения медиан треугольника является единственной точкой треугольника такой, что проведенные через неё три чевианы разделяют своими концами стороны треугольника на шесть отрезков. При этом произведение длин трёх из этих шести отрезков, не имеющих общих концов, максимально[4].
  • Центроид или точка пересечения трёх медиан является точкой, для которой сумма квадратов расстояний до вершин треугольника принимает наименьшее значение (теорема Лейбница).

Центроид четырёх точек (вершин четырёхугольника)[править | править код]

Центроид (барицентр или центр масс) вершин произвольного четырёхугольника лежит в точке пересечения 3-х отрезков: 1-й отрезок соединяет середины диагоналей, два другие — середины противолежащих сторон. Точка пересечения делит все три отрезка пополам.

Четыре отрезка, каждый из которых соединяет вершину четырёхугольника с центроидом треугольника, образованного оставшимися тремя вершинами, пересекаются в одной точке (центроиде вершин четырёхугольника) и делятся ею в отношении 3:1, считая от вершины.

Центр масс вершин четырёхугольника не обязан совпадать с центром масс самого четырёхугольника как плоской фигуры.

Определение местоположения барицентра[править | править код]

Определение местоположения барицентра однородной плоской фигуры методом отвеса[править | править код]

Барицентр однородной плоской фигуры, такой как фигура (a) на рисунке, можно найти экспериментально с использованием отвеса и булавки путём нахождения центра масс тонкой пластины однородной плотности, имеющей ту же форму. Пластина удерживается булавкой, вставленной ближе к периметру так, чтобы пластина могла свободно вращаться. Отмечаем на пластине прямую, которую образует отвес, прикреплённый к булавке (b). Проделываем то же самое с другим положением булавки. Пересечение двух прямых даст барицентр (c).

Этот метод можно распространить (в теории) на вогнутые фигуры, когда барицентр лежит вне их, а также тела (постоянной плотности), но положение линии отвеса придётся отмечать каким-то иным способом.

Определение местоположения барицентра выпуклой двумерной фигуры методом балансировки[править | править код]

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

Определение местоположения барицентра для конечного множества точек[править | править код]

Барицентр конечного множества из {k} точек {displaystyle mathbf {x} _{1},mathbf {x} _{2},ldots ,mathbf {x} _{k}} в mathbb {R} ^{n} находится по формуле

{displaystyle mathbf {G} ={frac {mathbf {x} _{1}+mathbf {x} _{2}+cdots +mathbf {x} _{k}}{k}}}[5].

Полученная точка {mathbf  {G}} такая, что сумма квадратов расстояний между ней и точками множества является минимальной.

Определение местоположения барицентра с помощью геометрического разложения[править | править код]

(b) Разложение фигуры на простые элементы

(c) Барицентры элементов объекта

Барицентр плоской фигуры X можно вычислить, разделив её на конечное число более простых фигур {displaystyle X_{1},X_{2},dots ,X_{n}}, найдя положение барицентров G_{i} и площадей A_{i} каждой части, а затем вычислив

{displaystyle G_{x}={frac {sum G_{i_{x}}A_{i}}{sum A_{i}}},G_{y}={frac {sum G_{i_{y}}A_{i}}{sum A_{i}}}.}

Дыры в фигуре X, наложения частей, или части, выступающие за фигуру, можно рассматривать как фигуры с отрицательной площадью A_{i}. А именно, знак площади A_{i} нужно выбирать так, чтобы сумма знаков A_{i} для всех частей, включающих точку p, была равна 1, если p принадлежит X, и 0 в противном случае.

Например, фигуру (a) на рисунке легко разделить на квадрат и треугольник с положительным знаком, круглое отверстие с отрицательным (b).

Барицентр каждой части легко найти в любом списке барицентров простых фигур (c). Затем вычисляется барицентр фигуры, как средневзвешенное трёх точек. Горизонтальное положение барицентра, считая от левого края фигуры, равно

{displaystyle x={frac {5times 10^{2}+13.33times {frac {1}{2}}10^{2}-3times pi 2.5^{2}}{10^{2}+{frac {1}{2}}10^{2}-pi 2.5^{2}}}approx 8.5.}

Вертикальное положение вычисляется аналогично.

Та же формула применима для любого трёхмерного объекта, только A_{i} обозначают уже объёмы частей тела X_{i}, а не площади. Формула верна также для пространства mathbb {R} ^{d} любой размерности d при замене площади d-мерными мерами частей.

Определение местоположения барицентра интегрированием[править | править код]

Барицентр подмножества X пространства mathbb {R} ^{n} можно вычислить с помощью интеграла

{displaystyle G={frac {int xg(x);dx}{int g(x);dx}},}

где интегрирование ведётся по всему пространству mathbb {R} ^{n}, а g является характеристической функцией подмножества, принимающей 1 внутри X и 0 вне его[6]. Заметим, что знаменатель равен мере множества X. Формула неприменима к множеству нулевой меры, а также к множествам, для которых интеграл расходится.

Другая формула для вычисления координат барицентра:

{displaystyle G_{k}={frac {int zS_{k}(z);dz}{int S_{k}(z);dz}},}

где Gk является k-й координатой G, а Sk(z) — мера пересечения X с гиперплоскостью, определяемой уравнением xk = z. Снова знаменатель — это мера множества X.

Для плоской фигуры координатами барицентра будут

{displaystyle G_{mathrm {x} }={frac {int xS_{mathrm {y} }(x);dx}{A}};}
{displaystyle G_{mathrm {y} }={frac {int yS_{mathrm {x} }(y);dy}{A}},}

где A — площадь фигуры X, Sy(x) — длина пересечения[неизвестный термин] X с вертикальной прямой с абциссой x, Sx(y) — аналогичная величина при обмене осей.

Определение местоположения барицентра для области, ограниченной графиками непрерывных функций[править | править код]

Координаты барицентра {displaystyle ({bar {x}},;{bar {y}})} области, ограниченной графиками непрерывных функций f и g, таких что f(x)geq g(x) на интервале [a,b], aleq xleq b, задаются выражениями

{displaystyle {bar {x}}={frac {1}{A}}int _{a}^{b}xleft[f(x)-g(x)right];dx}[6].
{displaystyle {bar {y}}={frac {1}{A}}int _{a}^{b}left[{frac {f(x)+g(x)}{2}}right]left[f(x)-g(x)right];dx,}[7]

где A — площадь области (вычисляемая по формуле {displaystyle int _{a}^{b}left[f(x)-g(x)right];dx})[8][9].

Определение местоположения барицентра объекта, имеющего форму буквы L[править | править код]

Метод нахождения барицентра фигуры, имеющей форму буквы L.


CoG of L shape.svg

  1. Фигуру делят на два прямоугольника (см. фигуру (2) на рисунке). Находят барицентры A и B этих двух прямоугольников как пересечение диагоналей. Рисуют отрезок AB, соединяющий барицентры. Барицентр фигуры должен лежать на этом отрезке AB.
  2. Делят фигуру на два прямоугольника другим способом (см. фигуру (3) на рисунке). Находят барицентры C и D этих двух прямоугольников. Проводят отрезок CD, соединяющий барицентры. Барицентр фигуры должен лежать на отрезке CD.
  3. Поскольку барицентр должен лежать как на отрезке AB, так и на отрезке CD, очевидно, что он является точкой пересечения этих двух отрезков — точкой O. Точка O не обязана лежать внутри фигуры.

Барицентры треугольника и тетраэдра[править | править код]

Точка пересечения медиан (барицентр) делит каждую медиану в отношении 2:1. То есть, расстояние от стороны до барицентра равно 1/3 длины проведённой к стороне высоты

В прямоугольном треугольнике расстояние от одного катета до барицентра равно 1/3 длины другого катета

Барицентр треугольника совпадает с пересечением медиан. Барицентр разбивает каждую медиану в отношении 2:1, то есть барицентр находится на расстоянии ⅓ от стороны до противоположной вершины (см. рисунок). Его декартовыми координатами является среднее координат трёх вершин. То есть, если вершинами треугольника являются {displaystyle a=(x_{a},y_{a})}, {displaystyle b=(x_{b},y_{b})} и {displaystyle c=(x_{c},y_{c})}, то координаты барицентра вычисляются по формуле

{displaystyle G={frac {1}{3}}(a+b+c)=left({frac {1}{3}}(x_{a}+x_{b}+x_{c}),{frac {1}{3}}(y_{a}+y_{b}+y_{c})right)}.

Таким образом, барицентр имеет барицентрические координаты {tfrac {1}{3}}:{tfrac {1}{3}}:{tfrac {1}{3}}.

В трилинейных координатах барицентр можно получить одним из эквивалентных способов[10]:

{displaystyle G={frac {1}{a}}:{frac {1}{b}}:{frac {1}{c}}=bc:ca:ab=csc A:csc B:csc C}

{displaystyle =cos A+cos Bcdot cos C:cos B+cos Ccdot cos A:cos C+cos Acdot cos B}
{displaystyle =sec A+sec Bcdot sec C:sec B+sec Ccdot sec A:sec C+sec Acdot sec B.}

Барицентр является также физически центром масс треугольника, сделанного из однородного листового материала, а также, если вся масса сконцентрирована в вершинах и одинаково разделена между ними. Если же масса распределена равномерно вдоль периметра, то центр масс лежит в точке Шпикера (инцентре серединного треугольника), который (в общем случае) не совпадает с центроидом всего треугольника.

Площадь треугольника равна 3/2 длины любой стороны, умноженной на расстояние от центроида до стороны[11].

Центроид треугольника лежит на прямой Эйлера между его ортоцентром H и центром его описанной окружности O, ровно вдвое ближе ко второму, чем к первому:

{displaystyle GH=2GO}.

Кроме того, для инцентра I и центра девяти точек N, мы имеем

{displaystyle GH=4GN},
{displaystyle GO=2GN},
{displaystyle IG<HG},
{displaystyle IH<HG},
{displaystyle IG<IO}.

Аналогичными свойствами обладает тетраэдр — его барицентр является пересечением отрезков, соединяющих вершины с барицентрами противоположных граней. Эти отрезки делятся барицентром в отношении 3:1. Результат может быть обобщён на любой n-мерный симплекс. Если вершины симплекса обозначить {displaystyle v_{0},ldots ,v_{n}} и рассматривать вершины как вектора, центроид равен

{displaystyle G={frac {1}{n+1}}sum _{i=0}^{n}v_{i}}.

Геометрический барицентр совпадает с центром масс, если масса равномерно распределена по всему симплексу или сосредоточена в вершинах как n равных масс.

Изогональным сопряжением центроида треугольника является точка пересечения его симедиан.

Барицентр тетраэдра[править | править код]

Тетраэдр является телом в трёхмерном пространстве, имеющим четыре треугольника в качестве граней. Отрезок, соединяющий вершину тетраэдра с барицентром противоположной грани, называется медианой, а отрезок, соединяющий середины двух противоположных сторон, называется бимедианой. Таким образом, имеется четыре медианы и две бимедианы. Эти шесть отрезков пересекаются в барицентре тетраэдра[12]. Барицентр тетраэдра лежит посередине между точкой Монжа и центром описанной сферы. Эти точки задают прямую Эйлера тетраэдра, являющуюся аналогом прямой Эйлера треугольника.

Барицентр многоугольника[править | править код]

Барицентром самонепересекающегося замкнутого многоугольника, заданного n вершинами (x_{0},y_{0}), (x_{1},y_{1}), ldots , {displaystyle (x_{n-1},y_{n-1})}, является точка {displaystyle (G_{x},G_{y})}, где

{displaystyle G_{x}={frac {1}{6A}}sum _{i=0}^{n-1}(x_{i}+x_{i+1})(x_{i}y_{i+1}-x_{i+1}y_{i})};
{displaystyle G_{y}={frac {1}{6A}}sum _{i=0}^{n-1}(y_{i}+y_{i+1})(x_{i}y_{i+1}-x_{i+1}y_{i})}

и где A является площадью многоугольника (со знаком):

{displaystyle A={frac {1}{2}}sum _{i=0}^{n-1}(x_{i}y_{i+1}-x_{i+1}y_{i})}[13].

В этой формуле предполагается, что вершины пронумерованы вдоль периметра многоугольника. Кроме того, вершина {displaystyle (x_{n},y_{n})} считается той же самой, что и (x_{0},y_{0}).
Заметим, что если точки пронумерованы по часовой стрелке, площадь A, вычисленная выше, будет отрицательной, но координаты барицентра подкорректируют этот случай.

Барицентры конуса и пирамиды[править | править код]

Барицентр конуса или пирамиды расположен на отрезке, соединяющем вершину тела с барицентром основания. Для целого конуса или пирамиды барицентр находится на расстоянии 1/4 от основания к вершине. Для поверхности конуса или пирамиды (боковая поверхность без внутренности и без основания) центроид находится на 1/3 расстояния от основания до вершины.

См. также[править | править код]

  • Центр масс
  • Центроид треугольника
  • Центр тяжести
  • Центр Чебышева[en]
  • Среднее Фреше[en]
  • k-means
  • Список барицентров
  • Теоремы Паппа — Гульдина
  • Замечательные точки треугольника

Примечания[править | править код]

  1. Altshiller-Court, 1925, с. 101.
  2. Kay, 1969, с. 18,189,225–226.
  3. 1 2 Altshiller-Court, 1925, с. 70–71.
  4. Зетель, 1962.
  5. Protter, Morrey, 1970, с. 520.
  6. 1 2 Protter, Morrey, 1970, с. 526.
  7. Protter, Morrey, 1970, с. 527.
  8. Protter, Morrey, 1970.
  9. Larson, Hostetler, Edwards, 1998, с. 458–460.
  10. Encyclopedia of Triangle Centers Архивная копия от 19 апреля 2012 на Wayback Machine by Clark Kimberling. The centroid is indexed as X(2).
  11. Johnson, 2007, с. 173.
  12. Kam-tim, Suk-nam, 1994, с. 53–54.
  13. Bourke, 1997.

Литература[править | править код]

  • Зетель, С. И. Новая геометрия треугольника. Пособие для учителей. — 2-е изд/. — М. : Учпедгиз, 1962. — С. 12.
  • Leung Kam-tim, Suen Suk-nam. Vectors, matrices and geometry. — Hong Kong University Press, 1994.
  • Nathan Altshiller-Court. College Geometry: An Introduction to the Modern Geometry of the Triangle and the Circle. — 2nd. — New York: Barnes & Noble, 1925.
  • Paul Bourke. Calculating the area and centroid of a polygon. — 1997.
  • Roger A. Johnson. Advanced Euclidean Geometry. — Dover, 2007.
  • David C. Kay. College Geometry. — New York: Holt, Rinehart and Winston, 1969.
  • Roland E. Larson, Robert P. Hostetler, Bruce H. Edwards. Calculus of a Single Variable. — 6th. — Houghton Mifflin Company, 1998.
  • Murray H. Protter, Charles B. Morrey Jr. College Calculus with Analytic Geometry. — 2nd. — Reading: Addison-Wesley, 1970.

Ссылки[править | править код]

  • Characteristic Property of Centroid at cut-the-knot
  • Barycentric Coordinates at cut-the-knot
  • Interactive animations showing Centroid of a triangle and Centroid construction with compass and straightedge
  • Experimentally finding the medians and centroid of a triangle at Dynamic Geometry Sketches, an interactive dynamic geometry sketch using the gravity simulator of Cinderella.

Справочник статей

  • Во-первых, решение центра тяжести неправильных многоугольников
    • 1.1 Метод расчета треугольника центра тяжести
    • 1.2 Метод расчета площади треугольника
    • 1.3 Метод расчета площади полигона
    • 1.4 Метод расчета центра тяжести неправильного многоугольника

Во-первых, решение центра тяжести неправильных многоугольников

1.1 Метод расчета треугольника центра тяжести

Пусть положение трех вершин треугольника будет

A

(

x

1

,

y

1

)

A(x_1,y_1)

,

B

(

x

2

,

y

2

)

B(x_2,y_2)

,

C

(

x

3

,

y

3

)

C(x_3,y_3)

Тогда

A

B

C

△ABC

Центр гравитации

G

G

Координаты

x

=

x

1

+

x

2

+

x

3

3

,

y

=

y

1

+

y

2

+

y

3

3

x=frac{x_1+x_2+x_3}{3}, y=frac{y_1+y_2+y_3}{3}

1.2 Метод расчета площади треугольника

Рассчитайте площадь треугольника, используяВекторный продуктТаким образом, на следующем рисунке, принимая точку P в качестве начала координат,

A

(

x

1

,

y

1

)

A(x_1,y_1)

B

(

x

2

,

y

2

)

B(x_2,y_2)

к

A

A

B

B

И координатное происхождение

P

P

состоящий из

A

B

C

△ABC

Площадь

S

=

P

B

×

P

A

2

=

x

2

y

1

x

1

y

2

2

S=frac{vec{PB}times vec{PA}}{2}=frac{x_2y_1-x_1y_2}{2}

1.3 Метод расчета площади полигона

В случае многоугольников мы можем разделить многоугольники на несколько треугольников и решить их отдельно. Итак, где мы можем установить эту точку разделения $ P $? Вот вывод: точка разделения может быть установлена ​​внутри многоугольника или снаружи.

Почему эту точку разделения можно установить снаружи? Мы можем обобщить на случай многоугольников простой случай треугольника. за

A

B

C

△ABC

Мы устанавливаем точку разделения в точке вне ее $ P $,

A

B

C

△ABC

Зона

S

S

за

S

=

1

2

(

P

B

×

P

C

+

P

C

×

P

A

+

P

A

×

P

B

)

S=frac{1}{2}(vec{PB}times vec{PC}+vec{PC}times vec{PA}+vec{PA}times vec{PB})


set

P

(

x

0

,

y

0

)

,

P(x_0,y_0),

A

(

x

1

,

y

1

)

A(x_1,y_1)

,

B

(

x

2

,

y

2

)

B(x_2,y_2)

,

C

(

x

3

,

y

3

)

C(x_3,y_3)

A

B

C

△ABC

Зона

S

S

Может быть написано как

S

=

1

2

(

x

1

y

2

x

2

y

1

+

x

2

y

3

x

3

y

2

+

x

3

y

1

x

1

y

3

)

S=frac{1}{2}left ( x_1y_2-x_2y_1+x_2y_3-x_3y_2+x_3y_1-x_1y_3right )

В это время вы можете найти внешнюю точку

P

P

Это не имеет значения, это связано только с координатами вершин.

1.4 Метод расчета центра тяжести неправильного многоугольника

Нерегулярные фигуры, как правило, не имеют понятия центральной точки, поэтому центр тяжести можно использовать только вместо центральной точки. Вот формула:

Плоский многоугольник

X

X

Может быть разбит на

n

n

Ограниченная простая графика

X

1

,

X

2

,

,

X

n

X_1,X_2,…,X_n

, Центр тяжести этих простых фигур

G

i

G_i

С площадью

S

i

S_i

Тогда координаты центра тяжести этого плоского многоугольника

G

(

x

,

y

)

G(x,y)

за

x

=

n

i

=

1

G

i

x

S

i

i

=

1

n

S

i

,

y

=

n

i

=

1

G

i

y

S

i

i

=

1

n

S

i

x=frac{sum_{n}^{i=1}G_{ix}S_i}{sum_{i=1}^{n} S_i},y=frac{sum_{n}^{i=1}G_{iy}S_i}{sum_{i=1}^{n} S_i}

  • Расчет центра тяжести неправильного многоугольника
def get_gravity_point(points):
    """
    @brief Получить центр тяжести многоугольника
    @param      points  The points
    @return     The center of gravity point.
    """
    if len(points) <= 2:
        return list()

    area = Decimal(0.0)
    x, y = Decimal(0.0), Decimal(0.0)
    for i in range(len(points)):
        lng = Decimal(points[i][0])
        lat = Decimal(points[i][1])
        nextlng = Decimal(points[i-1][0])
        nextlat = Decimal(points[i-1][1])

        tmp_area = (nextlng*lat - nextlat*lng)/Decimal(2.0)
        area += tmp_area
        x += tmp_area*(lng+nextlng)/Decimal(3.0)
        y += tmp_area*(lat+nextlat)/Decimal(3.0)
    x = x/area
    y = y/area
    return [float(x), float(y)]

Содержание

  1. 219. Четырехугольник.
  2. 220. Многоугольник.
  3. 221. Дуга окружности.
  4. 222. Круговой сектор.
  5. 223. Тетраэдр.
  6. 224. Пирамида с многоугольным основанием.
  7. 225. Призма. Цилиндр. Конус.
  8. 1. Масса находится только в вершинах, причем каждая вершина весит одинаково
  9. 2. Масса равномерно распределена по границе многоугольника
  10. 3. Масса равномерно распределена по области, ограниченной многоугольником.

На карте отобразил условный контур и теперь хотел бы в него вывести балун. Создать балун не проблема, не поместить его в центр полигона — проблема.

В математике есть довольно сложные формулы для расчёта центра масс многоугольника, ими я не умею пользоваться. но в яндекс апи есть poly.geometry.getBounds(), который берёт максимально большой контур и находит центр. У меня тоже не получается его применить потому что полигон я создал не стандартным способом( new ymaps.Polygon()), а через map.geoObjects.add(objectManager);

Помогите пожалуйста получить координаты центра полигона.

Если нужно, то вот фиддл, который демонстрирует getBounds().

Медиана треугольника есть диаметр, делящий пополам хорды, параллельные основанию, поэтому на ней лежит центр тяжести (п° 217) площади треугольника. Следовательно, три медианы треугольника, пересекаясь, определяют центр тяжести площади треугольника.

Элементарные соображения показывают, что медианы треугольника пересекаются в точке, отстоящей на две трети длины каждой из них от соответствующей вершины. Поэтому центр тяжести площади треугольника лежит на любой его медиане на расстоянии двух третей ее длины от вершины.

219. Четырехугольник.

Центр тяжести площади четырехугольника определяется пересечением двух прямых, которые мы получаем, применяя распределительное свойство центров тяжести (п° 213).

Сначала делим четырехугольник диагональю на два треугольника. Центр тяжести четырехугольника лежит на прямой, соединяющей центры тяжести этих треугольников. Эта прямая и есть первая из двух искомых прямых.

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

220. Многоугольник.

Мы знаем способы нахождения центров тяжести площади треугольника и четырехугольника. Чтобы определить центр тяжести площади многоугольника с произвольным числом сторон, предположим, что мы умеем находить центр тяжести площади многоугольника с меньшим числом сторон.

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

221. Дуга окружности.

Пусть требуется определить центр тяжести дуги окружности АВ длины s. Отнесем окружность к двум взаимно перпендикулярным диаметрам ОХ и OY, из которых первый проходит через середину С дуги АВ. Центр тяжести лежит на оси ОХ, являющейся осью симметрии. Достаточно поэтому определить 5. Для этого имеем формулу:

Пусть будут: а — радиус окружности, с — длина хорды АВ, — угол между осью ОХ и радиусом, проведенным к элементу значения , соответствующие концам дуги АВ. Имеем:

Тогда, принимая В за переменную интегрирования и выполняя интегрирование вдоль дуги АВ, получим:

Следовательно, центр тяжести дуги окружности лежит на радиусе, проведенном через середину дуги, в точке, расстояние которой от центра окружности есть четвертая пропорциональная длины дуги, радиуса и хорды.

222. Круговой сектор.

Сектор, заключенный между дугой окружности и двумя радиусами ОА и ОВ, может быть разложен промежуточными радиусами на бесконечно малые равные между собою секторы. Эти элементарные секторы можно рассматривать как бесконечно узкие треугольники; центр тяжести каждого из них, по предыдущему, лежит на радиусе, проведенном через середину элементарной дуги этого сектора, на расстоянии двух третей длины радиуса от центра окружности. Равные между собою массы всех элементарных треугольников, сосредоточенные в их центрах тяжести, образуют однородную дугу окружности, радиус которой равен двум третям радиуса дуги сектора. Рассматриваемый случая приводится, таким образом, к отысканию центра тяжести этой однородной дуги, т. е. к задаче, решенной в предыдущем п°.

223. Тетраэдр.

Определим центр тяжести объема тетраэдра. Плоскость, проходящая через одно из ребер и через середину противоположного ребра, есть диаметральная плоскость, которая делит пополам хорды, параллельные этому последнему ребру: она содержит поэтому центр тяжести объема тетраэдра. Следовательно, шесть плоскостей, тетраэдра, из которых каждая проходит через одно из ребер и через середину противоположного ребра, пересекаются в одной точке, представляющей собой центр тяжести объема тетраэдра.

Рассмотрим тетраэдр ABCD (фиг. 37); соединим вершину А с центром тяжести I основания BCD; прямая AI есть пересечение диаметральных плоскостей, проходящих

через ребра АВ и поэтому она содержит искомый центр тяжести. Точка находится на расстоянии двух третей медианы ВН от вершины В. Точно так же возьмем на медиане АН точку К на расстоянии двух третей ее длины от вершины . Прямая В К пересечет прямую А в центре тяжести тетраэдра. Проведем из подобия треугольников АВН и ЮН видно, что IK есть третья часть АВ) далее, из подобия треугольников и ВГА заключаем, что есть третья часть .

Следовательно, центр тяжести объема тетраэдра лежит на отрезке, соединяющем любую вершину тетраэдра с центром тяжести противоположной грани, на расстоянии трех четвертей длины этого отрезка от вершины.

Заметим еще, что прямая, соединяющая середины Я и L двух противоположных ребер (фиг. 38) есть пересечение диаметральных плоскостей, проходящих через эти ребра, она также проходит через центр тяжести тетраэдра. Таким образом, три прямые, соединяющие середины противоположных ребер тетраэдра, пересекаются в его центре тяжести.

Пусть Н и — середины одной пары противоположных ребер (фиг. 38) и М, N — середины двух других противоположных ребер. Фигура HNLM есть параллелограм, стороны которого соответственно параллельны остальным

двум ребрам. Прямые HL и MN, соединяющие середины двух противоположных ребер, суть диагонали этого параллелограма, а значит, они в точке пересечения делятся пополам. Таким образом, центр тяжести тетраэдра лежит в середине отрезка, соединяющего середины двух противоположных ребер тетраэдра.

224. Пирамида с многоугольным основанием.

Центр тяжести пирамиды лежит на отрезке, соединяющем вершину пирамиды с центром тяжести основания на расстоянии трех четвертей длины этого отрезка от вершины.

Чтобы доказать эту теорему, разложим пирамиду на тетраэдры плоскостями, проведенными через вершину пирамиды и через диагонали основания ABCD (например BD на фиг. 39).

Проведем плоскость пересекающую ребра на расстоянии трех четвертей их длины от вершины. Эта плоскость содержит центры тяжести тетраэдров, а следовательно, и пирамиды. Массы тетраэдров, которые мы предполагаем сосредоточенными в их центрах тяжести, пропорциональны их объемам, следовательно и площадям из оснований (фиг. 39) или также площадям треугольников bad, bed. подобных предыдущим и расположенным в секущей плоскости abcd. Таким образом, искомый центр тяжести совпадает с центром тяжести многоугольника abcd. Последний же лежит на прямой, соединяющей вершину S пирамиды с центром тяжести (подобно расположенным) многоугольника основания.

225. Призма. Цилиндр. Конус.

На основании симметрии, центры тяжести призмы и цилиндра лежат на середине отрезка, соединяющего центры тяжести оснований.

Рассматривая конус, как предел вписанной в него пирамиды с той же вершиной, убеждаемся, что центр тяжести конуса лежит на отрезке, соединяющем вершину конуса с центром тяжести основания, на расстоянии трех четвертей длины этого отрезка от вершины. Можно также сказать, что центр тяжести конуса совпадает с центром тяжести сечения конуса плоскостью, параллельной основанию и проведенной на расстоянии одной четверти высоты конуса от основания.

Понятие “центр тяжести многоугольника” можно интерпретировать тремя различными способами:

  1. Масса находится только в вершинах, причем каждая вершина “весит” одинаково
  2. Масса равномерно распределена по границе многоугольника
  3. Масса равномерно распределена по области, ограниченной многоугольником.

Рассмотрим все три интерпретации в порядке возрастания сложности алгоритма.

1. Масса находится только в вершинах, причем каждая вершина весит одинаково

В этом случае координаты центра тяжести выражаются по формулам:

Таким образом для нашего частного случая имеем:

2. Масса равномерно распределена по границе многоугольника

В этом случае масса ребра пропорциональна его длине. Таким образом каждое ребро мы можем заменить на точечную массу (пропорциональную длине ребра). Затем применяя те же формулы для определения центра тяжести получаем:

Ниже представлена программа, реализующая описанный алгоритм:

3. Масса равномерно распределена по области, ограниченной многоугольником.

Этот случай уже не является столь тривиальным, как два предыдущих. Для построения алгоритма понадобится следующий факт:

Предложение 1
Пусть фигура Ф есть объединение двух других фигур Ф1 и Ф2 (пересекающихся только по границе).
Тогда центр тяжести фигуры Ф выражается так:

(Это утверждение очевидно следует из определения центра тяжести произвольной фигуры и свойства аддитивности интеграла)

Кроме того для треугольника центр тяжести определяется так:

Разобьем наш многоугольник на треугольники. Для каждого треугольника найдем его центр тяжести (Xci, Yci) и площадь (Si). После этого, согласно Предложению 1, координаты центра тяжести многоугольника можно найти следующим образом:

Остается вопрос, как разбить многоугольник на треугольники. Если многоугольник выпуклый, а вершины перечислены в порядке обхода по или против часовой стрелки, то достаточно просто найти одну точку внутри многоугольника (Xm,Ym), а затем разбить многоугольник на N следующих треугольников:

Если же многоугольник выпуклый, но вершины перечислены не в порядке обхода, то их придется упорядочить. Сделать это можно, например, отсортировав вершины по углу между положительной полуосью ОХ и вектором (Xi-Xm, Yi-Ym).

Невыпуклый многоугольник всегда можно разбить на несколько выпуклых. А затем, применив описанный алгоритм для каждой выпуклой части, и используя Предложение 1, найти центр тяжести всего многоугольника. Задача о разбиении произвольного многоугольника на выпуклые части является самостоятельной задачей, которая рассмотрена в соответствующем разделе. Поэтому представленная ниже реализация алгоритма работает только для выпуклых многоугольников.

Ниже представлен пример реализации описанного алгоритма на языке С для нахождения центра тяжести выпуклого многоугольника, вершины которого перечислены в порядке обхода по или против часовой стрелки:

Центр неправильного пятиугольника. Как найти центр неправильного пятиугольника?

Zayti



Знаток

(357),
на голосовании



13 лет назад

Голосование за лучший ответ

В_В_Владимир

Мастер

(2379)


13 лет назад

с помощью отвеса

Источник: школьная программа

FaustМастер (1202)

11 лет назад

Хотел бы я посмотреть, как ты это будешь делать!!! Из уголка свариищь модель 5-иугольника, который на чертеже начерчен???

В_В_Владимир
Мастер
(2379)
в школе делали лабу в 6 или 7 классе. вырезали из картона неправильный многоугольник. втыкаешь иголку с отвесом возле одной из сторон – проводишь линию отвеса. втыкаешь в другом месте – еще линия. две – три линии пересекаются практически в однойточке – центре тяжести многоугольника.
многоугольник можно удержать на острие иголки, поставленной в этот центр.
могу сделать рисунок.
а ты наверно прогуливал физику? шутка)))

Добавить комментарий