四角形を描き、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辺のデータを同じ風に書くです。
No.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("等しくありません");
}
No.2
- 回答日時:
#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回分けるのがダメなのかなぁ。迷惑なのは分かってますが、本当に行き詰まってしまって困ってます。どうかよろしくお願いいたします。
No.1
- 回答日時:
考え方だけ書く。
<<まず前置き>>
四角形の「一周」を細かな小片に分ける。
たとえば、x軸方向の辺は各々 2分割、y軸方向の辺は各々 3分割するとすれば、
「一周」は
(2+3)×2=10
の小片に分けられる。
同様に一周を分割された四角形が N個 あるとすると、
小片の総数 allFrags は
allFrags = 10*N
となる。
<<前置きおわり>>
まず、すべての小片のデータ(※リストや配列)を作成する。
しかし、ここで作成されたデータの各要素は、互いに重複するものがあるかもしれない。
(※たとえば異なる2つの四角形の辺が重なっていた場合)
よって、このデータをもとにして、
今度は「要素の重複を許さない」小片データを新規に作る。
もし小片の番号を取得したい場合は、
その番号として、
新しいデータのインデクス値を採用すればよい。
この回答への補足
まず、すべての小片のデータ(※リストや配列)を作成する。->
ここまではdata[o][p]を書き出す事によって可能なんですが、
このデータをもとにして、
今度は「要素の重複を許さない」小片データを新規に作る。->
この文をもう少し詳しく書いていただけるとありがたいのですが・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Excel2010のinputboxで複数デー...
-
配列のペースト出力結果の書式...
-
vba フィルター 複数条件 3つ以...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
エクセルVBAからNotesでメー...
-
配列の中から最大値だけ取り出...
-
配列の中の最大値とそのインデ...
-
VBScriptでCSVファイルを読み出...
-
VB6でやると構造体の配列になる...
-
RPG 配列宣言について
-
EXCELを使って、アクセスログを...
-
VB.NETでファイルを後ろから読...
-
レコードセットの中身を配列に...
-
Excelマクロ:配列データからグ...
-
VB6で、一次元配列と二次元配列...
-
Excelのメモリ(配列)の上限は2G...
-
VB.NETの配列にExcelから読み込...
-
エクセル(VBA)の空白配列の削除...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
配列の中の最大値とそのインデ...
-
Excel2010のinputboxで複数デー...
-
Dir関数で読み取り順を操作でき...
-
大量の変数を定義するにはどう...
-
Redim とEraseの違いは?
-
VB6のメモリ解放に関して
-
CheckBoxの配列化
-
COBOLの基本的な事なので...
-
コンボボックスのインデックス...
-
構造体配列内の文字列検索のよ...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
Excelのメモリ(配列)の上限は2G...
-
Segmentation Fault (メモリ制限?)
-
VBAでMODE関数をつくる
おすすめ情報