当前位置: 首页>>代码示例>>Python>>正文


Python Bspline.calc方法代码示例

本文整理汇总了Python中bspline.Bspline.calc方法的典型用法代码示例。如果您正苦于以下问题:Python Bspline.calc方法的具体用法?Python Bspline.calc怎么用?Python Bspline.calc使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在bspline.Bspline的用法示例。


在下文中一共展示了Bspline.calc方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: Body

# 需要导入模块: from bspline import Bspline [as 别名]
# 或者: from bspline.Bspline import calc [as 别名]
class Body(object):
    """FFD class for solid bodies which only have one surface"""

    def __init__(self, stl, controls, name="body", r_ref=None, x_ref=None):
        """stl must be an STL object"""

        self.stl = stl
        geom_points = stl.points

        self.coords = Coordinates(geom_points, cartesian=True)

        self.P = self.coords.cylindrical
        self.P_cart = self.coords.cartesian
        self.P_bar = geom_points.copy()  # just initialization
        if isinstance(controls, int):
            X = geom_points[:, 0]
            x_max = np.max(X)
            x_min = np.min(X)
            C_x = np.linspace(x_min, x_max, controls)
            C_r = np.zeros((controls,))
            control_points = np.array(zip(C_x, C_r))

            self.C = control_points
            self.n_controls = controls
        else:
            self.C = controls
            self.n_controls = len(controls)
        self.C_bar = self.C.copy()
        self.delta_C = np.zeros(self.C.shape)
        self.bs = Bspline(self.C, geom_points)

        self.name = name

        if x_ref is not None:
            self.x_mag = float(x_ref)
        else:
            self.x_mag = 10 ** np.floor(np.log10(np.average(geom_points[:, 0])))

        if r_ref is not None:
            self.r_mag = float(r_ref)
        else:
            indecies = np.logical_and(abs(geom_points[:, 2]) < 2e-6, geom_points[:, 1] > 0)
            points = geom_points[indecies]
            self.r_mag = 10 ** np.floor(
                np.log10(np.average(points[:, 1]))
            )  # grab the order of magnitude of the average

        # for revolution of 2-d profile
        # self.n_theta = 20

        # sgrab the theta values from the points
        self.Theta = self.P[:, 2]
        # this is too complex. shouldn't need to tile, then flatten later.
        self.sin_theta = np.tile(np.sin(self.Theta), (self.n_controls, 1)).T.flatten()
        self.cos_theta = np.tile(np.cos(self.Theta), (self.n_controls, 1)).T.flatten()
        # self.sin_theta = np.tile(np.sin(self.Theta),self.n_controls)
        # self.cos_theta = np.tile(np.cos(self.Theta),self.n_controls)

        # calculate derivatives
        # in polar coordinates
        self.dP_bar_xqdC = np.array(self.x_mag * self.bs.B.flatten())
        self.dP_bar_rqdC = np.array(self.r_mag * self.bs.B.flatten())

        # Project Polar derivatives into revolved cartisian coordinates
        self.dXqdC = self.dP_bar_xqdC.reshape(-1, self.n_controls)
        self.dYqdC = (self.dP_bar_rqdC * self.sin_theta).reshape(-1, self.n_controls)
        self.dZqdC = (self.dP_bar_rqdC * self.cos_theta).reshape(-1, self.n_controls)

    def copy(self):
        return copy.deepcopy(self)

    def deform(self, delta_C):
        """returns new point locations for the given motion of the control 
        points"""
        self.delta_C = delta_C
        self.delta_C[:, 0] = self.delta_C[:, 0] * self.x_mag
        self.C_bar = self.C + self.delta_C
        delta_P = self.bs.calc(self.C_bar)

        self.P_bar = self.P.copy()
        self.P_bar[:, 0] = delta_P[:, 0]
        self.P_bar[:, 1] = self.P[:, 1] + self.r_mag * delta_P[:, 1]

        # transform to cartesian coordinates
        self.coords = Coordinates(self.P_bar, cartesian=False)

        self.P_bar_cart = self.coords.cartesian
        self.Xo = self.P_bar_cart[:, 0]
        self.Yo = self.P_bar_cart[:, 1]
        self.Zo = self.P_bar_cart[:, 2]

        self.stl.update_points(self.P_bar_cart)

        return self.P_bar
