【レポート】TwinシートのRDSとアナグリフ

[レポート]TwinシートのRDSとアナグリフを生成。A、B、W、Mを調整し、見やすいものを作成。

TwinシートのRDSとアナグリフを生成した。A、B、W、Mを調整し、見やすいものを作成した。

まずは、失敗例を示す。

ドットがランダムに描画されていない。          

このときのA,B,W,Mの値をそれぞれ以下に示す。

A=300

B=300

W=2.5

M=10

次に成功例を示す。

点がランダムの描画されている。

このときのA,B,W,Mの値をそれぞれ以下に示す。

A=3000

B=3000

W=2.5

M=10

また、このときの高さの値は50であった。

[課題 4]

オリジナルの高さデータシートを作り,見易くかつ変化に富んだ高さ2段以上のRDSおよびアナグリフを生成した。

図5.現画像

Rの値をそれぞれ以下に示す。

中央の円:255

右上の矢印:200

右下の矢印:150

左下の矢印:100

左上の矢印:50

次にこれを使ってRDSを作成した。

まず失敗例を図6、図7に表示する。

またこのときのABWMの値をそれぞれ示す。

A=300

B=300

W=2.5

M=10

次に成功例を以下に示す。

このときのABWMの値を以下に示す。

A=3000

B=3000

W=2.5

M=6

[課題 5]

これらのRDSとアナグリフを作成したソースコードを以下に載せる。

Option Explicit

Public Nx As Long, Ny As Long

Public Const N As Long = 3000              ‘*****選択する点PPの数

Public Const S1 As Double = 200            ‘*****各画像の横幅

Public Const S2 As Double = 10             ‘*****左と右画像の間隔

Public Const zdsname As String = “ppp”   ‘*****高さデータシート名を入れる.ステレオ

Sub stereogram()

Const A As Double = 3000             ‘*****原点から紙面までの距離

Const B As Double = 3000             ‘*****紙面から節点までの距離

Const W As Double = 2.5             ‘*****節点間の距離の半分(1square=2.5,steps=2.5,squares=20,twin=20)

Const M As Double = 6              ‘*****高さ調整の係数(1square=10,steps=10,squares=20,twin=1.8)

Dim xp As Double, yp As Double, zp As Double

Dim xl As Double, yl As Double

Dim xr As Double, yr As Double

Dim row As Long, col As Long

Dim zds As Worksheet, rds As Worksheet

Dim i As Long

Call set_sheets(zds, rds)

Const Xrl As Double = 2 * A * W / (A + B)         

Nx = zds.Cells(1, 1).End(xlToRight).Column         

Ny = zds.Cells(1, 1).End(xlDown).row               

Debug.Print Nx, Ny                              

For i = 1 To N                                   

    xp = Nx * Rnd() + 1  ‘*****xpは[1,Nx+1)の実数(浮動小数点)乱数.Rnd()は[0,1)の実数.同系列乱数の発生は「実行」→「リセット」.

    yp = Ny * Rnd() + 1  ‘*****ypは[1,Ny+1)の実数乱数.

    col = Int(xp) ‘*****xpを列番号colに変換.[1,Nx]の整数.

    row = Int(yp) ‘*****ypを行番号rowに変換.[1,Ny]の整数.

    zp = zds.Cells(row, col) * M   ‘*****zpに高さデータzds.Cells(row, col)を代入.高さ調整(M倍)するとRDSが見易くなる場合がある.

    xp = xp – (1 + Nx / 2)   ‘*****xpは[-Nx/2,Nx/2)の実数.高さデータシートの中心(1+Nx/2,1+Ny/2)を原点とした3D空間における点PPのX座標値.

    yp = yp – (1 + Ny / 2)  ‘*****ypは[-Ny/2,Ny/2)の実数.高さデータシートの中心(1+Nx/2,1+Ny/2)を原点とした3D空間における点PPのY座標値.

    yp = -yp  ‘*****散布図での上下反転を避けるためにypの符号を反転する.

    xl = (-A * W + B * xp + W * zp) / (A + B – zp)  ‘*****xlの計算.課題1

    yl = B * yp / (A + B – zp)   ‘*****ylの計算.課題1

    xr = (A * W + B * xp – W * zp) / (A + B – zp)   ‘*****xrの計算.課題2

    yr = yl  ‘*****yrの計算.課題2

     xp = Nx * Rnd() + 1

    yp = Ny * Rnd() + 1

    col = Int(xp)

    row = Int(yp)

    zp = zds.Cells(row, col) * M

    xp = xp – (1 + Nx / 2)

    yp = yp – (1 + Ny / 2)

    yp = -yp

    xl = (-A * W + B * xp + W * zp) / (A + B – zp)

    yl = B * yp / (A + B – zp)

    xr = (A * W + B * xp – W * zp) / (A + B – zp)

    yr = yl

    rds.Cells(i, 1) = xp                            ‘i番目に生成した点PPのX座標値xpをRDS用シートの第i行第1列に書き込む.

    rds.Cells(i, 2) = yp                            ‘i番目に生成した点PPのY座標値ypをRDS用シートの第i行第2列に書き込む.

    rds.Cells(i, 3) = zp                            ‘i番目に生成した点PPのZ座標値zpをRDS用シートの第i行第3列に書き込む.

    rds.Cells(i, 4) = xl                            ‘i番目に生成した点PPの左眼用画像におけるX座標値xlをRDS用シートの第i行第4列に書き込む.

    rds.Cells(i, 5) = yl                            ‘i番目に生成した点PPの左眼用画像におけるY座標値ylをRDS用シートの第i行第5列に書き込む.

    rds.Cells(i, 6) = xr                            ‘i番目に生成した点PPの右眼用画像におけるX座標値xrをRDS用シートの第i行第6列に書き込む.

    rds.Cells(i, 7) = yr                            ‘i番目に生成した点PPの右眼用画像におけるY座標値yrをRDS用シートの第i行第7列に書き込む.

    rds.Cells(i, 8) = xr – Xrl                      ‘anaglyph作成用.i番目に生成した点PPの右眼用画像におけるX座標値xrをRDS用シートの第i行第8列に書き込む.

    rds.Cells(i, 9) = yr                            ‘anaglyph作成用.i番目に生成した点PPの右眼用画像におけるY座標値yrをRDS用シートの第i行第9列に書き込む.

Next i

Call generate_rds(rds)

Call generate_anaglyph

End Sub

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です