Пример #1
0
    def tangentToCircle_base(self, other, tangentFunction):
        centersDiff = other.center.minus(self.center)
        centersAngle = math.atan2(centersDiff.y, centersDiff.x)
        maxAngle = centersAngle + math.pi * 0.5
        minAngle = centersAngle - math.pi * 0.5

        minDiff, _, _ = tangentFunction(minAngle)
        maxDiff, _, _ = tangentFunction(maxAngle)
        #        print 'minAngle', minAngle
        #        print 'maxAngle', maxAngle
        #        print 'minDiff', minDiff
        #        print 'maxDiff', maxDiff

        if maxDiff < minDiff:
            maxDiff, minDiff = minDiff, maxDiff
            maxAngle, minAngle = minAngle, maxAngle
#            print 'minAngle\'', minAngle
#            print 'maxAngle\'', maxAngle
#            print 'minDiff\'', minDiff
#            print 'maxDiff\'', maxDiff

        MAX_ATTEMPTS = 32
        for _ in xrange(MAX_ATTEMPTS):
            tangentAngle = (maxAngle + minAngle) * 0.5
            anglesDiff, p0, p1 = tangentFunction(tangentAngle)

            #            print
            #            print 'tangentAngle', tangentAngle
            #            print 'anglesDiff', anglesDiff

            OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS = getFloatRoundingTolerance(
            )

            #            print
            #            print 'tangentAngle', tangentAngle
            #            print 'centersAngle', centersAngle
            ##            print 'tangentsAngle', tangentsAngle
            #            print 'anglesDiff', anglesDiff

            if abs(anglesDiff) < OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS:
                result = TFSMap()
                result.p0 = p0
                result.p1 = p1
                result.angle = tangentAngle
                return result

            if anglesDiff > 0:
                maxAngle = tangentAngle
            else:
                minAngle = tangentAngle

        raise Exception('Did not converge')
Пример #2
0
    def tangentToCircle_base(self, other, tangentFunction):
        centersDiff = other.center.minus(self.center)
        centersAngle = math.atan2(centersDiff.y, centersDiff.x)
        maxAngle = centersAngle + math.pi * 0.5
        minAngle = centersAngle - math.pi * 0.5

        minDiff, _, _ = tangentFunction(minAngle)
        maxDiff, _, _ = tangentFunction(maxAngle)
#        print 'minAngle', minAngle
#        print 'maxAngle', maxAngle
#        print 'minDiff', minDiff
#        print 'maxDiff', maxDiff

        if maxDiff < minDiff:
            maxDiff, minDiff = minDiff, maxDiff
            maxAngle, minAngle = minAngle, maxAngle
#            print 'minAngle\'', minAngle
#            print 'maxAngle\'', maxAngle
#            print 'minDiff\'', minDiff
#            print 'maxDiff\'', maxDiff

        MAX_ATTEMPTS = 32
        for _ in xrange(MAX_ATTEMPTS):
            tangentAngle = (maxAngle + minAngle) * 0.5
            anglesDiff, p0, p1 = tangentFunction(tangentAngle)

#            print
#            print 'tangentAngle', tangentAngle
#            print 'anglesDiff', anglesDiff

            OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS = getFloatRoundingTolerance()

#            print
#            print 'tangentAngle', tangentAngle
#            print 'centersAngle', centersAngle
##            print 'tangentsAngle', tangentsAngle
#            print 'anglesDiff', anglesDiff

            if abs(anglesDiff) < OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS:
                result = TFSMap()
                result.p0 = p0
                result.p1 = p1
                result.angle = tangentAngle
                return result

            if anglesDiff > 0:
                maxAngle = tangentAngle
            else:
                minAngle = tangentAngle

        raise Exception('Did not converge')
Пример #3
0
    def tangentToCircle(self, other, isLeft, isCross=False):
        def getTangentAngleDiff(tangentAngle):
            #            tangentAngle = (maxAngle + minAngle) * 0.5
            if isLeft:
                sideAngle = tangentAngle + math.pi / 2
            else:
                sideAngle = tangentAngle - math.pi / 2

            p0 = self.evaluate(sideAngle)
            if isCross:
                otherAngle = sideAngle + math.pi * 1.0
            else:
                otherAngle = sideAngle
            p1 = other.evaluate(otherAngle)

            angle01 = p1.minus(p0).atan2()
            pTangent = self.evaluateTangent(sideAngle)
            #            print 'pTangent', pTangent
            if isLeft:
                pTangent = pTangent.invert()
#            print 'pTangent', pTangent
            pTangentAngle = pTangent.atan2()

            anglesDiff = normalizeRadiansDiff(angle01 - pTangentAngle)
            #            print 'tangentAngle', tangentAngle
            #            print 'pTangentAngle', pTangentAngle
            #            print 'angle01', angle01
            #            print 'anglesDiff', anglesDiff
            return anglesDiff, p0, p1

        centersDiff = other.center.minus(self.center)
        centersAngle = math.atan2(centersDiff.y, centersDiff.x)
        maxAngle = centersAngle + math.pi * 0.5
        minAngle = centersAngle - math.pi * 0.5

        minDiff, _, _ = getTangentAngleDiff(minAngle)
        maxDiff, _, _ = getTangentAngleDiff(maxAngle)
        #        print 'minAngle', minAngle
        #        print 'maxAngle', maxAngle
        #        print 'minDiff', minDiff
        #        print 'maxDiff', maxDiff

        if maxDiff < minDiff:
            maxDiff, minDiff = minDiff, maxDiff
            maxAngle, minAngle = minAngle, maxAngle
