画像を極座標表示画像に変換したいのですが、サンプルプログラムがあれば見たいのでよろしくお願いします。コメントもあると助かります。あと質問なのですが、よく極座標に変換するときはp=sqrt(x”+y”)を使わずに逆変換式x=rcos0、y=sin0を使う理由はなんででしょうか?
> よく極座標に変換するときはp=sqrt(x”+y”)を使わずに逆変換式x=rcos0、y=sin0を使う理由はなんででしょうか?
簡単に言えば、隙間ができるからです。
例えば、円を半径1ずつ増やして書いてみればわかります。
デカルト座標を整数でのみ扱っているPCは、極座標など他の座標系は扱いにくいのです。
# 実数で扱えば、隙間なく書けますが、無駄(描画も計算も)が多くなります
なるほど。にしのさんありがとうございます。でも実際どうやってプログラムを書けばよいのかわからないのです。
細かいところをチェックしていませんが、こんな感じでしょう。
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;
にしのさん。ありがとうございます。これはC言語ですか?
ここが何の掲示板かわかっていて質問しています?
Halbow です。
> 細かいところをチェックしていませんが、こんな感じでしょう。
コピペして実行してみました。これはおもしろい効果ですね。
Google で検索すると GIMP というソフトがこの効果を使っていますね。
どんな論理なんだろう、と思っていました。ありがとうございます。
ツイート | ![]() |