Пример #1
0
 def getWDerivativeAt(self,u,v,w):
     """ Compute point at (u,v,w) """
     udeg = self.udegree
     uspan = sg.NurbsCurve.findSpan(u,udeg,self.uknots)        
     Nu = sg.NurbsCurve.basisFunctions(uspan, u, udeg, self.uknots)
     
     vdeg = self.vdegree
     vspan = sg.NurbsCurve.findSpan(v,vdeg,self.vknots)
     Nv = sg.NurbsCurve.basisFunctions(vspan, v, vdeg, self.vknots)
     
     wdeg = self.wdegree
     wspan = sg.NurbsCurve.findSpan(w,wdeg,self.wknots)
     Nw = sg.NurbsCurve.derivatesBasisFunctions(1, w, wspan, wdeg, self.wknots)
     
     tmp = [[None for i in range(vdeg+1)] for j in range(wdeg+1)]
     for i in range(0,wdeg+1):
         for j in range(0,vdeg+1):
             tmpVec = Vector4(0,0,0,0)
             for k in range(0,udeg+1):
                 tmpVec += self.points[uspan-udeg+k][vspan-vdeg+j][wspan-wdeg+i] * Nu[k]
             tmp[i][j] = tmpVec
     
     tmp2 = [None for i in range(self.wdegree+1)]
     for i in range(0,wdeg+1):
         tmpVec = Vector4(0,0,0,0)
         for j in range(0,vdeg+1):
             tmpVec += tmp[i][j] * Nv[j]
         tmp2[i] = tmpVec
     
     res = [Vector4() for i in range(2)]
     for j in range(2):
       for i in range(0,wdeg+1):
         res[j] += tmp2[i] * Nw[j,i]
     return res[1]
Пример #2
0
 def setPoint(self, index, npoint):
     crv = self.curve
     pi = crv.ctrlPointList[index]
     crv.ctrlPointList[index] = Vector4(npoint[0], npoint[1], pi[2], 1)
     if self.profile is not None and \
            crv is not None and \
            self.position in self.profile:
         self.profile[
             self.position] = interpolated_profile.CrossSection(
                 *crv.ctrlPointList)
Пример #3
0
 def getUPatch(self,u):
     udeg = self.udegree
     uspan = sg.NurbsCurve.findSpan(u,udeg,self.uknots)        
     Nu = sg.NurbsCurve.basisFunctions(uspan, u, udeg, self.uknots)
    
     tmp = [[None for j in range(self.wdim)] for i in range(self.vdim)]
     for i in range(0,self.vdim):
         for j in range(0,self.wdim):
             tmpVec = Vector4(0,0,0,0)
             for k in range(0,udeg+1):
                 tmpVec += self.points[uspan-udeg+k][i][j] * Nu[k]
             tmp[i][j] = tmpVec
     return sg.NurbsPatch(tmp,self.vknots,self.wknots,self.vdegree,self.wdegree,self.vstride,self.wstride)
Пример #4
0
 def getWPatch(self,w):
     wdeg = self.wdegree
     wspan = sg.NurbsCurve.findSpan(w,wdeg,self.wknots)
     Nw = sg.NurbsCurve.basisFunctions(wspan, w, wdeg, self.wknots)
    
     tmp = [[None for j in range(self.vdim)] for i in range(self.udim)]
     for i in range(0,self.udim):
         for j in range(0,self.vdim):
             tmpVec = Vector4(0,0,0,0)
             for k in range(0,wdeg+1):
                 tmpVec += self.points[i][j][wspan-wdeg+k] * Nw[k]
             tmp[i][j] = tmpVec
     return sg.NurbsPatch(tmp,self.uknots,self.vknots,self.udegree,self.vdegree,self.ustride,self.vstride)
