def length(self): return bezierlength(((self.p0.x, self.p0.y), (self.p1.x, self.p1.y), (self.p2.x, self.p2.y), (self.pn.x, self.pn.y)))
def cspseglength(sp1, sp2, tolerance=0.001): bez = (sp1[1][:], sp1[2][:], sp2[0][:], sp2[1][:]) return bezmisc.bezierlength(bez, tolerance)
def cspseglength(sp1,sp2, tolerance = 0.001): bez = (sp1[1][:],sp1[2][:],sp2[0][:],sp2[1][:]) return bezmisc.bezierlength(bez, tolerance)
def computePointsXY(self, pathId, offsets, globalOffset=0.0): #offsets.sort() if they have random order, but objects should be sorted respectively to them if self.selected[pathId].get( 'd'): #determine path parameters and transform it mat = [[1, 0, 0], [0, 1, 0]] m = simpletransformed.parseTransform( self.selected[pathId].get('transform')) m = simpletransformed.composeTransform(mat, m) csp = cubicsuperpath.parsePath(self.selected[pathId].get('d')) simpletransformed.applyTransformToPath(m, csp) else: inkex.debug( "Only paths are supported as a guide. Make sure your path is in back of other objects." ) return None retval = [] offsetP = 0 curveLengths = [] totalLength = 0.0 last_subpath = 0 for csp_i in xrange(len(csp)): last_subpath = csp_i for i in xrange(len(csp[csp_i]) - 1): #For every segment of a path #determine its length curveLengths.append( bezmisc.bezierlength( (csp[csp_i][i][1], csp[csp_i][i][2], csp[csp_i][i + 1][0], csp[csp_i][i + 1][1]))) #Compute total lenth of a path by sum of each part totalLength = totalLength + curveLengths[-1] if totalLength >= ( offsets[offsetP] + globalOffset ): #If offset belongs to current path's part while ( offsets[offsetP] + globalOffset ) <= totalLength: #for all offsets that belong to current path's part dlength = totalLength - ( offsets[offsetP] + globalOffset ) #distance between part start and offset t = 1 - dlength / curveLengths[ -1] #I don't understand bezier basics... seems that this is right #Compute x,y and alpha as atan(slope) x, y = bezmisc.bezierpointatt( (csp[csp_i][i][1], csp[csp_i][i][2], csp[csp_i][i + 1][0], csp[csp_i][i + 1][1]), t) dx, dy = bezmisc.bezierslopeatt( (csp[csp_i][i][1], csp[csp_i][i][2], csp[csp_i][i + 1][0], csp[csp_i][i + 1][1]), t) try: alpha = math.atan( dy / dx ) #FIXME: divsion by zero on straight lines and 90deg. rotation except: alpha = 0.0 retval.append([x, y, alpha]) #Append to result offsetP = offsetP + 1 if offsetP > (len(offsets) - 1): #If no more offsets return value return retval #If total sum of distances between objects are greater than curve length, # then put one more object that beyond the curve in last valid position # and others left in their places if len(retval) < len(offsets): #for i in xrange(len(retval),len(offsets)): #to place all reminded objects x, y = bezmisc.bezierpointatt( (csp[last_subpath][-2][1], csp[last_subpath][-2][2], csp[last_subpath][-1][0], csp[last_subpath][-1][1]), 1.0) retval.append([x, y, 0.0]) return retval
def length(self): return bezierlength(((self.p0.x,self.p0.y),(self.p1.x,self.p1.y),(self.p2.x,self.p2.y),(self.pn.x,self.pn.y)))
def l(self, i, tolerance=0.001) : return bezmisc.bezierlength( self.cp_to_list(i)[:2]+self.cp_to_list(i+1)[1:], tolerance)
def realLength(self): return bezierlength(self.curve)
def l(self, i, tolerance=0.001): return bezmisc.bezierlength( self.cp_to_list(i)[:2] + self.cp_to_list(i + 1)[1:], tolerance)