该项目是《Problem-independent machine learning (PIML)-based topology optimization—A universal approach》的python复现
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

55 lines
1.7 KiB

import numpy as np
import utils.b_spline.parameter_selection as ps
import utils.b_spline.bspline_curve as bc
def surface(P, p, q, piece_uv, knot_uv):
'''
Calculate points on the surface.
:param P: control points
:param p: degree of u direction (u)
:param q: degree of v direction (v)
:param piece_uv: the number of points on u/v direction
:return: data points on the surface
'''
P_X = P[0]
P_Y = P[1]
P_Z = P[2]
M = len(P_X)
N = len(P_X[0])
param_u = np.linspace(0, 1, piece_uv[0])
param_v = np.linspace(0, 1, piece_uv[1])
Nik_u = np.zeros((piece_uv[0], M)).tolist()
Nik_v = np.zeros((piece_uv[1], N)).tolist()
D_tmp = [np.zeros((piece_uv[0], N)).tolist(),
np.zeros((piece_uv[0], N)).tolist(),
np.zeros((piece_uv[0], N)).tolist()]
knot_u = knot_uv[0]
for i in range(N):
P_control_X = [x[i] for x in P_X]
P_control_Y = [y[i] for y in P_Y]
P_control_Z = [z[i] for z in P_Z]
P_control = [P_control_X, P_control_Y, P_control_Z]
D_col = bc.curve(P_control, M, p, param_u, knot_u)
for j in range(len(D_col[0])):
D_tmp[0][j][i] = D_col[0][j]
D_tmp[1][j][i] = D_col[1][j]
D_tmp[2][j][i] = D_col[2][j]
D = [np.zeros((piece_uv[0], piece_uv[1])).tolist(),
np.zeros((piece_uv[0], piece_uv[1])).tolist(),
np.zeros((piece_uv[0], piece_uv[1])).tolist()]
knot_v = knot_uv[1]
for i in range(piece_uv[0]):
P_control = [D_tmp[0][i], D_tmp[1][i], D_tmp[2][i]]
D_ = bc.curve(P_control, N, q, param_v, knot_v)
D[0][i] = D_[0]
D[1][i] = D_[1]
D[2][i] = D_[2]
return D