ナプキンリング問題

異なる大きさの球を並べて、円柱でくり抜く。

その際、くりぬいた結果の高さがちょうど同じになるように円柱の太さを調整する。

すると得られたリング状の形は、大きさと厚みが違えども、どれも体積は同じになる。

詳しくは Wikipediaでの説明を参照。

サンプルコード

球と円柱の差を求める演算をBooleanDifference関数で行っている。

import rhinoscriptsyntax as rs
import math
 
a = []
 
NUM = 5
h = 100 # リングの高さ
x = 0
for i in range(NUM):
    R = 52 + i * 15  # 半径の計算
    x += 2*R + 20    # 配置位置
    r = math.sqrt(R*R-(h*h/4))  # 円柱の半径
    s = rs.AddSphere((x, 0, 0), R) # 球を作成
    c = rs.AddCylinder((x, 0, -200), 400, r)  # 円柱を作成
    a.extend(rs.BooleanDifference(s,c))  # 球と円柱の差を生成

.ghファイルのダウンロード napkin_ring.gh