明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2333|回复: 6

[尺规拾趣] 来个大家都爱的爆算题

[复制链接]
发表于 2025-2-2 13:54:32 来自手机 | 显示全部楼层 |阅读模式
做一个矩形,满足其内部能放下5个如图相切的圆,(相连处全都相切),题目出自Ander大佬

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 金钱 +12 收起 理由
qjchen + 1 + 12 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2025-2-5 15:57:11 | 显示全部楼层

圆贼多,费神:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +3 金钱 +42 收起 理由
qjchen + 2 + 30 赞一个! yimin兄算力很强,我走错一步以为.
highflybird + 1 + 12 神马都是浮云

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2025-2-2 23:20:36 | 显示全部楼层
本帖最后由 qjchen 于 2025-2-3 09:40 编辑




挺有趣的题目,用python编了好一段代码才求出来,大概有14位的精度


随手改编下两道题,把此题右边的线改为45度线,直角梯形:),

结果又如何






这些圆圆的相切球,想起了当年做Joselin版主的许多切圆的题目,集合如下,快乐的年轻时光 :)
101-200
[公告]典型问题及其解法大集中! - 几何算法 - AutoCAD论坛 - 明经CAD社区 - 第2页 - Powered by Discuz! (mjtd.com)
1-100
[公告]典型问题及其解法大集中! - 几何算法 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz! (mjtd.com)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-3 17:17:05 来自手机 | 显示全部楼层
有根式解哦
回复 支持 反对

使用道具 举报

发表于 2025-2-5 16:10:08 | 显示全部楼层
a=100;

b=86.850301679939548081238453054628...;
R1=31.090998694367849448184538993009...。
回复 支持 反对

使用道具 举报

发表于 2025-2-9 20:32:09 | 显示全部楼层
本帖最后由 yimin0519 于 2025-2-9 20:42 编辑
qjchen 发表于 2025-2-2 23:20
挺有趣的题目,用python编了好一段代码才求出来,大概有14位的精度

矩形的情况只有一种(所谓不同唯镜像矣),如为凸四边形则可能有多种情况。

高一定、“45°”直角梯形一角放置一“恒星”圆(其它四圆拱卫),“唯一”性情况共有四种(且诸圆互不相等),见下图:

有时间看能否“爆算”一下,看能付诸尺规作图的又有凡几。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-2-10 10:46:13 | 显示全部楼层
本帖最后由 qjchen 于 2025-2-11 07:40 编辑




代码修改一下,倒是不难算,迟些有空整理好了再把代码放上来。


顺便开个与此题相类似的题目
几何作图题111

