在这种情况下,点的平均值并不是形心。一般来说,面积的中心是面积的一阶矩。因此,你必须计算定义图形形状的多边形的面积,然后计算每个轴的面积的一阶矩:sum((r_i * A_i), for i in range(N))/sum(A_i)。因此,我们可以得到位于图形轮廓上的一组点: data.dat的内容:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_table('data.dat',delim_whitespace=True,skiprows=[0],names=['x','y'],index_col=False)
x = data.x.to_numpy()
y = data.y.to_numpy()
N = range(len(data)-1)
M = np.array([(x[i]-x[i+1])*(y[i]+y[i+1])/2 for i in N]) #Area of each trapezoid
My = np.array([(x[i]+x[i+1])/2 for i in N])*M #Moment of area (area*distance to centroid) with respect to the Y axis of each trapezoid
Mx = np.array([(y[i]+y[i+1])/4 for i in N])*M #Moment of area (area*distance to centroid) with respect to the X axis of each trapezoid
X = sum(My)/sum(M)
Y = sum(Mx)/sum(M)
centroid = [X , Y]
points_ave = data.mean(axis=0)
plt.plot(data.x, data.y, 'r',marker='.',markeredgecolor='black', markersize=3)
plt.plot(*centroid, 'blue', marker='o',markeredgecolor='black', markersize=7)
plt.plot(*points_ave, 'green', marker='o',markeredgecolor='black', markersize=7)
plt.axis('equal')
plt.xlim((-0.05, 1.05))
plt.legend(['GOE 383 AIRFOIL','Centroid','Average of points'])
4条答案
按热度按时间lf5gs5x21#
如果你指的是质心,你只需要得到所有点的平均值。
kpbwa7wx2#
如果这组点是一个大小为N x 2的numpy数组
positions
,则质心简单地由下式给出:它会直接给予你一个numpy数组的两个坐标。
一般来说,numpy数组可以以矢量化的方式用于所有这些度量,与
for
循环相比,这种方式非常紧凑和 * 非常 * 快速。ibps3vxo3#
我假设一个点是一个像(x,y)这样的元组,所以你可以使用zip来连接x和y,然后使用x和y的最小值和最大值,你可以确定中心点。
输出示例
envsm3lx4#
在这种情况下,点的平均值并不是形心。一般来说,面积的中心是面积的一阶矩。因此,你必须计算定义图形形状的多边形的面积,然后计算每个轴的面积的一阶矩:
sum((r_i * A_i), for i in range(N))/sum(A_i)
。因此,我们可以得到位于图形轮廓上的一组点:data.dat
的内容:代码:计算截面一阶矩
在下图中,您可以非常清楚地看到非均匀点采样是如何使结果偏斜的。点的平均值仅对点质量或集中属性有用。