#            print 'minAngle\'', minAngle
#            print 'maxAngle\'', maxAngle
#            print 'minDiff\'', minDiff
#            print 'maxDiff\'', maxDiff

        MAX_ATTEMPTS = 32
        for _ in xrange(MAX_ATTEMPTS):
            tangentAngle = (maxAngle + minAngle) * 0.5
            anglesDiff, p0, p1 = getTangentAngleDiff(tangentAngle)

            #            print
            #            print 'tangentAngle', tangentAngle
            #            print 'anglesDiff', anglesDiff

            OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS = getFloatRoundingTolerance(
            )
            OVAL_TO_OVAL_TANGENT_APPROXIMATION_FACTOR = 0.65
            OVAL_TO_OVAL_TANGENT_APPROXIMATION_FACTOR = 0.5

            #            print
            #            print 'tangentAngle', tangentAngle
            #            print 'centersAngle', centersAngle
            ##            print 'tangentsAngle', tangentsAngle
            #            print 'anglesDiff', anglesDiff

            if abs(anglesDiff) < OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS:
                result = TFSMap()
                result.p0 = p0
                result.p1 = p1
                result.angle = tangentAngle
                return result

            if anglesDiff > 0:
                maxAngle = tangentAngle
            else:
                minAngle = tangentAngle

        raise Exception('Did not converge')
Пример #4
0
    def tangentToCircle(self, other, isLeft, isCross=False):

        def getTangentAngleDiff(tangentAngle):
#            tangentAngle = (maxAngle + minAngle) * 0.5
            if isLeft:
                sideAngle = tangentAngle + math.pi / 2
            else:
                sideAngle = tangentAngle - math.pi / 2

            p0 = self.evaluate(sideAngle)
            if isCross:
                otherAngle = sideAngle + math.pi * 1.0
            else:
                otherAngle = sideAngle
            p1 = other.evaluate(otherAngle)

            angle01 = p1.minus(p0).atan2()
            pTangent = self.evaluateTangent(sideAngle)
#            print 'pTangent', pTangent
            if isLeft:
                pTangent = pTangent.invert()
#            print 'pTangent', pTangent
            pTangentAngle = pTangent.atan2()

            anglesDiff = normalizeRadiansDiff(angle01 - pTangentAngle)
#            print 'tangentAngle', tangentAngle
#            print 'pTangentAngle', pTangentAngle
#            print 'angle01', angle01
#            print 'anglesDiff', anglesDiff
            return anglesDiff, p0, p1

        centersDiff = other.center.minus(self.center)
        centersAngle = math.atan2(centersDiff.y, centersDiff.x)
        maxAngle = centersAngle + math.pi * 0.5
        minAngle = centersAngle - math.pi * 0.5

        minDiff, _, _ = getTangentAngleDiff(minAngle)
        maxDiff, _, _ = getTangentAngleDiff(maxAngle)
#        print 'minAngle', minAngle
#        print 'maxAngle', maxAngle
#        print 'minDiff', minDiff
#        print 'maxDiff', maxDiff

        if maxDiff < minDiff:
            maxDiff, minDiff = minDiff, maxDiff
            maxAngle, minAngle = minAngle, maxAngle
#            print 'minAngle\'', minAngle
#            print 'maxAngle\'', maxAngle
#            print 'minDiff\'', minDiff
#            print 'maxDiff\'', maxDiff

        MAX_ATTEMPTS = 32
        for _ in xrange(MAX_ATTEMPTS):
            tangentAngle = (maxAngle + minAngle) * 0.5
            anglesDiff, p0, p1 = getTangentAngleDiff(tangentAngle)

#            print
#            print 'tangentAngle', tangentAngle
#            print 'anglesDiff', anglesDiff

            OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS = getFloatRoundingTolerance()
            OVAL_TO_OVAL_TANGENT_APPROXIMATION_FACTOR = 0.65
            OVAL_TO_OVAL_TANGENT_APPROXIMATION_FACTOR = 0.5

#            print
#            print 'tangentAngle', tangentAngle
#            print 'centersAngle', centersAngle
##            print 'tangentsAngle', tangentsAngle
#            print 'anglesDiff', anglesDiff

            if abs(anglesDiff) < OVAL_TO_OVAL_TANGENT_PRECISION_RADIANS:
                result = TFSMap()
                result.p0 = p0
                result.p1 = p1
                result.angle = tangentAngle
                return result

            if anglesDiff > 0:
                maxAngle = tangentAngle
            else:
                minAngle = tangentAngle

        raise Exception('Did not converge')