左上角以X轴镜像之后的求解代码如下(不少是AI辅助写的),此时,以基准圆半径为1进行计算,没啥技术含量,也没啥通用性,姑且放到这里
  1. import numpy as np
  2. from scipy.optimize import fsolve
  3. import math

  4. def line_circle_intersection(p1, p2, center, radius):
  5.     x1, y1 = p1
  6.     x2, y2 = p2
  7.     h, k = center
  8.    
  9.     # 如果直线是垂直于 x 轴的直线(x = 常数)
  10.     if x1 == x2:
  11.         x_line = x1
  12.         discriminant = radius**2 - (x_line - h)**2
  13.         if discriminant < 0:
  14.             return []  # 无交点
  15.         y1_intersect = k + np.sqrt(discriminant)
  16.         y2_intersect = k - np.sqrt(discriminant)
  17.         return [(x_line, y1_intersect), (x_line, y2_intersect)]
  18.     A = y2 - y1
  19.     B = x1 - x2
  20.     C = x2 * y1 - x1 * y2
  21.     distance = abs(A * h + B * k + C) / np.sqrt(A**2 + B**2)
  22.     if distance > radius:
  23.         return []
  24.     a = A**2 + B**2
  25.     b = 2 * (A * C + A * B * k - B**2 * h)
  26.     c = C**2 + 2 * B * C * k - B**2 * (radius**2 - h**2 - k**2)
  27.     discriminant = b**2 - 4 * a * c
  28.     if discriminant < 0:
  29.         return []
  30.    
  31.     # 计算 x 坐标
  32.     x_intersect1 = (-b + np.sqrt(discriminant)) / (2 * a)
  33.     x_intersect2 = (-b - np.sqrt(discriminant)) / (2 * a)
  34.    
  35.     # 计算 y 坐标
  36.     y_intersect1 = (-A * x_intersect1 - C) / B if B != 0 else (-A * x_intersect1 - C) / 1e-10
  37.     y_intersect2 = (-A * x_intersect2 - C) / B if B != 0 else (-A * x_intersect2 - C) / 1e-10
  38.    
  39.     # 返回交点
  40.     return [(x_intersect1, y_intersect1), (x_intersect2, y_intersect2)]

  41. # 定义方程组
  42. def equations(vars, circle1, circle2, line):
  43.     x, y, r = vars
  44.     x1, y1, r1 = circle1  # 示例圆1的参数
  45.     x2, y2, r2 = circle2  # 示例圆2的参数
  46.     x3, y3, x4, y4 = line  # 示例直线的参数

  47.     # 圆1的约束
  48.     eq1 = (x - x1)**2 + (y - y1)**2 - (r + r1)**2

  49.     # 圆2的约束
  50.     eq2 = (x - x2)**2 + (y - y2)**2 - (r + r2)**2

  51.     # 直线的约束
  52.     A = y4 - y3
  53.     B = x3 - x4
  54.     C = x4 * y3 - x3 * y4
  55.     eq3 = (A * x + B * y + C)**2 - r**2 * (A**2 + B**2)

  56.     return [eq1, eq2, eq3]

  57. # 二分法寻找 assumeX 使得 y5 = r5
  58. def find_assumeX():
  59.     low, high = 0.4, 0.5
  60.     tolerance = 1e-16
  61.     while high - low > tolerance:
  62.         assumeX = (low + high) / 2
  63.         
  64.         p1 = (assumeX, 0)
  65.         p2 = (assumeX, 3)
  66.         circle1center = (1, 1)
  67.         circle1radius = 1 + assumeX

  68.         intersections = line_circle_intersection(p1, p2, circle1center, circle1radius)
  69.         
  70.         if intersections:
  71.             max_y_intersection = max(intersections, key=lambda point: point[1])
  72.             x_value, y_value = max_y_intersection
  73.         else:
  74.             x_value, y_value = 0, 0
  75.         
  76.         # 初始猜测值
  77.         initial_guess = [2, 2, 1]
  78.         circle1 = [1, 1, 1]
  79.         circle2 = [x_value, y_value, assumeX]
  80.         line = [0, y_value + assumeX, 3, y_value + assumeX]

  81.         # 求解方程组
  82.         solution = fsolve(equations, initial_guess, args=(circle1, circle2, line))
  83.         x3, y3, r3 = solution

  84.         initial_guess = [3, 2, 1]
  85.         circle11 = [1, 1, 1]
  86.         circle13 = [x3, y3, r3]

  87.         # 求解方程组
  88.         solution = fsolve(equations, initial_guess, args=(circle11, circle13, line))
  89.         x4, y4, r4 = solution

  90.         initial_guess = [3, 0.5, 1]
  91.         circle11 = [1, 1, 1]
  92.         circle14 = [x4, y4, r4]
  93.         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]

  94.         # 求解方程组
  95.         solution = fsolve(equations, initial_guess, args=(circle11, circle14, line1))
  96.         x5, y5, r5 = solution
  97.         print(f"当前猜测值: {assumeX}, 解得: x = {x5}, y = {y5}, r = {r5}")
  98.         
  99.         if abs(y5 - r5) < tolerance:
  100.             return assumeX
  101.         elif y5 > r5:
  102.             low = assumeX
  103.         else:
  104.             high = assumeX
  105.    
  106.     return (low + high) / 2

  107. # 找到合适的 assumeX
  108. optimal_assumeX = find_assumeX()
  109. print(f"找到的 assumeX: {optimal_assumeX}")
复制代码







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-1 08:24 , Processed in 0.277622 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表