- 积分
- 36800
- 明经币
- 个
- 注册时间
- 2006-12-16
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2025-2-10 10:46:13
|
显示全部楼层
本帖最后由 qjchen 于 2025-2-11 07:40 编辑
代码修改一下,倒是不难算,迟些有空整理好了再把代码放上来。
顺便开个与此题相类似的题目
几何作图题111
左上角以X轴镜像之后的求解代码如下(不少是AI辅助写的),此时,以基准圆半径为1进行计算,没啥技术含量,也没啥通用性,姑且放到这里
- import numpy as np
- from scipy.optimize import fsolve
- import math
- def line_circle_intersection(p1, p2, center, radius):
- x1, y1 = p1
- x2, y2 = p2
- h, k = center
-
- # 如果直线是垂直于 x 轴的直线(x = 常数)
- if x1 == x2:
- x_line = x1
- discriminant = radius**2 - (x_line - h)**2
- if discriminant < 0:
- return [] # 无交点
- y1_intersect = k + np.sqrt(discriminant)
- y2_intersect = k - np.sqrt(discriminant)
- return [(x_line, y1_intersect), (x_line, y2_intersect)]
- A = y2 - y1
- B = x1 - x2
- C = x2 * y1 - x1 * y2
- distance = abs(A * h + B * k + C) / np.sqrt(A**2 + B**2)
- if distance > radius:
- return []
- a = A**2 + B**2
- b = 2 * (A * C + A * B * k - B**2 * h)
- c = C**2 + 2 * B * C * k - B**2 * (radius**2 - h**2 - k**2)
- discriminant = b**2 - 4 * a * c
- if discriminant < 0:
- return []
-
- # 计算 x 坐标
- x_intersect1 = (-b + np.sqrt(discriminant)) / (2 * a)
- x_intersect2 = (-b - np.sqrt(discriminant)) / (2 * a)
-
- # 计算 y 坐标
- y_intersect1 = (-A * x_intersect1 - C) / B if B != 0 else (-A * x_intersect1 - C) / 1e-10
- y_intersect2 = (-A * x_intersect2 - C) / B if B != 0 else (-A * x_intersect2 - C) / 1e-10
-
- # 返回交点
- return [(x_intersect1, y_intersect1), (x_intersect2, y_intersect2)]
- # 定义方程组
- def equations(vars, circle1, circle2, line):
- x, y, r = vars
- x1, y1, r1 = circle1 # 示例圆1的参数
- x2, y2, r2 = circle2 # 示例圆2的参数
- x3, y3, x4, y4 = line # 示例直线的参数
- # 圆1的约束
- eq1 = (x - x1)**2 + (y - y1)**2 - (r + r1)**2
- # 圆2的约束
- eq2 = (x - x2)**2 + (y - y2)**2 - (r + r2)**2
- # 直线的约束
- A = y4 - y3
- B = x3 - x4
- C = x4 * y3 - x3 * y4
- eq3 = (A * x + B * y + C)**2 - r**2 * (A**2 + B**2)
- return [eq1, eq2, eq3]
- # 二分法寻找 assumeX 使得 y5 = r5
- def find_assumeX():
- low, high = 0.4, 0.5
- tolerance = 1e-16
- while high - low > tolerance:
- assumeX = (low + high) / 2
-
- p1 = (assumeX, 0)
- p2 = (assumeX, 3)
- circle1center = (1, 1)
- circle1radius = 1 + assumeX
- intersections = line_circle_intersection(p1, p2, circle1center, circle1radius)
-
- if intersections:
- max_y_intersection = max(intersections, key=lambda point: point[1])
- x_value, y_value = max_y_intersection
- else:
- x_value, y_value = 0, 0
-
- # 初始猜测值
- initial_guess = [2, 2, 1]
- circle1 = [1, 1, 1]
- circle2 = [x_value, y_value, assumeX]
- line = [0, y_value + assumeX, 3, y_value + assumeX]
- # 求解方程组
- solution = fsolve(equations, initial_guess, args=(circle1, circle2, line))
- x3, y3, r3 = solution
- initial_guess = [3, 2, 1]
- circle11 = [1, 1, 1]
- circle13 = [x3, y3, r3]
- # 求解方程组
- solution = fsolve(equations, initial_guess, args=(circle11, circle13, line))
- x4, y4, r4 = solution
- initial_guess = [3, 0.5, 1]
- circle11 = [1, 1, 1]
- circle14 = [x4, y4, r4]
- line1 = [x4 + r4*math.cos(math.pi/4), y4 - r4*math.sin(math.pi/4), x4 + r4*math.cos(math.pi/4)-3, y4 - r4*math.sin(math.pi/4)-3]
- # 求解方程组
- solution = fsolve(equations, initial_guess, args=(circle11, circle14, line1))
- x5, y5, r5 = solution
- print(f"当前猜测值: {assumeX}, 解得: x = {x5}, y = {y5}, r = {r5}")
-
- if abs(y5 - r5) < tolerance:
- return assumeX
- elif y5 > r5:
- low = assumeX
- else:
- high = assumeX
-
- return (low + high) / 2
- # 找到合适的 assumeX
- optimal_assumeX = find_assumeX()
- print(f"找到的 assumeX: {optimal_assumeX}")
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|