- ベストアンサー
C言語によるプログラミングで四角形を描く方法と重なった辺のデータ取得について
- C言語によるプログラミングで四角形を描くアルゴリズムについて考えています。四角形をX,Y方向に分割し、辺に番号をつけ、その辺のデータを取得する方法を知りたいです。
- 四角形を1つ描く場合はうまくデータが取れるようになりましたが、四角形がX,Y方向に重なった場合、重なった辺のデータを正しく取得することができません。
- 具体的には、最初の四角形をx,y共に2分割すると辺の数は全部で8個になり、上辺の番号は5,6になります。次にy方向に同じ形状の四角形を増やした際に、1,2(7,8)が6,5と重なるため、若い番号に書き換えたいですが、どのようなif構文を使用すれば良いかが分かりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>データが真逆になるので、同じと認識してくれない 認識して「くれない」!? 認識して「くれない」のではなく、 認識「させる」のだ。 --- 「線分が同一かどうかの判定処理」についてのみ書く。 とにかく、「理屈」を理解し、 その理屈にのっとってソースコードを書こう。 --- 四角形の"一周"を適当な数の"小片"に分割する。 小片とは、すなわち「線分」である。 線分とは、「始点と終点を持ったもの」にほかならない。 すなわち、小片を表現する(一意に決定する)には、 始点と終点のデータさえあればよい。 (ここ最重要ポイント) したがって、 すべての四角形の、すべての小片のデータは、 次のような「4つの配列」で表せる。 int start_x[kSize];//始点のx座標 int start_y[kSize];//始点のy座標 int end_x[kSize];//終点のx座標 int end_y[kSize];//終点のy座標 (※kSize は存在するすべての小片の数) --- じゃあ例えば、現在、xy平面上に、たった2つの線分があるとする。 1つは、始点(0, 0), 終点(1, 0) もう1つは、始点(1, 0), 終点(0, 0)。 つまり2つの線分は始点と終点が逆になっている。 (本来、この2つの線分は等しい「はず」である) では、この2つの線分を、 上記のデータ構造(「4つの配列」)に当てはめてみよう。 start_x = {0, 1} start_y = {0, 0} end_x = {1, 0} end_y = {0, 0} (kSize = 2) これで、「xy平面上に存在する線分のすべて」が表された。 ---- 次に、この2つの線分が「等しいかどうか」を調べたい。 どのような処理を書けばよいだろうか? パッと思いつくかな? 「線分として等しい」とは、どういうことだろう? --- 「線分として等しい」とは、すなわち、 「『始点同士が一致』し、かつ『終点同士が一致する』」 または 「『一方の始点と他方の終点が一致』し、 かつ『一方の終点と他方の始点が一致する』」 ことにほかならない。 (ここ重要ポイント) 具体的に書けば、 int i, sx1, sy1, ex1, ey1, sx2, sy2, ex2, ey2; //線分1のデータ sx1 = start_x[0]; sy1 = start_y[0]; ex1 = end_x[0]; ey1 = end_y[0]; //線分2のデータ sx2 = start_x[1]; sy2 = start_y[1]; ex2 = end_x[1]; ey2 = end_y[1]; if ( (sx1 == sx2) && (sy1 == sy2) && (ex1 == ex2) && (ey1 == ey2) ){ printf("等しいです"); } else if ((sx1 == ex2) && (sy1 == ey2) && (ex1 == sx2) && (ey1 == sy2)) { printf("等しいです");//向きは逆だが } else { printf("等しくありません"); }
その他の回答 (2)
- kacchann
- ベストアンサー率58% (347/594)
#1です >この文をもう少し詳しく書いていただけると 『重複を許さない配列(またはリスト)を作る』というのは、 たとえば、 次のような要素からなる配列(またはリスト)があるとする。 arr = {"りんご", "みかん", "なし", "りんご", "バナナ", "なし"} この配列は、要素が重複している。 この配列を元にして、 新たに、以下のような「重複を許さない配列」を作るということ。 newArr = {"りんご", "みかん", "なし", "バナナ"} または newArr = {"りんご", "みかん", "なし", "バナナ", "", ""} または newArr = {"りんご", "みかん", "なし", "バナナ", -1, -1}
- kacchann
- ベストアンサー率58% (347/594)
考え方だけ書く。 <<まず前置き>> 四角形の「一周」を細かな小片に分ける。 たとえば、x軸方向の辺は各々 2分割、y軸方向の辺は各々 3分割するとすれば、 「一周」は (2+3)×2=10 の小片に分けられる。 同様に一周を分割された四角形が N個 あるとすると、 小片の総数 allFrags は allFrags = 10*N となる。 <<前置きおわり>> まず、すべての小片のデータ(※リストや配列)を作成する。 しかし、ここで作成されたデータの各要素は、互いに重複するものがあるかもしれない。 (※たとえば異なる2つの四角形の辺が重なっていた場合) よって、このデータをもとにして、 今度は「要素の重複を許さない」小片データを新規に作る。 もし小片の番号を取得したい場合は、 その番号として、 新しいデータのインデクス値を採用すればよい。
補足
まず、すべての小片のデータ(※リストや配列)を作成する。-> ここまではdata[o][p]を書き出す事によって可能なんですが、 このデータをもとにして、 今度は「要素の重複を許さない」小片データを新規に作る。-> この文をもう少し詳しく書いていただけるとありがたいのですが・・・。
補足
今回の重複は、データが真逆になるので、同じと認識してくれないのです・・・。なるべく多くのソースコードを書いてみました。 float souyouso2; float su4,su5; //x,yの分割数 float bu1,bu2,bu4,bu5; //距離 su4=ups4; su5=ups5; //ups1,2は四角の数。両方1の時はうまくいくが2になると辺のデータが重なる。 bu1=wide/ups1; bu2=hight/ups2; bu4=bu1/ups4; bu5=bu2/ups5; souyouso2=ups4*2+ups5*2; //各寸法決定/////// int o,p,q,r,s,t,u,v; ss3=0; ss4=0; BeginWaitCursor(); for(q=0;q<1;q++){ r=0; domno[q][r]=ups1*ups2; domno[q][r+1]=souyouso2*ups1*ups2; so=domno[0][0]; } for(s=0;s<so;s++){ t=0; domdata[s][t]=souyouso2; domdata[s][t+1]=0; domdata[s][t+2]=0; so2=domdata[s][0]; } o=0; so4=so4+so2; p=adn; for(v=1;v<ups1+1;v++) { for(u=1;u<ups2+1;u++) { for(r=0;r<su4;r++){ p=0; s=0; data[o][p]=o+1; data[o][p+1]=ups3; data[o][p+2]=bu4*r+bu1*(v-1); data[o][p+4]=bu5*s+bu2*(u-1); data[o][p+5]=bu4*(r+1)+bu1*(v-1); data[o][p+7]=bu5*s+bu2*(u-1); o=o+1; } for(s=0;s<su5;s++){ p=0; r=su4; data[o][p]=o+1; data[o][p+1]=ups3; data[o][p+2]=bu4*r+bu1*(v-1); data[o][p+4]=bu5*s+bu2*(u-1); data[o][p+5]=bu4*r+bu1*(v-1); data[o][p+7]=bu5*(s+1)+bu2*(u-1); o=o+1; } for(r=su4-1;r>-1;r--){ p=0; s=su5; data[o][p]=o+1; data[o][p+1]=ups3; data[o][p+2]=bu4*(r+1)+bu1*(v-1); data[o][p+4]=bu5*s+bu2*(u-1); data[o][p+5]=bu4*r+bu1*(v-1); data[o][p+7]=bu5*s+bu2*(u-1); o=o+1; } for(s=su5-1;s>-1;s--){ p=0; r=0; data[o][p]=o+1; data[o][p+1]=ups3; data[o][p+2]=bu4*r+bu1*(v-1); data[o][p+4]=bu5*(s+1)+bu2*(u-1); data[o][p+5]=bu4*r+bu1*(v-1); data[o][p+7]=bu5*s+bu2*(u-1); o=o+1; } } } こんな感じです四角形を2回分けるのがダメなのかなぁ。迷惑なのは分かってますが、本当に行き詰まってしまって困ってます。どうかよろしくお願いいたします。