コード例 #1
0
def circleArc(center, start, end):
    radToStart = vector.translate(vector.minus(center))(start)
    radToEnd = vector.translate(vector.minus(center))(end)
    radiusSquared = vector.norm(radToStart)*vector.norm(radToEnd)
    radius = math.sqrt(radiusSquared)
    
    innerProductValue = vector.innerproduct(radToStart, radToEnd)
    angle = math.acos(innerProductValue/radiusSquared)
    
    firstUnitRadial = vector.unit(radToStart)
    secondUnitRadial = vector.unit(vector.translate(vector.scale(radToStart,-innerProductValue/radiusSquared))(radToEnd))
    
    def CN(t):
        point = vector.translate(center)(vector.translate(vector.scale(firstUnitRadial,radius*math.cos(t/radius)))(vector.scale(secondUnitRadial,radius*math.sin(t/radius))))
        tangent = vector.translate(vector.scale(firstUnitRadial,-math.sin(t/radius)))(vector.scale(secondUnitRadial,math.cos(t/radius)))
        output = [point,tangent]
        #output.append([math.cos(t/radius),math.sin(t/radius),0])
        return output

    return TwistingAxis(angle*radius,CN)
コード例 #2
0
def smoothedPieceWiseLinearFullFunctionality(points, mapFromSpaceToTime, Wnew, smoothingFactor = 0.33):
    if len(points) < 2:
        print("Error: only " + str(len(points)) + " points supplied to smoothedPieceWiseLinear")
        return
    
    currentPoints = copy.deepcopy(points)
    numPoints = len(currentPoints)
    
    attachElements = [cutSegment(points[0],points[1],0,smoothingFactor)]
    
    for i in range(0,numPoints - 2):
        lastToPivot = vector.translate(vector.minus(points[i]))(points[i+1])
        pivotToNext = vector.translate(vector.minus(points[i+1]))(points[i+2])
        angle = vector.innerproduct(lastToPivot, pivotToNext)/(vector.norm(lastToPivot)*vector.norm(pivotToNext))
        collinear = (abs(angle) < 0.001)
        if collinear:
            attachElements.append(cutSegment(points[i],points[i+1],smoothingFactor,1))
            attachElements.append(cutSegment(points[i+1],points[i+2],1,smoothingFactor))
        else:
            attachElements.append(cutSegment(points[i],points[i+1],smoothingFactor,1-smoothingFactor))
            attachElements.append(circleArcAroundPivotClosestPieces(points[i+1],points[i],points[i+2],smoothingFactor))
    
    attachElements.append(cutSegment(points[-2],points[-1],smoothingFactor,1))
    
    def iteratedAttach(start, end):
        if start < end:
            midpoint = (start + end)/2
            iteratedAttach(start, midpoint)
            iteratedAttach(midpoint + 1, end)
            attachElements[start].attachPartial(1, attachElements[midpoint + 1])
    iteratedAttach(0, len(attachElements)-1)
    Wmap = attachElements[0]
    
    produceN2 = lambda x : vector.unit(vector.orthogonalComponent(vector.translate(vector.minus(Wnew.ev(mapFromSpaceToTime(x[0]))[0]))(x[0]),x[1]))
    appendN2 = lambda x: [x[0],x[1],produceN2(x)]
    Wmap.CN = compose(appendN2,Wmap.CN)
    
    return [Wmap, Wnew, lambda t: mapFromSpaceToTime(Wmap.ev(t)[0])]
コード例 #3
0
 def projectOntoAxis(self, point):
     return vector.innerproduct(point,self.tng) - vector.innerproduct(self.start,self.tng)