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]
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)
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)
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)
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)
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)
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)
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)
def __init__(self, *pointTuples): list.__init__(self, (Vector4(x[0], x[1], -1., 1) for x in pointTuples))