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
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
|
|
|