• 締切済み

プログラムが解読できないです。解読していただける方いませんか?

以下のプログラムなんですが、各変数の値、および配列がどのように動いているのか、理解できなくて困っています。どなたか解読していただける方いらっしゃいましたら、出来るだけ詳しくお願いします。。 { int triangle[3]={0,1,2}; int nextVertex; int i; /* 三角形の頂点の組を表示 */ printf("Triangle %d : ",1); for(i=0;i<3;i++){ printf("(%f, %f)",x[triangle[i]], y[triangle[i]]); } printf("\n"); /* 各頂点の処理 */ for(nextVertex=3;nextVertex < n; nextVertex++){ double m,k; int side1,side2; /* 傾きが極端に大きくなったときに計算誤差が発生。これが起こらないよう、傾きが1を境に処理をxとyで入れ替える*/ if(y[triangle[2]]-y[triangle[1]]<x[triangle[2]]-x[triangle[1]]){ /* 直線の傾き・切片を計算 */ m=(y[triangle[2]]-y[triangle[1]])/(x[triangle[2]]-x[triangle[1]]); k=y[triangle[2]]-m*x[triangle[2]]; /* side1,side2にはy>mx+kが成り立っていれば0以外、成り立たなければ0がそれぞれ入る */ side1=y[triangle[0]]>m*x[triangle[0]]+k; side2=y[nextVertex]>m*x[nextVertex]+k; }else{ /* xyを入れ替えただけ */ m=(x[triangle[2]]-x[triangle[1]])/(y[triangle[2]]-y[triangle[1]]); k=x[triangle[2]]-m*y[triangle[2]]; side1=x[triangle[0]]>m*y[triangle[0]]+k; side2=x[nextVertex]>m*y[nextVertex]+k; } /* 判別結果によって次の三角形の頂点を選択 */ if(side1^side2){ /* 排他的論理和を使って判別。side1/side2のいずれか一方のみが非0のとき条件成立 */ triangle[0]=triangle[1]; } /* else節はなくても一緒なので略す else{ triangle[0]=triangle[0]; } */ triangle[1]=triangle[2]; triangle[2]=nextVertex; /* 三角形の頂点の組を表示 */ printf("Triangle %d : ",nextVertex-1); for(i=0;i<3;i++){ printf("(%f, %f)",x[triangle[i]], y[triangle[i]]); } printf("\n"); } }

みんなの回答

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

変数・配列の値くらいならデバッガで追えば確認できると思いますよ。 デバッガ使えないなら原始的に随所にprintf入れる手もある。

atcrny374
質問者

お礼

ありがとうございます。試してみます。

  • precog
  • ベストアンサー率22% (966/4314)
回答No.1

どこら辺でわからなくなるんでしょうか

atcrny374
質問者

補足

特に「* 傾きが極端に大きくなったときに計算誤差が発生。これが起こらないよう、傾きが1を境に処理をxとyで入れ替える*/」からそれ以下の配列triangleの内容がわからないです。。

関連するQ&A