开发者ID:JustinSGray,项目名称:FFD,代码行数:96,代码来源:ffd_axisymetric.py

示例2: Shell

# 需要导入模块: from bspline import Bspline [as 别名]
# 或者: from bspline.Bspline import calc [as 别名]
class Shell(object): 
    """FFD class for shell bodies which have two connected surfaces"""
    
    def __init__(self,upper_points,lower_points,center_iine_controls,thickness_controls,name='shell'): 
    
        self.Po = upper_points
        self.Pi = lower_points
        self.Po_bar = upper_points.copy()
        self.Pi_bar = lower_points.copy()
        self.name = name
        
        self.Cc = center_iine_controls
        self.Ct = thickness_controls 
         
        self.bsc_o = Bspline(self.Cc,upper_points)
        self.bsc_i = Bspline(self.Cc,lower_points)
        
        self.bst_o = Bspline(self.Ct,upper_points)
        self.bst_i = Bspline(self.Ct,lower_points)
        
        self.r_mag = np.average(upper_points[:,1])

        #for revolution of 2-d profile
        self.n_theta = 20

        self.Theta = np.linspace(0,2*np.pi,self.n_theta)
        self.ones = np.ones(self.n_theta)
        self.sin_theta = np.sin(self.Theta)
        self.cos_theta = np.cos(self.Theta)

        #calculate derivatives
        #in polar coordinates
        self.dPo_bar_xqdCc = self.bsc_o.B.flatten()
        self.dPo_bar_rqdCc = self.r_mag*self.bsc_o.B.flatten()

        self.dPi_bar_xqdCc = self.bsc_i.B.flatten()
        self.dPi_bar_rqdCc = self.r_mag*self.bsc_i.B.flatten()

        self.dPo_bar_rqdCt = self.r_mag*self.bst_o.B.flatten()
        self.dPi_bar_rqdCt = -1*self.r_mag*self.bst_i.B.flatten()

        #Project Polar derivatives into revolved cartisian coordinates
        self.dXoqdCc = np.outer(self.dPo_bar_xqdCc,self.ones)
        self.dYoqdCc = np.outer(self.dPo_bar_rqdCc,self.sin_theta)
        self.dZoqdCc = np.outer(self.dPo_bar_rqdCc,self.cos_theta)

        self.dXiqdCc = np.outer(self.dPi_bar_xqdCc,self.ones)
        self.dYiqdCc = np.outer(self.dPi_bar_rqdCc,self.sin_theta)
        self.dZiqdCc = np.outer(self.dPi_bar_rqdCc,self.cos_theta)

        self.dYoqdCt = np.outer(self.dPo_bar_rqdCt,self.sin_theta)
        self.dZoqdCt = np.outer(self.dPo_bar_rqdCt,self.cos_theta)
        self.dYiqdCt = np.outer(self.dPi_bar_rqdCt,self.sin_theta)
        self.dZiqdCt = np.outer(self.dPi_bar_rqdCt,self.cos_theta)

    
    def plot_geom(self,ax,initial_color='g',ffd_color='k'):
        if initial_color: 
            ax.scatter(self.Po[:,0],self.Po[:,1],c=initial_color,s=50,label="%s initial geom"%self.name)
            ax.scatter(self.Pi[:,0],self.Pi[:,1],c=initial_color,s=50)
            ax.plot(self.Po[:,0],self.Po[:,1],c=initial_color) 
            ax.plot(self.Pi[:,0],self.Pi[:,1],c=initial_color) 
        if ffd_color: 
            ax.scatter(self.Po_bar[:,0],self.Po_bar[:,1],c=ffd_color,s=50,label="%s ffd geom"%self.name) 
            ax.scatter(self.Pi_bar[:,0],self.Pi_bar[:,1],c=ffd_color,s=50) 
            ax.plot(self.Po_bar[:,0],self.Po_bar[:,1],c=ffd_color) 
            ax.plot(self.Pi_bar[:,0],self.Pi_bar[:,1],c=ffd_color) 

    def plot_centerline_spline(self,ax,point_color='r',line_color='b'):
        ax.scatter(self.Cc_bar[:,0],self.Cc_bar[:,1],c=point_color,s=50,label="%s Centerline Control Points"%self.name)
        map_points = self.bsc_o(np.linspace(0,1,100))
        ax.plot(map_points[:,0],map_points[:,1],label="Centerline b-spline Curve",c=line_color)

    def plot_thickness_spline(self,ax,point_color='r',line_color='b'):
        ax.scatter(self.Ct_bar[:,0],self.Ct_bar[:,1],c=point_color,s=50,label="%s Thickness Control Points"%self.name)
        map_points = self.bsc_o(np.linspace(0,1,100))
        ax.plot(map_points[:,0],map_points[:,1],label="Thickness b-spline Curve",c=line_color)


    def deform(self,delta_Cc,delta_Ct): 
        """returns new point locations for the given motion of the control 
        points for center-line and thickness"""      
        
        self.Cc_bar = self.Cc+delta_Cc
        delta_Pc_o = self.bsc_o.calc(self.Cc_bar)
        delta_Pc_i = self.bsc_i.calc(self.Cc_bar)
        
        self.Ct_bar = self.Ct+delta_Ct
        delta_Pt_o = self.bst_o.calc(self.Ct_bar)
        delta_Pt_i = self.bst_i.calc(self.Ct_bar)

        self.Po_bar = self.Po.copy()
        self.Pi_bar = self.Pi.copy()
        
        self.Po_bar[:,0] = delta_Pc_o[:,0]
        self.Po_bar[:,1] = self.Po[:,1]+self.r_mag*(delta_Pc_o[:,1]+delta_Pt_o[:,1])
        
        self.Pi_bar[:,0] = delta_Pc_i[:,0]
        self.Pi_bar[:,1] = self.Pi[:,1]+self.r_mag*(delta_Pc_i[:,1]-delta_Pt_i[:,1])
        
