• ベストアンサー

正三角点の描画について

正三角点(物理でいう三角格子)の描画について Forを使って座標を計算して点を横に平行移動させて実行したが、 見た目は三角格子点なのですが、少しの誤差がどうもあります。(FFTした結果) 精度よく三角格子点を書くには どのような考え方で 描画をすればよろしいですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nta
  • ベストアンサー率78% (1525/1942)
回答No.3

 Twipsは1440分の1インチですから、ミリよりも画面ピクセルよりも精度が高くなります。横方向600DPIのプリンタデバイスに書き込むならば256点をどのように割り当てればいいのか考えて下さい。画面ではピクセルになりますが、これはリンクに書かれているように96DPIであったり120DPIであったりします。  繰り返しの質問になりますが、256点は画面に描画するのかプリンタ出力するのか。それをどのように取り出して2次元のFFTのリーダで読み込ませるのか。というあたりで点を描画する間隔が決まるように思います。 http://www.nifty.ne.jp/forum/fdelphi/faq/00229.htm

na-asuka
質問者

お礼

ありがとうございます。 サイト見たのですが、よくわかりません。 もう一度勉強して出直します。 また、わからない所が出てきましたら よろしくお願いします。。。

その他の回答 (2)

  • nta
  • ベストアンサー率78% (1525/1942)
回答No.2

このプログラムではPicture Controlに描画するようになっていますが、何も指定しなければグラフィック座標の単位はTwipsになります。また、BasicではCircleメソッドに指定できる大きさは整数の範囲になります。もし実数が指定されていると小数点以下は切り捨てられます。すなわち For j = 0 To 300 Step 31.25 For i = 0 To 300 Step 15.625 Picture1.Circle (Int(0 + i), Int(3.125 + j)), 3, vbWhite Next i となってしまい、31.25,15.625が指定されていても整数値以上の精度が出ません。具体的に何ミリにするのか、Pictureに描画されたものを、最終的にどのようにしてFFTを行うのでしょうか。

na-asuka
質問者

補足

ご返信ありがとうございました。 >具体的に何ミリにするのか すいません。単位が関係あるとは知りませんでした。 何ミリかは決めておりません。 256×256の画像サイズで 横に16個ぐらい 下に8個ぐらいの (逆)正三角形がほしいです。 Twipsよりミリの方が精度いいんですね。 >最終的にどのようにしてFFTを行うのでしょうか FFTは二次元FFTであります。 256×256のサイズに 垂直方向、水平方向にFFTしていきます。 FFT図にキレイな点が表れるような (周期性が高い)三角点の作図を 目的としております。 ご指導の程よろしくお願い致します。

  • nta
  • ベストアンサー率78% (1525/1942)
回答No.1

描画するターゲットはどこですか。FFTするくらいですから数値になっているはずですが、倍精度実数で保存してあれば誤差は小さいはずですが、描画すると整数化による丸め誤差が発生します。丸め誤差を小さくするにはランダムに1ドット分を左右上下に移動させるなどして、誤差分散を行えばいいと思います。印刷された結果を精度良くするのであれば、ディスプレイを印刷するのではなく、プリンタデバイスをデバイスコンテキストとして取得してその上に描画してみてください。いずれにせよ、ドットピッチ以上の精度は得られません。

na-asuka
質問者

補足

文章の中で”丸め”って言葉をつかわれていあますけど、 ”丸め”っていうのは、円のことですか? >丸め誤差を小さくするにはランダムに1ドット分を左右上下に移動させるなどして、誤差分散を行えばいいと思います すいません。その操作はどのようにするのですか? For j = 0 To 300 Step 31.25 For i = 0 To 300 Step 15.625 Picture1.Circle (0 + i, 3.125 + j), 3, vbWhite Next i Next j 上のプログラムは、私のソースです。 お忙しいとは思いますが、よろしくお願いいたします。