• ベストアンサー

Cで回転プログラムの高速化を

maku_xの回答

  • maku_x
  • ベストアンサー率44% (164/371)
回答No.2

1辺が a(画素)の画像を θ だけ回転する場合、回転後の画像の1辺の長さ l(画素)は、 l = a * (cosθ + sinθ) となります。0≦θ≦π/2(90°) のとき、θ=π/4 (45°)のときに l は最大値を取り、a = 300 のとき l = 426.264... ≒ 427 です。 なので、temp[300][300] は、 temp[427][427] と、十分な大きさの配列にしなければなりません。 また、 > temp[i][j] = Gengazo[r][kaitenx[r][j]][kaiteny[r][i]] は、 temp[kaitenx[r][j]][kaiteny[r][i]] = Gengazo[r][j][i]; ではないでしょうか。 # 但し、画像データのように (x,y)座標を多次元配列で表現する場合は、常識的には ImageData[y][x] の様に、x座標が配列の添え字の右側に来るように書きます。 なお、他の画像の回転方法を知りたければ、netpbm (Linux 等の UNIX系OS で画像処理を行なうプログラム群) の中の pnmrotate を参照してください。(参考URLからダウンロードできる圧縮ファイルの中に、editor/pnmrotate.c と言うソースコードがある。) # でも、同じような処理をしてるっぽい。

参考URL:
http://netpbm.sourceforge.net/
pen123
質問者

お礼

回答ありがとうございます!! 回転後の画像は、切れていて問題ないので、配列は300*300にしました。 また、ご指摘の temp[kaitenx[r][j]][kaiteny[r][i]] = Gengazo[r][j][i]; は、その通りでした!書き間違えてました! 1つ聞きたいのは、このような書き方で正しく動くのでしょうか? 配列の添え字のところに、配列を書くなんて、書けたら便利ですけど ちゃんと動くかどうか不安で・・・ (データを[y][x]であらわすのは知ってました。ありがとうございます) temp[kaitenx[r][j]][kaiteny[r][i]] = Gengazo[r][j][i]; この書き方が出来るのかどうかが知りたいので 回答お願いします!!

