20章:座標の同時変換

作成2012.11.16
     座標変換は3次元の図形を扱うには不可欠な変換ですが、Z軸回転、Y軸回転、X軸回転、 XYZ倍率、XYZ移動を同時変換する手法が最近の主流のようです。

  1. 変換前と変換後の座標の行列
     3次元座標はXYZの3軸ですが、座標同時変換においては変換前行列[U]と変換後行列[V]を以下のように定義します。



  2. XYZ移動変換行列の定義
     dx,dy.dzの移動を行う変換行列[Ht]は以下のように定義されます。



  3. XYZ倍率変換行列の定義
     XYZ倍率変換を行う変換行列[Hm]は変換倍率をmx,my,mzとして、以下のように定義されます。



  4. Z軸回転変換行列の定義
     Z軸回転変換を行う変換行列[Hz]は回転角をθzとして、以下のように定義されます。



  5. Y軸回転変換行列の定義
     Y軸回転変換を行う変換行列[Hy]は回転角をθyとして、以下のように定義されます。



  6. X軸回転変換行列の定義
     X軸回転変換を行う変換行列[Hx]は回転角をθxとして、以下のように定義されます。



  7. 単独の座標変換の計算
     Z軸回転変換を単独で行う行う場合は以下の計算をします。



  8. 複数の座標変換の計算
     Z軸回転、Y軸回転、X軸回転、XYZ倍率、XYZ移動の順で、変換を単独で行う行う場合は以下の計算をします。

    ここで、下記の計算をあらかじめ行います。

     (20.9)式を使用すると、Z軸回転、Y軸回転、X軸回転、XYZ倍率、XYZ移動の同時変換は以下のようになります。

     ここで、注意しなければならないのは、(20.9)式の計算は行列の積であり、計算の順番が変わると異なる値となります。しかし多くの場合、変換の順番は一定であることが多く、変換条件は一定であることがほとんどです。
     このような場合、Z軸回転、Y軸回転、X軸回転、XYZ倍率、XYZ移動の同時変換はかなり有効です。Z軸回転、Y軸回転、X軸回転のみが必要でXYZ倍率、XYZ移動が不要の場合は行列の次数は3で済むことになりますが、XYZ倍率、XYZ移動が必要となることもあるでしょう。
     XYZ倍率、XYZ移動も含めた同時変換が現在の主流です。


  9. 座標同時変換.xls(フリーソフト)のダウンロード
    1. ダウンロード
       下記の座標同時変換.xls(フリーソフト)]をダウンロードしてください。

       ダウンロード後はダブルクリックで解凍してから使用してください。
       
      座標同時変換.xls(フリーソフト)]をダウンロードする。


    2. 座標同時変換.xls(フリーソフト)
    3. ファイル構成
      (1) 座標同時変換.xls :フリーソフトです。
      (2)シート「Sheet1」:計算条件の設定を行います。
      (3)シート「Sheet2」:斜視図の出力を行います。

    4. 注意事項
      (1)ファイルの保存場所の制限はありません。

    5. 標準的な実行方法
      (1)「座標同時変換.xls」をダブルクリックで起動します。
         (マクロを有効にして開いてください!!)
      (2)ライン数、オフセットX、オフセットY、オフセットZ、倍率X、倍率Y、倍率Z、Z軸回転、Y軸回転、X軸回転を設定します。
      (3)変換前のラインの始点と終点座標を設定します。
      (4)「計算実行」ボタンを押します。
      (5)斜視図で有効なのはZ軸回転、Y軸回転のみです。
      (6)変換順序はZ軸回転、Y軸回転、X軸回転、XYZ倍率、XYZ移動の順です。
      ・斜視図は倍率とオフセットが自動調整されて表示されます。


  10. プログラムリスト
     VBAのプログラムリストは以下のようになります。
    'N=行列式の次数
    'A(N,N)=固有値を求める行列
    'B(N,N)=相似変換行列
    'BINV(N,N)=相似変換の逆行列
    'C(N,N)=相似変換後の行列
    Dim U1(5, 201), U2(5, 201), V1(5, 201), V2(5, 201), Hx(5, 5), Hy(5, 5), Hz(5, 5), Ht(5, 5), Hm(5, 5)
    Dim Hzy(5, 5), Hzyx(5, 5), Hzyxm(5, 5), Hzyxmt(5, 5)
    Dim N, Ox, Oy, Oz, Mx, My, Mz, Rz, Ry, Rx, Rad

    Sub Main()
    Rad = 3.141592654 / 180
    N = Sheets("Sheet1").Cells(4, 3).Value
    Ox = Sheets("Sheet1").Cells(5, 3).Value
    Oy = Sheets("Sheet1").Cells(6, 3).Value
    Oz = Sheets("Sheet1").Cells(7, 3).Value
    Mx = Sheets("Sheet1").Cells(8, 3).Value
    My = Sheets("Sheet1").Cells(9, 3).Value
    Mz = Sheets("Sheet1").Cells(10, 3).Value
    Rz = Sheets("Sheet1").Cells(11, 3).Value
    Ry = Sheets("Sheet1").Cells(12, 3).Value
    Rx = Sheets("Sheet1").Cells(13, 3).Value

    SetMat

    For i = 1 To N
    U1(1, i) = Sheets("Sheet1").Cells(17 + i, 2).Value
    U1(2, i) = Sheets("Sheet1").Cells(17 + i, 3).Value
    U1(3, i) = Sheets("Sheet1").Cells(17 + i, 4).Value
    U1(4, i) = 1
    U2(1, i) = Sheets("Sheet1").Cells(17 + i, 5).Value
    U2(2, i) = Sheets("Sheet1").Cells(17 + i, 6).Value
    U2(3, i) = Sheets("Sheet1").Cells(17 + i, 7).Value
    U2(4, i) = 1
    Next i
    ExeMat
    For i = 1 To N
    Sheets("Sheet1").Cells(17 + i, 8).Value = V1(1, i)
    Sheets("Sheet1").Cells(17 + i, 9).Value = V1(2, i)
    Sheets("Sheet1").Cells(17 + i, 10).Value = V1(3, i)
    Sheets("Sheet1").Cells(17 + i, 11).Value = V2(1, i)
    Sheets("Sheet1").Cells(17 + i, 12).Value = V2(2, i)
    Sheets("Sheet1").Cells(17 + i, 13).Value = V2(3, i)
    Next i
    Draw


    End Sub
    Sub SetMat()
    For i = 1 To 4
    For j = 0 To 4
    Hx(i, j) = 0: Hy(i, j) = 0
    Hz(i, j) = 0: Ht(i, j) = 0: Hm(i, j) = 0
    Next j
    Hx(i, i) = 1: Hy(i, i) = 1
    Hz(i, i) = 1: Ht(i, i) = 1: Hm(i, i) = 1
    Next i
    Hx(2, 2) = Cos(Rx * Rad): Hx(2, 3) = -Sin(Rx * Rad)
    Hx(3, 2) = Sin(Rx * Rad): Hx(3, 3) = Cos(Rx * Rad)
    Hy(1, 1) = Cos(Ry * Rad): Hy(1, 3) = Sin(Ry * Rad)
    Hy(3, 1) = -Sin(Ry * Rad): Hy(3, 3) = Cos(Ry * Rad)
    Hz(1, 1) = Cos(Rz * Rad): Hz(1, 2) = -Sin(Rz * Rad)
    Hz(2, 1) = Sin(Rz * Rad): Hz(2, 2) = Cos(Rz * Rad)
    Ht(1, 4) = Ox: Ht(2, 4) = Oy: Ht(3, 4) = Oz
    Hm(1, 1) = Mx: Hm(2, 2) = My: Hm(3, 3) = Mz
    For k = 1 To 4
    For i = 1 To 4
    Hzy(i, k) = 0
    For j = 0 To 4
    Hzy(i, k) = Hzy(i, k) + Hy(i, j) * Hz(j, k)
    Next j
    Next i
    Next k
    For k = 1 To 4
    For i = 1 To 4
    Hzyx(i, k) = 0
    For j = 0 To 4
    Hzyx(i, k) = Hzyx(i, k) + Hx(i, j) * Hzy(j, k)
    Next j
    Next i
    Next k
    For k = 1 To 4
    For i = 1 To 4
    Hzyxm(i, k) = 0
    For j = 0 To 4
    Hzyxm(i, k) = Hzyxm(i, k) + Hm(i, j) * Hzyx(j, k)
    Next j
    Next i
    Next k
    For k = 1 To 4
    For i = 1 To 4
    Hzyxmt(i, k) = 0
    For j = 0 To 4
    Hzyxmt(i, k) = Hzyxmt(i, k) + Ht(i, j) * Hzyxm(j, k)
    Next j
    Next i
    Next k
    End Sub
    Sub ExeMat()
    For k = 1 To N
    For i = 1 To 4
    V1(i, k) = 0
    V2(i, k) = 0
    For j = 0 To 4
    V1(i, k) = V1(i, k) + Hzyxmt(i, j) * U1(j, k)
    V2(i, k) = V2(i, k) + Hzyxmt(i, j) * U2(j, k)
    Next j
    Next i
    Next k
    End Sub

    Sub Draw()
    Sheets("Sheet2").Select
    Application.DisplayAlerts = False
    ActiveWindow.SelectedSheets.Delete
    Application.DisplayAlerts = True
    Sheets.Add
    ActiveSheet.Name = "Sheet2"
    Sheets("Sheet2").Select
    ActiveWindow.DisplayGridlines = False



    Zmax = 0: Zmin = 10000
    Ymax = 0: Ymin = 10000
    For k = 1 To N
    If V1(2, k) > Ymax Then Ymax = V1(2, k)
    If V2(2, k) > Ymax Then Ymax = V2(2, k)
    If V1(3, k) > Zmax Then Zmax = V1(3, k)
    If V2(3, k) > Zmax Then Zmax = V2(3, k)
    If V1(2, k) < Ymin Then Ymin = V1(2, k)
    If V2(2, k) < Ymin Then Ymin = V2(2, k)
    If V1(3, k) < Zmin Then Zmin = V1(3, k)
    If V2(3, k) < Zmin Then Zmin = V2(3, k)
    Next k
    DY = Ymax - Ymin
    DZ = Zmax - Zmin
    If DY > DZ Then
    mag = 500 / DY
    Else
    mag = 500 / DZ
    End If

    For k = 1 To N
    Y1 = (V1(2, k) - Ymin) * mag + 10
    Y2 = (V2(2, k) - Ymin) * mag + 10
    Z1 = (Zmax - V1(3, k)) * mag + 10
    Z2 = (Zmax - V2(3, k)) * mag + 10
    Sheets("Sheet2").Shapes.AddLine(Y1, Z1, Y2, Z2).Select
    Next k
    End Sub

      本プログラムは、アングルやトラスの斜視図作成にとても有効です。



21章:軸対称円筒座標の偏微分方程式(ラプラスの方程式)に行く。



トップページに戻る。