アプリ版:「スタンプのみでお礼する」機能のリリースについて

 四角形を描き、X,Y方向にそれぞれ分割し、分割した辺に左下から反時計回りに番号をつけ、その辺の両端のx,yデータを書き出すというアルゴリズムを考えています。
 1つの四角形ならうまくデータが取れるようになったのですが、四角形がX,Y方向に重なった時に、問題が発生してしまいます。
 例えば、最初の四角形をx,y共に2分割すると辺の数は全部で8個になり上辺の番号は5,6ということになります。次にy方向に同じ形状の四角形を増やした時に、1,2(7,8)は6,5と重なるので、若い番号に書き換えます(6=7,8=5)。その次は9から始まるのではなく、書き換えた事により使っていない番号、7から書き出したいのですが、どなたか詳しい方、回答の方よろしくお願いします。
_______________________
| 5 | 11 |
| | |
|6 4|12 10|
| | |
|____3_____|____ 9____|
| 3 | 9 |
| | |
|4 2|2 8|
| | |
|____1_____|____7_____|


for(p=0;p<souyouso1-1;p++){
for(n=p+1;n<souyouso1;n++){
if((data[n][x1]==data[p][x2])&&(data[n][y1]==data[p][y2])
&&(data[n][x2]==data[p][x1])&&(data[n][y2]==data[p][y1])){
data[n][0]=data[p][0];
break;
}
}
}

A 回答 (2件)

これでどうかな



//※以下、N は線分の総数
#define no 0
#define INVALID -1//無効値

int count;//通し番号(線分につける番号)
int s, t;

//各線分に割り振られている通し番号を「無効値」で初期化
for(t=0;t<N;t++){
 data[t][no] = INVALID;
}
 
count = 0;//通し番号を初期化

/*以下の2重ループにおいて、
外ループで基準線分data[t][]を決定し、
そのそれぞれに対して
内ループで副線分data[s][]を決定し、
かつ基準線分と副線分を比較する。
*/
for(t=0;t<N;t++){//←tの範囲に注意
 //基準線分の通し番号が既に決定してるなら、
 //以後の処理を行わずループ先頭に返る
 if (data[t][no] != INVALID) {
  continue;
 }
   
 //基準線分に対し、「(正しい)通し番号」を割り振る
 data[t][no] = ++count;
   
 //内側ループ(副線分処理)
 for(s=t+1;s<N;s++){
  if (data[s][no] != INVALID) {
   continue;
  }
  
  //もし基準線分と副線分が一致するなら
  //副線分に対し通し番号を割り振る
  if((data[s][x1]==data[t][x1])
      &&(data[s][y1]==data[t][y1])
      &&(data[s][x2]==data[t][x2])
      &&(data[s][y2]==data[t][y2])){
   //通し番号わりふり
   data[s][no]=count;
   //break;//←不要
  }
 }
}
    • good
    • 0

どうされたいのかよくわからないのですが, 数字がとんでもいいのでとにかく


全ての辺に数字を割り振っておき, そのあとで割り振った数字を変更するという
方針ではダメでしょうか?

この回答への補足

 早速の回答ありがとうございます。その方針で進めているのですが、変更を2回行う事になると思うんです。。。
 例えば1~10まで最初に番号を振り、2と8,3と7のデータが同じだった場合、
1.2.3.4.5.6.3.2.9.10と並ぶと思いますが、
1.2.3.4.5.6.3.2.7.8と並べたいのです。
 1回目の変更は上に書いてあるプログラムで、もし、同じデータが出てきた場合、前に使った番号(今回だと7=3,8=2)を使うように指示し、それはうまくいきました。

 次に9の所をまだ使っていない番号7に置き換えそれ以降も8.9.10と振っていきたいのですが、それがうまくいきません。今の段階では、
上記の最初の方、
1.2.3.4.5.6.3.2.9.10となってしまうのです・・・。

補足日時:2004/07/08 18:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!