許せない心理テスト

四角形を描き、X,Y方向にそれぞれ分割し、分割した辺に左下から反時計回りに番号をつけ、その辺の両端のx,yデータを書き出すというアルゴリズムを考えています。
1つの四角形ならうまくデータが取れるようになったのですが、四角形がX,Y方向に重なった時に、重なった辺のデータがうまく取れません。例えば、最初の四角形をx,y共に2分割すると辺の数は全部で8個になり上辺の番号は5,6ということになります。次にy方向に同じ形状の四角形を増やした時に、1,2(7,8)は6,5と重なるので、若い番号に書き換えたい(6=7,7=5)ですが、どこに、どんなif構文なりをいれればいいのかが分かりません。コードを載せると800字を超えてしまうので、流れだけ書きます。
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++){
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;
}
この後は4辺のデータを同じ風に書くです。

A 回答 (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("等しくありません");
}
    • good
    • 0

#1です



>この文をもう少し詳しく書いていただけると

『重複を許さない配列(またはリスト)を作る』というのは、


たとえば、
次のような要素からなる配列(またはリスト)があるとする。

arr = {"りんご", "みかん", "なし", "りんご", "バナナ", "なし"}

この配列は、要素が重複している。
この配列を元にして、
新たに、以下のような「重複を許さない配列」を作るということ。

newArr = {"りんご", "みかん", "なし", "バナナ"}
または
newArr = {"りんご", "みかん", "なし", "バナナ", "", ""}
または
newArr = {"りんご", "みかん", "なし", "バナナ", -1, -1}

この回答への補足

今回の重複は、データが真逆になるので、同じと認識してくれないのです・・・。なるべく多くのソースコードを書いてみました。
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回分けるのがダメなのかなぁ。迷惑なのは分かってますが、本当に行き詰まってしまって困ってます。どうかよろしくお願いいたします。

補足日時:2004/07/06 15:27
    • good
    • 0

考え方だけ書く。



<<まず前置き>>
四角形の「一周」を細かな小片に分ける。
たとえば、x軸方向の辺は各々 2分割、y軸方向の辺は各々 3分割するとすれば、
「一周」は
(2+3)×2=10
の小片に分けられる。
同様に一周を分割された四角形が N個 あるとすると、
小片の総数 allFrags は
allFrags = 10*N
となる。
<<前置きおわり>>


まず、すべての小片のデータ(※リストや配列)を作成する。

しかし、ここで作成されたデータの各要素は、互いに重複するものがあるかもしれない。
(※たとえば異なる2つの四角形の辺が重なっていた場合)

よって、このデータをもとにして、
今度は「要素の重複を許さない」小片データを新規に作る。

もし小片の番号を取得したい場合は、
その番号として、
新しいデータのインデクス値を採用すればよい。

この回答への補足

まず、すべての小片のデータ(※リストや配列)を作成する。->
ここまではdata[o][p]を書き出す事によって可能なんですが、
このデータをもとにして、
今度は「要素の重複を許さない」小片データを新規に作る。->
この文をもう少し詳しく書いていただけるとありがたいのですが・・・。

補足日時:2004/07/04 20:12
    • good
    • 0

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


おすすめ情報