座標系と図面データベース

OCS と任意の軸のアルゴリズム

幾何学的に平面を特定するには原点と【押し出し方向】すなわち平面の法線だけでは情報が不足しています。これだけでは、法線を同一としながらも X 軸 Y 軸が異なる平面が無限に存在します。しかしながら、AutoCAD では【任意の軸のアルゴリズム】を用いることによってX 軸 Y軸を「強引に」決定します。

Arbitrary Axis Algorithm

【任意の軸のアルゴリズム】は Arbitrary Axis Algorithm の翻訳ですが、「任意」といえば「あなたの都合の良いように」というやわらかいイメージもありますが、Arbitrary を辞書で調べると「任意」以外に「勝手な、独断的な、専横な」という言葉が並んでいます。

AutoCAD のヘルプから【任意の軸のアルゴリズム】のポイントを箇条書きに書き下すと、以下の通りです。

  1. 単位ベクトルである【押し出し方向】から、以下の方法でX軸を決定する。
    A)【押し出し方向】ベクトルの X と Y の絶対値が共に 1/64 未満ならば、WCS の Y 軸と【押し出し方向】ベクトルの外積を X 軸とする。
    B)【押し出し方向】ベクトルの X と Y の絶対値がいずれか 1/64 以上ならば、WCS の Z 軸と【押し出し方向】ベクトルの外積を X 軸とする。
  2. 【押し出し方向】ベクトルと上で求まった X 軸と合わせて、さらに外積とることによって Y 軸を求める。

多くの場合 OCS に基づく座標変換では【押し出し方向】を指定して trans 関数を使えますので、直接 OCS の変換マトリックスを使用することは少ないかと思いますが、【押し出し方向】から OCS を表す変換マトリックスを計算する OCS-Matrix 関数は次のようになります。

(defun OCS-Matrix (normalVector / threshold axisX axisY)
  (setq normalVector (vector:Unit normalVector)
        threshold    (/ 1.0 64)
        axisX        (vector:Unit
                       (if (and (< (abs (car normalVector)) threshold)
                                (< (abs (cadr normalVector)) threshold)
                           )
                         ;; WCS AXIS-Y x normal
                         (3DVector:CrossProduct '(0.0 1.0 0.0) normalVector)
                         ;; WCS AXIS-Z x normal
                         (3DVector:CrossProduct '(0.0 0.0 1.0) normalVector)
                       )
                     )
        axisY        (3DVector:CrossProduct normalVector axisX)
  )
  (make-transformation-matrix '(0.0 0.0 0.0) axisX axisY)
)

関数の使用例は以下の通りです。引数には【押し出し方向】ベクトルを指定します。

_$ (OCS-Matrix '(0.0 0.0 1.0)) ⏎
((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
_$ (OCS-Matrix '(1.0 1.0 0.0)) ⏎
((-0.707107 0.0 0.707107 0.0) (0.707107 0.0 0.707107 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 0.0 1.0))

【押し出し方向】から OCS の変換マトリックスを作成することができるようになりました。この変換マトリックスを使って座標変換をすれば trans 関数と同じことができます。しかし、OCS は配置したい図形の位置とは関係なく原点は WCS の原点ですし X 軸 Y 軸の方向も図形を配置したい方向とは関係なく決まっているので、その間を埋める計算を行わなければなりません。