関連するQ&A

  • C言語課題!C言語初心者です。お願いします。

    課題内容 要素数10の(0~9の順)配列Aの値を2倍して配列Bに格納して  その後配列Aの値を配列Bに、配列Bの逆順を配列Aに格納し  入れ替える前と入れ替えた後の配列A,Bの値を表示するプログラム 書いてみたプログラム #include <stdio.h> int main(void) { int i; int va[10] = {0,1,2,3,4,5,6,7,8,9}; /* 初期化 */ int vb[10]; puts("入れ替え前"); puts("-----------"); for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i , va[i]); /* 入れ替え前の配列A */ } for(i=0 , i<10 , i++){ vb[10] = 2*va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え前の配列B */ } puts("入れ替え後"); puts("-----------"); for(i=0 , i<10 , i++){ vb[10] = va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え後の配列B */ } for(i = 0 , i < 5 , i++){ /* 配列Bの逆順を配列Aに格納 */ int temp = va[i]; va[i] = vb[4-i]; vb[4-i] = temp; } for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i ,va[i]); /* 入れ替え後の配列A */ } return(0); } コンパイルできません。 教えてください。お願いします。

  • C言語のソートプログラム

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",&n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<n;i++){ printf("a[%d]",i); scanf("%d",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[%2d]=%d\n",i,a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これを実行すると 最初に入力した配列の順番のまま表示されてしまいます。 例えば n=4 a[0]7 a[1]4 a[2]6 a[3]1 a[i]のソート結果 a[0]7 a[1]4 a[2]6 a[3]1 のようにです。 しかしプログラミング上では for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]       temp=a[i];       a[i]=a[j];            a[j]=temp;        }        }        } のようにiとjを比較して a[0]がa[1]より大きければa[0]とa[1]を交換する。 あとはa[0]とa[2], a[0]とa[3]...a[3]とa[4]まで for文の続く限り繰り返すように書いたはずです。 まだ勉強し始めた私にはどこが間違っているのか分からないので 分かる方はご指摘をお願いします。

  • C# 配列の配列(多次元配列?)

    C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定  テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する   A=1,2,3・・・   B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) {  string strBuffer;  //「=」前の値格納用変数  string[] strBuffer2; //「=」後の値格納用配列  listtmp=null;  //strtmpに「=」前の値を格納  strtmp = TextLine.Split('=').GetValue(0).ToString();  //strtmp2に「=」後の値を格納(配列)  strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(',');  for (int i = 0; i <= strtmp2.Length - 1; i ++)  {   //[i,0]に、「=」前の値を代入   if (i == 0)   {   listtmp.Add(strtmp);   }   else   {   listtmp.Add(strtmp2[i].ToString());   }  }  //list配列にlistTmp配列を格納(配列の配列)  list.Add(listtmp);  intT = intT + strtmp2.Length;  //行数カウント  intTLine = intTLine + 1;  } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。

  • C言語 csv 配列

    CSVファイルを2次元配列に格納したいのですが、書き方がわかりません。 csvファイルは1024×2048の0と1のみで構成されています。 fp=fopen(path,"r"); for(j=0; j<1024; j++) { for(i=0; i<2048; i++) { char c; do{c=(getc(fp));} while(c==','||c=='\n'||c=='\r'); map[j][i] = c-'0'; } } このように書きできたと思ったのですが、どうもうまくいっていないみたいです。 どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。

  • c 画像の一致を調べる

    ppmの画像2つがあり、画像2は画像1のどこか一部分を切り取った画像です。 HEIGHT 画像1の縦 WIDTH 画像1の横 HEIGHT_R 画像2の縦 WIDTH_R 画像2の横 とします。 image[i][j].g 画像1 image_re[i][j].g 画像2 には各位置での緑の色情報を格納しているとします。このときに比較の方法は次のようにしてみました。画像1の左上の座標を(0,0)として横に調べていき、一致したところ(1)でそこからWIDTH_Rだけの幅の範囲で各マスが合っているか比較し、合っていれば次の下の行について同じことをして。。。 それでもし一致しないところが出てきたら、(1)のもう一つ横マスについておなじことをやって。。。 と繰り返していく方法です for(i=0; i<HEIGHT; i++) for(j=0; j<WIDTH; j++) for(m=i; m<i+HEIGHT_R; m++){ if(a=0){a=1;break;} if(image[j][m].g == image_re[j][m].g) for(k=j; k<j+WIDTH_R; k++) if(image[k][m].g==image_re[k][m].g)a=1; else {a=0; break;} else break; if(m==i+HEIGHT_R)printf("TRUE"); としてみたのですが どうもsegmentation fault と出てしまいます。 まちがってるところがあればご指摘下さい

  • C言語について

    C言語初心者です。 今、プログラミングをしていてわからない箇所があるので質問させていただきます。 自作の関数へ配列を送る際、多重配列の途中の配列の値を関数に送りたい場合どのようにすれば よいのでしょうか? 文ではわかりづらいと思うので、例を書きます。↓ /* 関数 */ int sum(int data[],int N){ int i,temp=0; for(i=0;i<N;i++){ temp=temp+data[i]; } return(temp); } /* 本文 */ int output; int a[10][20][30]={適当な数字が入ってるとします。} // この時、配列の左と右に値を指定して、真ん中の配列を関数に送りたいです。 output=sum(???,20); //ちなみに現在はもう一つ1次元配列を作り、そこに一旦コピーしてから関数に送っています。 //なにか良い方法があればご教授ください。

  • C/C++の配列について

    配列の作り方について nは特定の数でarr[3]以降の値をfor文で代入したいのですが 同じfor文で値を代入すると(1)は不正解で(2)が正解になります 小さい数だと見た目は同じで何が違うのか解らないのですが、これは何がちがうのでしょうか? (1)の0, 0, 1以降は全て初期値として0が入ると認識してたのですがそれも違いますか? (1) int arr[n]={0, 0, 1}; (2) int arr[n]; arr[0]=0; arr[1]=0; arr[2]=1; for (int i=3; i<n; i++) { arr[i]=略 } よろしくお願いします

  • Javaのプログラムをルビー言語に。

    10~50までの素数が格納されている配列を rubyで作りたいのですが、どのようにすればいいいのかよくわかりません。 下のプログラムにも間違いがあるかもしれませんので もしありましたご指摘お願い致します。 for i=start i<=end i++; //iは割られる数 for(j=1;j<=i;j++){ //jは割る数 if(i%j==0){ count++; } } if(count==2){ System.out.println(i); } iをjで割っていき、余りが0になったらカウントを増やしていくプログラムです。 素数は1とその数字でしか割れないので、カウントは2になり、 それを配列に格納したいのですが、ここではただ表示するだけに留まってしまっています。 どなたかよろしくお願い致します。

  • Javaのプログラムをルビー言語に。

    10~50までの素数が格納されている配列を rubyで作りたいのですが、どのようにすればいいいのかよくわかりません。 下のプログラムにも間違いがあるかもしれませんので もしありましたご指摘お願い致します。 for i=start i<=end i++;//iは割られる数 for(j=1;j<=i;j++){//jは割る数 if(i%j==0){ count++; } } if(count==2){ System.out.println(i); } iをjで割っていき、余りが0になったらカウントを増やしていくプログラムです。 素数は1とその数字でしか割れないので、カウントは2になり、 それを配列に格納したいのですが、ここではただ表示するだけに留まってしまっています。 まだruby初心者で分からないことだらけですので、 簡単な方法ではなく、出来ればfor文を使用したやり方で教えていただけると 幸いです。 よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • 2次元配列を使ったC言語の九九表を作りたいんですが、方法がわかりません。

    C言語で、九九の表を作っているのですが2次配列を使わないでの方法なら出来るんですが、 2次配列を使うと出来なくなってします。 下記のように途中まで組んだのですが、どうしてもエラーがでてしまいます。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]= {1,2,3,4,5,6,7,8,9},{2,4,6,8,10,12,14,16,18},{3,6,9,12,15,18,21,24,27},{4,8,12,16,20,24,28,32,36},{5,10,15,20,25,30,35,40,45,6,12,18,24,30,36,42,48,54,7,14,21,28,35,42,49,56,63},{8,16,24,32,40,48,56,64,72},{9,18,27,36,45,54,63,72,81} }; for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d",a[9][9]); printf("\n"); } return 0; } とやったのですが…以下に書く部分が間違っているようで。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]=□ } for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d", □); printf("\n"); } return 0; } 色々調べたり、少しずつ変えながら試しているのですが、できません。 どなたかわかるかたいらっしゃいますか。間違いがわかりません… 配列を使用しなくても出来ることは、わかるのですが、配列を使うバージョンでもできるようになりたいんです。 私がしようとおもっているのは、81個分の値を先に計算し、9×9の2次元配列に格納し、次に81個の配列要素の値を出力したいのですが、 間違いと方法がわかる方いらっしゃいませんか。