Пример #5
0
    def getPointAt(self, u, v, w):
        """ Compute point at (u,v,w) """
        udeg = self.udegree
        uspan = sg.NurbsCurve.findSpan(u, udeg, self.uknots)
        Nu = sg.NurbsCurve.basisFunctions(uspan, u, udeg, self.uknots)

        vdeg = self.vdegree
        vspan = sg.NurbsCurve.findSpan(v, vdeg, self.vknots)
        Nv = sg.NurbsCurve.basisFunctions(vspan, v, vdeg, self.vknots)

        wdeg = self.wdegree
        wspan = sg.NurbsCurve.findSpan(w, wdeg, self.wknots)
        Nw = sg.NurbsCurve.basisFunctions(wspan, w, wdeg, self.wknots)

        tmp = [[None for i in xrange(vdeg + 1)] for j in xrange(wdeg + 1)]
        for i in xrange(0, wdeg + 1):
            for j in xrange(0, vdeg + 1):
                tmpVec = Vector4(0, 0, 0, 0)
                for k in xrange(0, udeg + 1):
                    tmpVec += self.points[uspan - udeg + k][vspan - vdeg +
                                                            j][wspan - wdeg +
                                                               i] * Nu[k]
                tmp[i][j] = tmpVec

        tmp2 = [None for i in xrange(wdeg + 1)]
        for i in xrange(0, wdeg + 1):
            tmpVec = Vector4(0, 0, 0, 0)
            for j in xrange(0, vdeg + 1):
                tmpVec += tmp[i][j] * Nv[j]
            tmp2[i] = tmpVec

        res = Vector4(0, 0, 0, 0)
        for i in xrange(0, wdeg + 1):
            res += tmp2[i] * Nw[i]

        if res.w != 0:
            return res.project()
        else:
            return Vector3(res.x, res.y, res.z)
Пример #6
0
 def getVPatch(self,v):
     vdeg = self.vdegree
     vspan = sg.NurbsCurve.findSpan(v,vdeg,self.vknots)
     Nv = sg.NurbsCurve.basisFunctions(vspan, v, vdeg, self.vknots)
    
     tmp = [[None for j in range(self.wdim)] for i in range(self.udim)]
     for i in range(0,self.udim):
         for j in range(0,self.wdim):
             tmpVec = Vector4(0,0,0,0)
             for k in range(0,vdeg+1):
                 tmpVec += self.points[i][vspan-vdeg+k][j] * Nv[k]
             tmp[i][j] = tmpVec
     return sg.NurbsPatch(tmp,self.uknots,self.wknots,self.udegree,self.wdegree,self.ustride,self.wstride)
     
Пример #7
0
def cubic_bezier3D(ctrl_points, uniform=False, stride=60):
    """Construct a nurbs from a set of ctrl_points
	
	ctrl_points are control points in space that
	define a cubic bezier nurbs as proposed in svg norm
	http://www.w3.org/TR/SVG/paths.html#PathDataCurveCommands
	
	An arc `i` of the resulting curve will interpolate
	points 4 * i, 4 * i +1, 4 * i + 2, 4 * i + 3.
	
	:Parameters:
	 - `ctrl_points` (list of Vector) - a list
	    of control points
	 - `uniform` (bool) - if True, the parameterization
	    of the curve will be chosen such that each
	    segment will be of length 1 in u space, wathever 
	    its real geometrical size.
	 - `stride` (int) - number of points to discretize
	    the curve
	
	:Returns Type: :class:NurbsCurve
	"""
    degree = 3
    ctrl_points = [Vector3(*vec) for vec in ctrl_points]

    nb_pts = len(ctrl_points)
    nb_arc = (nb_pts - 1) / degree
    nb_knots = degree + nb_pts
    p = 0.
    param = [p]
    for i in xrange(nb_arc):
        if uniform:
            p += 1
        else:
            p += norm(ctrl_points[degree * i] \
                    - ctrl_points[degree * (i + 1)])
        param.append(p)
    kv = [param[0]]
    for p in param:
        for j in xrange(degree):
            kv.append(p)
    kv.append(param[-1])

    #curve
    return NurbsCurve([Vector4(v, 1.) for v in ctrl_points], kv, degree,
                      stride)
Пример #8
0
    def create_control_point(self, abscissa):
        """Inserts an interpolated control point
        to every defining section at position = abscissa.

        The abscissa is expressed in the get_abscissa_range() range.
        """
        abscissa = self.normalised_abscissa(abscissa)
        if abscissa == 1.0 or abscissa == 0.0:
            return
        if self.__patch:
            rows = self.itervalues()
            afterId = InterpolatedProfile.__find_index_in_polyline(
                abscissa, self.itervalues().next(), is_abscissa=True)
            beforeId = afterId - 1
            ptPairs = [(c[afterId], c[beforeId]) for c in rows]

            ptList = [ Vector4(abscissa, self.__lin_interpolation(abscissa, before, after), after[2], 1) \
                       for after, before in ptPairs ]
            self.insert_column_before(afterId, ptList)
Пример #9
0
 def __init__(self, *pointTuples):
     list.__init__(self, (Vector4(x[0], x[1], -1., 1) for x in pointTuples))