CADのような、科学技術系のソフトウェアでは、浮動小数点計算や、整数化による誤差が常に 問題になります。 134行からの関数convert1は、3次元空間上の多数の点の座標変換(回転)を行なっています。 たぶん、多数の座標値は、多角形の周囲を示し、その内部をハッチングするのが、本プログラムの 最終目的でしょう。座標、x,y,z別々にlong型の配列に保持されています。convert1の下請け関数 として、convert_sub1とconvert_sub2があります(完全に無意味な名前の付け方ですね)。 関数convert_sub1は、回転角度のsin,cosを求め、convert_sub2は、回転角度のsin,cosから多数 の座標値を実際に回転します。 元の関数convert1は、3つの部分から成り立っています。
座標値がlong型であるので、関数convert_sub2の回転計算でいくら精度を上げても、回転後の座 標値が整数化されてしまうため、相当の誤差が考えられます。各座標値は、(a),(b),(c)の各回で 回転による座標変換が行なわれます。したがって、整数化による誤差が3度も発生しています。し だいに形が崩れてきそうで恐いですね。 大学1年(理工系)や、専門学校で線形代数をちゃんと勉強していれば、もっとちゃんとしたや り方が分かりますよね。各座標に3回座標変換を施すのではなく、3つの座標変換の積を求めて、 それで全座標値を1度だけ座標変換すれば済みますね。計算も早くなるし、整数化の誤差も1度し か発生しないので、良いことずくめですね。 修正プログラム(リスト4−3)では、行列、ベクトルに対する基本的な関数をちゃんと用意し、 それらの組み合わせで処理するようにしました。 CAD、グラフィックスのようなプログラムでは、3次元座標変換などの一連の関数群をきちん と用意し、ちゃんとライブラリにして、全員で使うようにすることが不可欠です。個々の開発担当 者が別々に作ったりすると、開発効率や信頼性が著しく低下してしまいます。リスト4−3に追加 した関数は、ほんの一例に過ぎません。
|
オープンソース |