Beispiel #1
0
 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)
Beispiel #3
0
def cspseglength(sp1,sp2, tolerance = 0.001):
    bez = (sp1[1][:],sp1[2][:],sp2[0][:],sp2[1][:])
    return bezmisc.bezierlength(bez, tolerance)    
Beispiel #4
0
    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
Beispiel #5
0
	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)))
Beispiel #6
0
	def l(self, i, tolerance=0.001) :
		return bezmisc.bezierlength( self.cp_to_list(i)[:2]+self.cp_to_list(i+1)[1:], tolerance)
Beispiel #7
0
 def realLength(self):
     return bezierlength(self.curve)
Beispiel #8
0
 def l(self, i, tolerance=0.001):
     return bezmisc.bezierlength(
         self.cp_to_list(i)[:2] + self.cp_to_list(i + 1)[1:], tolerance)