• 締切済み

C言語の質問です。

C言語の質問です。 以前質問した、C言語初心者のものです。 以前回答してくださった方、ありがとうございました! 前回の質問とかぶるんですが、質問は、 正方形の画像を円形にひきのばす(歪ませる)というプログラムがなかなか書けません。 どなたか教えてください! 円形にひきのばしたときに、正方形のどの座標がどにに移動してるのかってのを考えてつくりたいのですが。 画像を添付しました。 この画像の意味は、たとえば、正方形の中にある緑の四角(座標)が円のほうの緑の四角(座標)に移動したと考えたときに、添付画像に書いてある公式をつかって処理していくってことなんですが・・・。 それを同じようにすべての座標で処理していって円形に歪ませた画像をつくりあげたいんです。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ここまで出来てて、あとはどこがわからないのですか? この図で、あと必要な数値は ・中心(x0,y0)からl2だけ離れた点の座標 x = x0 + l2 * cos θ y = y0 + l2 * sin θ 一般に、画像データは格子状の画素を並べたもので、座標は整数値になるので、上の計算で出た値の周辺から補完することになりますが、その方法にニアレストネイバーを使うと方針が決っているなら、それを使えばいいです。 ・円に外接する正方形の内部 x0-R≦xi≦x0+R y0-R≦yi≦y0+R この範囲の全座標について、 l1*l1 = xi*xi + yi*yi≦ R*R なら円の中なので、対応する内接正方形内の座標(x,y)を今までの式を使って求めます。 C言語として注意する点は ・三角関数は#include <math.h>で使えるようになります。 ・atanではなくatan2を使うと、x,yの正負の組み合わせで-π~+πの範囲で答えが出るので、場合分けを考えずに済みます。 atanを使うなら、x,yの組合せで上下左右どちらなのかの判定が必要な上、0で割る場合を分ける必要もあります。 ・数学上は必ず内接正方形の中になりますが、計算機上では計算誤差の関係で、正方形の外になる可能性があります。最終的な座標の確認を忘れずに。 ・プログラムはdoubleとintが混じるになります。計算時の型に注意しましょう。 ・入力画像にそのまま上書きしようとすると、すでに変形されている座標を入力として使ってしまう可能性があります。別の画像に出力するか、内接正方形の部分を配列等に退避させるかしましょう。

taiga1217
質問者

お礼

わかりやすく書いて頂き、ありがとうございました!! こんなにヒントを頂いた上、ずうずうしいお願いなんですが、時間に余裕があれば、この、模範プログラムを書いて頂けないでしょうか? 初心者ですみません。 画像の入出力の部分は大丈夫なんですが。 kmeeさんが時間に余裕があればで平気です。 平気であれば、よろしくお願いします!

関連するQ&A