画像の極座標変換について


かよ  2003-09-17 23:24:02  No: 4885

画像を極座標表示画像に変換したいのですが、サンプルプログラムがあれば見たいのでよろしくお願いします。コメントもあると助かります。あと質問なのですが、よく極座標に変換するときはp=sqrt(x”+y”)を使わずに逆変換式x=rcos0、y=sin0を使う理由はなんででしょうか?


にしの  2003-09-17 23:56:32  No: 4886

> よく極座標に変換するときはp=sqrt(x”+y”)を使わずに逆変換式x=rcos0、y=sin0を使う理由はなんででしょうか?

簡単に言えば、隙間ができるからです。
例えば、円を半径1ずつ増やして書いてみればわかります。
デカルト座標を整数でのみ扱っているPCは、極座標など他の座標系は扱いにくいのです。
# 実数で扱えば、隙間なく書けますが、無駄(描画も計算も)が多くなります


かよ  2003-09-18 00:13:04  No: 4887

なるほど。にしのさんありがとうございます。でも実際どうやってプログラムを書けばよいのかわからないのです。


にしの  2003-09-18 01:23:33  No: 4888

細かいところをチェックしていませんが、こんな感じでしょう。

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: integer;//変換先の(x,y)
  a, b: integer;//変換元の(x,y)

  dx, dy: double; // 中心を原点としたXY座標(右が+, 上が+)
  dq, dr: double; // 極座標
begin
  for y := 0 to Image2.Height - 1 do
  for x := 0 to Image2.Width - 1 do
  begin
    // 極座標変換。
    dx := x;
    dy := y;
    dx := dx - (Image2.Width div 2);
    dy := (Image2.Height div 2) - dy;

    //デカルト座標(dx,dy)から極座標(dq,dr)に変換
    dr := sqrt(dx*dx + dy*dy);

    if dx = 0 then
    begin
      if dy > 0 then
        dq := PI / 2.0
      else
        dq := PI * 3.0 / 2.0;
    end
    else
    begin
      dq := arctan(dy / dx);
    end;
    if dx < 0.0 then dq := dq + PI;
    //dqは-PI/2...PI/2の間
    dq := dq + PI/2;
    //dqが横方向
    dq := (dq * Image2.Width) / (2*PI);

      Image2.Canvas.Pixels[x, y]
        :=
      Image1.Canvas.Pixels[
        Floor(dq),
        Floor(dr)]
      ;
  end;
end;


かよ  2003-09-18 01:45:07  No: 4889

にしのさん。ありがとうございます。これはC言語ですか?


にしの  2003-09-18 02:18:44  No: 4890

ここが何の掲示板かわかっていて質問しています?


Halbow  2003-09-18 02:43:03  No: 4891

Halbow です。

> 細かいところをチェックしていませんが、こんな感じでしょう。

コピペして実行してみました。これはおもしろい効果ですね。
Google で検索すると GIMP というソフトがこの効果を使っていますね。
どんな論理なんだろう、と思っていました。ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加