# Create a precise diagram of three equal circles in a 550mm x 455mm rectangle
import math
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle, Circle
import pandas as pd
from caas_jupyter_tools import display_dataframe_to_user
# Given dimensions (mm)
W, H = 550.0, 455.0
clearance = 2.0
# Optimal radius from the triangular packing height constraint:
r = (451 - math.sqrt(3)) / (2 + math.sqrt(3)) # mm
d_center = 2*r + clearance # center-to-center distance (adjacent)
dy = math.sqrt(3) * (r + 1) # vertical offset between rows
yb = r + clearance # y for bottom row centers
# Positions
x_center = W/2
x_left = x_center - d_center/2
x_right = x_center + d_center/2
y_top = yb + dy
# Create a dataframe with computed values
data = {
"Parameter": [
"Rectangle width (W)",
"Rectangle height (H)",
"Minimum clearance (all sides & between circles)",
"Circle radius (r)",
"Circle diameter (2r)",
"Adj. center distance (d = 2r + 2)",
"Row vertical offset (dy = √3·(r+1))",
"Bottom row center y (yb)",
"Left circle center (x, y)",
"Right circle center (x, y)",
"Top circle center (x, y)"
],
"Value (mm)": [
W,
H,
clearance,
r,
2*r,
d_center,
dy,
yb,
f"({x_left:.3f}, {yb:.3f})",
f"({x_right:.3f}, {yb:.3f})",
f"({x_center:.3f}, {y_top:.3f})",
]
}
df = pd.DataFrame(data)
display_dataframe_to_user("Optimized 3-Circle Packing — Key Numbers (mm)", df)
# Create diagram
fig, ax = plt.subplots(figsize=(7.5, 6.2), dpi=150)
# Draw outer rectangle boundary
rect = Rectangle((0, 0), W, H, fill=False, linewidth=1.5)
ax.add_patch(rect)
# Draw inner "center-allowed" rectangle (optional visual aid): [r+2, r+2] to [W-(r+2), H-(r+2)]
inner_x = r + clearance
inner_y = r + clearance
inner_rect = Rectangle((inner_x, inner_y), W - 2*inner_x, H - 2*inner_y, fill=False, linestyle='--', linewidth=1)
ax.add_patch(inner_rect)
# Draw circles
circles = [
Circle((x_left, yb), r, fill=False, linewidth=2),
Circle((x_right, yb), r, fill=False, linewidth=2),
Circle((x_center, y_top), r, fill=False, linewidth=2)
]
for c in circles:
ax.add_patch(c)
# Add simple annotations
ax.text(5, H - 15, f"r = {r:.3f} mm | 2r = {2*r:.3f} mm", fontsize=9, va='center')
ax.text(5, H - 30, f"d (center distance) = {d_center:.3f} mm | min clearance = {clearance:.1f} mm", fontsize=9, va='center')
ax.text(5, H - 45, f"dy = {dy:.3f} mm", fontsize=9, va='center')
# Axes formatting
ax.set_aspect('equal', adjustable='box')
ax.set_xlim(-5, W + 5)
ax.set_ylim(-5, H + 5)
ax.set_xlabel("mm")
ax.set_ylabel("mm")
ax.set_title("Three Maximal Equal Circles in 550×455 mm Rectangle with ≥2 mm Clearances")
# Save and show
output_path = "/mnt/data/three_circles_layout.png"
plt.tight_layout()
plt.savefig(output_path, bbox_inches='tight')
plt.show()
output_path