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)
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])]
def projectOntoAxis(self, point): return vector.innerproduct(point,self.tng) - vector.innerproduct(self.start,self.tng)