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')
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')
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')
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')