#.........这里部分代码省略.........
开发者ID:cnkavanaugh,项目名称:pyBspline,代码行数:103,代码来源:ffd.py

示例3: Shell

# 需要导入模块: from bspline import Bspline [as 别名]
# 或者: from bspline.Bspline import calc [as 别名]

#.........这里部分代码省略.........
        # calculate derivatives
        # in polar coordinates
        self.dPo_bar_xqdCc = np.array(self.x_mag * self.bsc_o.B.flatten())
        self.dPo_bar_rqdCc = np.array(self.r_mag * self.bsc_o.B.flatten())

        self.dPi_bar_xqdCc = np.array(self.x_mag * self.bsc_i.B.flatten())
        self.dPi_bar_rqdCc = np.array(self.r_mag * self.bsc_i.B.flatten())

        self.dPo_bar_rqdCt = np.array(self.r_mag * self.bst_o.B.flatten())
        self.dPi_bar_rqdCt = -1 * np.array(self.r_mag * self.bst_i.B.flatten())

        # Project Polar derivatives into revolved cartisian coordinates
        self.dXoqdCc = self.dPo_bar_xqdCc.reshape(-1, self.n_c_controls)
        self.dYoqdCc = (self.dPo_bar_rqdCc * self.sin_outer_c_theta).reshape(-1, self.n_c_controls)
        self.dZoqdCc = (self.dPo_bar_rqdCc * self.cos_outer_c_theta).reshape(-1, self.n_c_controls)

        self.dXiqdCc = self.dPi_bar_xqdCc.reshape(-1, self.n_c_controls)
        self.dYiqdCc = (self.dPi_bar_rqdCc * self.sin_inner_c_theta).reshape(-1, self.n_c_controls)
        self.dZiqdCc = (self.dPi_bar_rqdCc * self.cos_inner_c_theta).reshape(-1, self.n_c_controls)

        self.dYoqdCt = (self.dPo_bar_rqdCt * self.sin_outer_t_theta).reshape(-1, self.n_t_controls)
        self.dZoqdCt = (self.dPo_bar_rqdCt * self.cos_outer_t_theta).reshape(-1, self.n_t_controls)
        self.dYiqdCt = (self.dPi_bar_rqdCt * self.sin_inner_t_theta).reshape(-1, self.n_t_controls)
        self.dZiqdCt = (self.dPi_bar_rqdCt * self.cos_inner_t_theta).reshape(-1, self.n_t_controls)

    def copy(self):
        return copy.deepcopy(self)

    def plot_geom(self, ax, initial_color="g", ffd_color="k"):
        if initial_color:
            ax.scatter(self.Po[:, 0], self.Po[:, 1], c=initial_color, s=50, label="%s initial geom" % self.name)
            ax.scatter(self.Pi[:, 0], self.Pi[:, 1], c=initial_color, s=50)
            ax.plot(self.Po[:, 0], self.Po[:, 1], c=initial_color)
            ax.plot(self.Pi[:, 0], self.Pi[:, 1], c=initial_color)
        if ffd_color:
            ax.scatter(self.Po_bar[:, 0], self.Po_bar[:, 1], c=ffd_color, s=50, label="%s ffd geom" % self.name)
            ax.scatter(self.Pi_bar[:, 0], self.Pi_bar[:, 1], c=ffd_color, s=50)
            ax.plot(self.Po_bar[:, 0], self.Po_bar[:, 1], c=ffd_color)
            ax.plot(self.Pi_bar[:, 0], self.Pi_bar[:, 1], c=ffd_color)

    def plot_centerline_spline(self, ax, point_color="r", line_color="b"):
        ax.scatter(
            self.Cc_bar[:, 0], self.Cc_bar[:, 1], c=point_color, s=50, label="%s Centerline Control Points" % self.name
        )
        map_points = self.bsc_o(np.linspace(0, 1, 100))
        ax.plot(map_points[:, 0], map_points[:, 1], label="Centerline b-spline Curve", c=line_color)

    def plot_thickness_spline(self, ax, point_color="r", line_color="b"):
        ax.scatter(
            self.Ct_bar[:, 0], self.Ct_bar[:, 1], c=point_color, s=50, label="%s Thickness Control Points" % self.name
        )
        map_points = self.bst_o(np.linspace(0, 1, 100))
        ax.plot(map_points[:, 0], map_points[:, 1], label="Thickness b-spline Curve", c=line_color)

    def deform(self, delta_Cc, delta_Ct):
        """returns new point locations for the given motion of the control 
        points for center-line and thickness"""

        self.delta_Cc = delta_Cc
        self.delta_Cc[:, 0] *= self.x_mag
        self.Cc_bar = self.Cc + self.delta_Cc
        delta_Pc_o = self.bsc_o.calc(self.Cc_bar)
        delta_Pc_i = self.bsc_i.calc(self.Cc_bar)

        self.delta_Ct = delta_Ct
        self.Ct_bar = self.Ct + self.delta_Ct
        delta_Pt_o = self.bst_o.calc(self.Ct_bar)
        delta_Pt_i = self.bst_i.calc(self.Ct_bar)

        self.Po_bar = self.Po.copy()
        self.Pi_bar = self.Pi.copy()

        self.Po_bar[:, 0] = delta_Pc_o[:, 0]
        self.Po_bar[:, 1] = self.Po[:, 1] + self.r_mag * (delta_Pc_o[:, 1] + delta_Pt_o[:, 1])

        self.Pi_bar[:, 0] = delta_Pc_i[:, 0]
        self.Pi_bar[:, 1] = self.Pi[:, 1] + self.r_mag * (delta_Pc_i[:, 1] - delta_Pt_i[:, 1])

        # transform to cartesian coordinates
        self.outer_coords = Coordinates(self.Po_bar, cartesian=False)
        self.inner_coords = Coordinates(self.Pi_bar, cartesian=False)

        # Perform axial roation of 2-d polar coordiantes
        # outer surface
        self.Po_bar_cart = self.outer_coords.cartesian
        self.Xo = self.Po_bar_cart[:, 0]
        self.Yo = self.Po_bar_cart[:, 1]
        self.Zo = self.Po_bar_cart[:, 2]

        self.outer_stl.update_points(self.Po_bar_cart)

        # inner surface
        self.Pi_bar_cart = self.inner_coords.cartesian
        self.Xi = self.Po_bar_cart[:, 0]
        self.Yi = self.Po_bar_cart[:, 1]
        self.Zi = self.Po_bar_cart[:, 2]

        self.inner_stl.update_points(self.Pi_bar_cart)

        return self.Po_bar, self.Pi_bar
