3

私が達成したいのは、rglで3Dグラフを表示し、表示したいビューに回転させてからファイルに保存することです。rgl.snapshot私は次のような関数でこれを行うことができることを知っています:

library(rgl)

x <- runif(20)
y <- runif(20)
z <- runif(20)
plot3d(x, y, z)
rgl.snapshot("rgl.snapshot.png")

問題は、rgl.snapshot画面解像度でファイルを生成するため、印刷に十分な解像度ではないことです。ファイルが保存される解像度に影響を与える方法はありません。一般に、ファイルをpdfやsvgなどのベクター形式で保存できればさらに良いでしょう。

scatter3D私のアイデアは、現在のビューの回転を保存し、それをplot3Dパッケージのような非インタラクティブな 3D 散布図を生成する別の関数で使用することでした。回転行列を保存するために、次のことを行いました。

rotationMatrix <- rgl.projection()

次のようにすることもできます。

rotationMatrix <- par3d()$modelMatrix

回転行列は次のようになります。

$model
          [,1]       [,2]      [,3]       [,4]
[1,] 0.9584099  0.0000000 0.0000000 -0.4726846
[2,] 0.0000000  0.3436644 0.9792327 -0.6819317
[3,] 0.0000000 -0.9442102 0.3564116 -3.6946754
[4,] 0.0000000  0.0000000 0.0000000  1.0000000

$proj
         [,1]     [,2]      [,3]      [,4]
[1,] 3.732051 0.000000  0.000000   0.00000
[2,] 0.000000 3.732051  0.000000   0.00000
[3,] 0.000000 0.000000 -3.863703 -14.36357
[4,] 0.000000 0.000000 -1.000000   0.00000

$view
     x      y  width height 
     0      0    256    256 

ここで私の質問は、この回転行列から引数を取得しphi、関数thetaで使用される引数を取得する方法です。scatter3D

library(plot3D)

# phi = ?
# theta = ?
pdf("scatter3D.pdf")
scatter3D(x, y, z, pch=20, phi = 20, theta =30, col="black")
dev.off()

回転行列から回転角度を抽出する数学があることは知っています。私の場合、それを適用する方法が本当にわかりません。特に、行列には​​ 4 つの行と列があるためです。私はそれぞれ3つを期待します...次の問題は、scatter3D2つの回転軸のみを使用することです(シータは方位角を表し、ファイは緯度を表します)。 -軸回転。ファイの回転軸は、シータの回転によって定義されると思います。

rgl スナップショットをロスレス形式で保存する別の方法があれば、ぜひ教えてください。

4

1 に答える 1

4

最新 (R-forge のみ。取得方法については、rgl の最新バージョンをインストールするにはどうすればよいですか?を参照してください) バージョンの rgl には、必要な phi 値と theta 値を返す関数 rglToBase() があります。4 月 24 日のコメントで述べたように、ロスレス形式で保存する rgl.postscript() もあります (ただし、すべてを保存することはできません)。

追加するために編集: 非常に新しい追加はwriteASY()関数です。これは Asymptote ソース コードを書き出して、主に LaTeX ドキュメントを対象としたさまざまな形式で画像を描画します。http://asymptote.sourceforge.netを参照してください。これはまだ少し制限されています (サブシーンがサポートされていない、表面照明が完全ではないなど) が、そこまで来ています。提案を歓迎します。

于 2016-05-05T18:41:25.593 に答える