格子の変換(昨日の続き)
id:mercure:20060302:1141301010 の行列だと determinant (実は体積に等しい)があわない。なので自力で考えてみた。興味のある人だけどうぞ。
長さ1の直交基底, , は、元の平行六面体に対して任意にとれるので、次の様にとることに決める。
- は に平行
- は と でできる面内にとる
こうすると、, , はこう書ける。
以下で , , はそれぞれ、と, と, と のなす角のこと。
1 から明らかに
2 から は の への射影、 は の を 90度回転したベクトルへの射影なので、
となる。
と を と で表せるようになった。この関係から と が求まる。
残りは だけになった。これはちょっと面倒臭いかも。ベクトルの外積を使わないといけないかなぁ。
ということで と の外積 から攻めてみる。外積 は と に垂直で の大きさ(ベクトル と でできる平行四辺形の面積)を持つベクトルです。なのでこのベクトルに の射影を掛ける(つまり内積をとる)と平行六面体の体積となります。この体積をとりあえず としておくと、
ところで と はもう と で書けているので、
ちょっとズルをして公式集を眺めると体積 は だそうなので、
となります。なので変換行列は
となりました。む、やはり昨日のとちょっと違うな。ともあれ、めでたしめでたし、ということで。
ちなみに昨日の行列は openbabel 1.1 のソースをみて書いたもので、 最新の openbabel 2.0 ではちゃんと上の行列になってます。