計量スプーンを同じ容量になるよう変形する(解説)

問題はこちら:

答え:約1.743倍に左に引き伸ばす

 全体スケールを0.9倍に縮めた後、半球の左半分を左方向に約1.743倍に引き伸ばすと、元の大さじ0.5杯分とほぼ同様の容積になります。この倍率をどのように導くか解説します。

解説1:全体スケールを0.9倍にすると体積は3乗

 全体スケールを0.9倍にするというのは、物の形は変えずに(=相似のまま)構成する辺の長さをすべて0.9倍にするという事です。

 例えば1辺の長さが1cmで体積が1cm³の立方体があるとしましょう:

 全体スケールを0.9倍にすると、立方体の形は変わらず(=相似のまま)辺の長さがすべて0.9倍になります。つまり、

体積は0.9の3乗、0.729倍に小さくなります。

 これは半球でも同様です。イメージするなら、半球の中に上のような立方体がみっちりと詰まっていると考えてみて下さい:

 上図だとまだ隙間がありますが、その間にも微小な立方体が隙間なく詰まっているとしたら、その全体体積は半球の体積とほぼ一緒ですよね。そして全体スケールを0.9倍にするというのは「形は相似のまま」辺の長さを0.9倍に縮めるのですから、上のみっちり詰まった立方体の全体像は変わらず辺だけが0.9倍になる。つまり半球でも容積は0.9の3乗に縮まるわけです。

解説2:1軸方向に引き伸ばした体積は倍率に比例する

 さて次に半球の左半分だけを左方向に引き伸ばして先細にした場合、その体積はどうなるのでしょうか?これも立方体を例に考えてみます:

元々1cm³だった立方体を右面をベースに左方向に1.5倍すると、上図のように左右面の正方形(1cm×1cm)の形は維持したまま、左右に伸びる辺の長さだけが1.5倍されます。これにより体積は1.5cm³になり、伸ばした倍率に比例している事がわかります。

 一般に特定の1軸にのみスケールをかけた場合、元の形は変形してしまいますが、体積はその倍率に比例して大きくなるんです。これは三角柱でも円柱でも半球でも同じです。考え方は全体スケールの時と同じで、伸ばしたい方向に平行になるよう小さい立方体を対象の容器の中にみっちりと詰め込んで引き伸ばせば良いですよね。伸ばす事で隙間が出来そうな感じもしますが、すべての立方体が引き伸ばす方向に等しい比率で伸びるのですから、元の立方体同士にあった位置関係は変わりません:

 ここまで見てきた全体スケールと1軸スケールと体積の関係を考慮して今回の問題を紐解いてみましょう。

解説3:方程式を立てよう

 では今回の問題にここまでの考え方を適用してみます。まず元の半球の体積をVとします。最初に全体スケールを0.9倍するので、その体積V1は、

です。全体スケール後の体積は倍率の3乗でしたよね。

 次に半球の左半分だけを1軸方向にx倍します。左半分の元の体積はV1の半分です。一方右半分は何もスケールしないのでそのまま。これより引き伸ばした後の体積V2は、

となります。このV2が元の体積Vと同じという事なので、上式のV2にVを代入すると、

このように式変形出来ます。両辺にVがあるのでVは消えてしまいますよね。すると方程式はxだけになります。後はxについて解くだけです:

 という事で全体を0.9倍に縮めた後、半球の左半分を1.743倍引き伸ばすような変形を3Dモデリングツールでかければ、元の容積と同じ先細の計量スプーンが作れます!

実際の出力品がこちら:

無骨なのもまた味わい。正にDIYです(^-^)

深掘:平行移動、回転、スケール変換は「アフィン変換」

 さて、今回は立体を全体スケールや1軸スケールで引き伸ばしたり縮めたりしてみました。全体スケールは縦横高さ(XYZ軸)どの方向にも等しく倍率をかけるので、立体の大きさは変わりますがスケール後の立体は元のと相似です。立方体を全体スケールしても立方体という事ですね。

 一方で1軸方向のみのスケールでは立体の形は変形してしまいます。立方体は直方体になってしまっていましたね。でもこのスケールで元の立方体にあった辺の「平行性」は変換後の直方体でも変わっていません:

左の立方体の同じ色同士は平行です。これを左右1軸方向にスケールしてできる直方体もまた同じ色同士が平行です。立体としての形は変形していますが平行性は失われていないですよね。

 これ実は元の立方体が斜めに傾いていても大丈夫なんです:

立方体を回転した後に左右方向に引き伸ばすと右のような辺が直行しない「平行六面体」になります。平行六面体と言うのは各面が平行四辺形で構成されている六面体です。平行四辺形なので辺の直行性は無くなってしまいますが、図から見て取れるように同じ色同士はやっぱり平行ですよね。

 このように元の図形の辺の平行性が失われない変換を「アフィン変換」と言います:

 アフィン変換はスケールだけではありません。元の立体を空中でくるくる回転しても、位置をずらしても元の立体の形は変わりませんよね。形が変わらないのなら、平行性も保ったままです。ですから回転変換や位置移動(平行移動)変換もアフィン変換の仲間です。

 アフィン変換した後の図形を別のアフィン変換にかけても、定義からやっぱり平行性は保たれます。これはアフィン変換の良い性質の一つです。

 僕の生業はゲームプログラマで、3Dキャラクタのモデルを良く扱います。モデルをワールドに配置する時にこの平行移動、回転、スケール変換を多用します。それがアフィン変換である事を利用すると、衝突判定などが楽になったりもします。3Dゲームを作る上でアフィン変換という名前は知らなくても良いですが、その性質を理解しておく事は大切なんです。

 工学の世界では距離センサーで測定を行う時にアフィン変換が必要になる事があります。センサーは理論通りの精度で必ず測定できるとは限りません。物理的に取りつけるセンサーはどうしても取り付け誤差が生じてしまい、元々直行している立方体などがほんのわずかに平行六面体として測定されてしまう事があります。これは「せん断」と言ってこれもアフィン変換の一つなんです。せん断を起こしている測定値を元の直行性のある形に修正するには、せん断の逆変換を掛け算する…みたいな事をします。そういう調整(キャリブレーション)をする事で高精度の測定を実現するんですね。

 という事で今回はスケールと体積の問題でした。ではまた(^-^)/


いいなと思ったら応援しよう!