开发者ID:JustinSGray,项目名称:FFD,代码行数:104,代码来源:ffd_axisymetric.py

示例4: Body

# 需要导入模块: from bspline import Bspline [as 别名]
# 或者: from bspline.Bspline import calc [as 别名]
class Body(object): 
    """FFD class for solid bodyies which only have one surface""" 
    
    def __init__(self,geom_points,control_points,name="body"): 
    
        self.P = geom_points
        self.P_bar = geom_points.copy()
        self.C = control_points  
        self.bs = Bspline(control_points,geom_points)
        self.name = name
        
        self.r_mag = np.average(geom_points[:,1])


        #for revolution of 2-d profile
        self.n_theta = 20

        self.Theta = np.linspace(0,2*np.pi,self.n_theta)
        self.ones = np.ones(self.n_theta)
        self.sin_theta = np.sin(self.Theta)
        self.cos_theta = np.cos(self.Theta)

        #calculate derivatives
        #in polar coordinates
        self.dP_bar_xqdC = self.bs.B.flatten()
        self.dP_bar_rqdC = self.r_mag*self.bs.B.flatten()

        #Project Polar derivatives into revolved cartisian coordinates
        self.dXqdC = np.outer(self.dP_bar_xqdC,self.ones)
        self.dYqdC = np.outer(self.dP_bar_rqdC,self.sin_theta)
        self.dZqdC = np.outer(self.dP_bar_rqdC,self.cos_theta)

    def deform(self,delta_C): 
        """returns new point locations for the given motion of the control 
        points"""         
        self.C_bar = self.C+delta_C
        
        delta_P = self.bs.calc(self.C_bar)
        self.P_bar = self.P.copy()
        self.P_bar[:,0] = delta_P[:,0]
        self.P_bar[:,1] = self.P[:,1]+self.r_mag*delta_P[:,1] 

        #Perform axial roation of 2-d polar coordiantes
        P_bar_r = self.P_bar[:,1]
        self.Xo = np.outer(self.P_bar[:,0],self.ones)
        self.Yo = np.outer(P_bar_r,self.sin_theta)
        self.Zo = np.outer(P_bar_r,self.cos_theta)

        return self.P_bar

    def plot_spline(self,ax,point_color='r',line_color='b'): 
        map_points = self.bs(np.linspace(0,1,100))
        ax.plot(map_points[:,0],map_points[:,1],c=line_color,label="%s b-spline"%self.name)
        ax.scatter(self.C_bar[:,0],self.C_bar[:,1],c=point_color,label="%s control points"%self.name,s=50) 

    def plot_geom(self,ax,initial_color='g',ffd_color='k'): 
        if initial_color: 
            ax.scatter(self.P[:,0],self.P[:,1],c=initial_color,s=50,label="%s initial geom"%self.name)
            ax.plot(self.P[:,0],self.P[:,1],c=initial_color)
        if ffd_color:     
            ax.scatter(self.P_bar[:,0],self.P_bar[:,1],c=ffd_color,s=50,label="%s ffd geom"%self.name) 
            ax.plot(self.P_bar[:,0],self.P_bar[:,1],c=ffd_color)
开发者ID:cnkavanaugh,项目名称:pyBspline,代码行数:64,代码来源:ffd.py


注:本文中的bspline.Bspline.calc方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。