背景

etabs自定义截面

公式

This code uses the following formulas:

Area of the polygon:

A=12∑i=1n(xiyi+1−xi+1yi)A = \frac{1}{2} \sum_{i=1}^{n} (x_i y_{i+1} - x_{i+1} y_i)A=21i=1n(xiyi+1xi+1yi)

Centroid coordinates:

Cx=16A∑i=1n(xi+xi+1)(xiyi+1−xi+1yi)C_x = \frac{1}{6A} \sum_{i=1}^{n} (x_i + x_{i+1})(x_i y_{i+1} - x_{i+1} y_i)Cx=6A1i=1n(xi+xi+1)(xiyi+1xi+1yi)

Cy=16A∑i=1n(yi+yi+1)(xiyi+1−xi+1yi)C_y = \frac{1}{6A} \sum_{i=1}^{n} (y_i + y_{i+1})(x_i y_{i+1} - x_{i+1} y_i)Cy=6A1i=1n(yi+yi+1)(xiyi+1xi+1yi)

Moment of inertia:

Ix=112∑i=0n−1(yi2+yiyi+1+yi+12)(xiyi+1−xi+1yi)Ix = \frac{1}{12}\sum{i=0}^{n-1} (yi^2 + yiy{i+1} + y{i+1}^2)(xi y{i+1} - x{i+1} yi)Ix=121i=0n1(yi2+yiyi+1+yi+12)(xiyi+1xi+1yi)
Iy=112∑i=0n−1(xi2+xixi+1+xi+12)(xiyi+1−xi+1yi)Iy = \frac{1}{12}\sum{i=0}^{n-1} (xi^2 + xi x{i+1} + x{i+1}^2)(xi y{i+1} - x{i+1} yi)Iy=121i=0n1(xi2+xixi+1+xi+12)(xiyi+1xi+1yi)
Ixy=124∑i=0n−1(2xiyi+xi+1yi+2xi+1yi+1+xiyi+1)(xiyi+1−xi+1yi)I{xy} = \frac{1}{24}\sum{i=0}^{n-1} (2xi yi + x{i+1} yi + 2x{i+1} y{i+1} + xi y{i+1})(xi y{i+1} - x{i+1} yi)Ixy=241i=0n1(2xiyi+xi+1yi+2xi+1yi+1+xiyi+1)(xiyi+1xi+1yi)
其中,nnn 是多边形的顶点数,(xi,yi)(xi,yi)(xi,yi) 表示多边形中第 iii 个顶点的坐标,(xi+1,yi+1)(x{i+1},y{i+1})(xi+1,yi+1) 表示多边形中第 i+1i+1i+1 个顶点的坐标,IxIxIx 代表多边形相对于 xxx 轴的惯性矩,IyIyIy 代表多边形相对于 yyy 轴的惯性矩,IxyI_{xy}Ixy 代表多边形相对于 xxxyyy 轴的二次惯性矩。

代码


import matplotlib.pyplot as plt

def polygon_area(vertices):
    n = len(vertices)
    area = 0
    for i in range(n):
        area += (vertices[i][0] * vertices[(i + 1) % n][1] - vertices[(i + 1) % n][0] * vertices[i][1])
    return 0.5 * abs(area)

def centroid(vertices):
    n = len(vertices)
    cx, cy = 0, 0
    area = polygon_area(vertices)
    for i in range(n):
        factor = (vertices[i][0] * vertices[(i + 1) % n][1] - vertices[(i + 1) % n][0] * vertices[i][1])
        cx += (vertices[i][0] + vertices[(i + 1) % n][0]) * factor
        cy += (vertices[i][1] + vertices[(i + 1) % n][1]) * factor
    return (1 / (6 * area)) * cx, (1 / (6 * area)) * cy

def moment_of_inertia(vertices):
    n = len(vertices)
    Ix, Iy, Ixy = 0, 0, 0
    area = polygon_area(vertices)
    for i in range(n):
        factor = (vertices[i][0] * vertices[(i + 1) % n][1] - vertices[(i + 1) % n][0] * vertices[i][1])
        Ix += (vertices[i][1]**2 + vertices[i][1]*vertices[(i + 1) % n][1] + vertices[(i + 1) % n][1]**2) * factor
        Iy += (vertices[i][0]**2 + vertices[i][0]*vertices[(i + 1) % n][0] + vertices[(i + 1) % n][0]**2) * factor
        Ixy += (vertices[i][0]*vertices[(i + 1) % n][1] + 2*vertices[i][0]*vertices[i][1] + 2*vertices[(i + 1) % n][0]*vertices[(i + 1) % n][1] + vertices[(i + 1) % n][0]*vertices[i][1]) * factor
    return (1 / 12) * abs(Ix), (1 / 12) * abs(Iy), (1 / 24) * abs(Ixy)

def plot_polygon(vertices, centroid):
    polygon = plt.Polygon(vertices, fill=None, edgecolor='r', linewidth=2)
    plt.gca().add_patch(polygon)
    plt.scatter(*centroid, color='blue', marker='o', s=100, label='Centroid')
    plt.axis('equal')
    plt.legend()
    plt.show()

# 可增加,从cad中读取
vertices = [(0, 0), (30, 0), (30, 30), (0, 30), (-20, 20)]

area = polygon_area(vertices)
centroid_coordinates = centroid(vertices)
Ix, Iy, Ixy = moment_of_inertia(vertices)

print("Area:", area)
print("Centroid:", centroid_coordinates)
print("Moment of Inertia: Ix =", Ix, "Iy =", Iy, "Ixy =", Ixy)

plot_polygon(vertices, centroid_coordinates)

总结

常用的markdown编辑器可以渲染latex格式代码
常用公式可以编程

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