![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
プログラム初心者です。
VB.netでの質問です。
例えば,100個のボール(の絵をしたPictureBox)を
たくさん配置して適当な規則で動かせます。
(ここまではできます)
次にいずれかの2つ(少なくとも2つ)のボールが
衝突した(距離がある値より小さくなった)ときに,互いに跳ね返る様にしたいとき,
どのようなコードを書けばよいのでしょうか?
例えば配列を使って,
0.1秒に一回(timerつかって)
for i=1 to 100
for j=1 to 100-i
if (i)番目のボールが(i+j)番目のボールと衝突
している then
跳ね返る
end if
next
next
なんてことやったら無駄が多すぎますよね?
なんか全てのボールに同一の名前をつけて,
1つの判定で全判定したことにするようには
できないでしょうか?
無理でしたら,せめてもう少し無駄のない方法
を教えてください。お願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>無理でしたら,せめてもう少し無駄のない方法
>を教えてください。お願いします。
四角形として当たり判定をしたあと、当たっていれば、円として判定しそれでも当たっていれば"当たっている"と判定する方法くらいしか思いつかないですね。
また、
>例えば,100個のボール(の絵をしたPictureBox)を
>たくさん配置して適当な規則で動かせます。
PictureBoxに1つ1つのキャラクタを割り当てるのは効率が悪すぎます。(メモリーをとても消費します)
PictureBox1つにGraphicsクラスで描画する方法が現実的です。
それに、PictureBoxは長方形なので、円形のキャラクタは透過処理ができないために不便です。なので、Graphicsクラスで描画する方法をお勧めします。
蛇足ですが、キャラクタの削除などを行う場合はIndexの最大値から0へForを回す必要があります。こうしないとForのカウンタ変数が配列の最大Index数を超えてしまうがあるからです。
たとえばこのようにします。
For i As Integer = 99 to 0
For j As Integer = i to 0
End For
End For
これは配列のLength(要素数)が100であると仮定した時のものです。
ご参考までに。
No.3
- 回答日時:
>「オーバーフローしてしまいました。
」と出るんですけど,何か別の問題があるんでしょうか?
これに関しては、エラーが発生している処理を見ないとなんとも言えませんねぇ。
No.2
- 回答日時:
>また,一般的によく使われている
>「無駄の切り詰め方」というのがありましたら,
>方針だけで結構ですのでお教え頂けませんでしょうか?
一般的には、不要な組み合わせや、ありえない組み合わせのチェックをしないですね。
あとは、コストがかかる演算を避ける。
不要な組み合わせという例では、iとjを比較して、jとiを比較するとか。
ありえない組み合わせという例では、iとiを比較とか。
コストがかかる演算を避けるという例ですと、遠く離れた円は接しているかの判定をしない
という感じですかね?
No.1
- 回答日時:
>なんてことやったら無駄が多すぎますよね?
必要な判定でしたらしょうがないですね。
>なんか全てのボールに同一の名前をつけて,
>1つの判定で全判定したことにするようには
>できないでしょうか?
結局ループで全ての組み合わせを判定することになるので
意味ないかなぁ?
>無理でしたら,せめてもう少し無駄のない方法
を教えてください。お願いします。
基本的に、書かれたコードは問題ないと思います。
必要な処理でしょう。
ただし、
「(i)番目のボールが(i+j)番目のボールと衝突
している」の判定を以下に効率よく行うかですね。
2つの円の中心と中心の距離が、2つの円の半径の和に等しいというのが判定方法になるかと思いますが、こんな大変な計算を全ての円どうしでやる必要はないですよね。
x軸やy軸方向に、2つの円の半径の和を超えて離れた円同士なら絶対に接しないですよね。
というところで無駄を切り詰めていくしかないかと。
この回答への補足
回答ありがとうございます。
やっぱりこういう方法しかないんでしょうか。。
このやりかたですと,ボールの数が40個程度で
「オーバーフローしてしまいました。」
と出るんですけど,何か別の問題があるんでしょうか?
また,一般的によく使われている
「無駄の切り詰め方」というのがありましたら,
方針だけで結構ですのでお教え頂けませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- 物理学 英語表現についてどうもわからないので教えて貰えないでしょうか? 具体的には以下の文の中でreflec 1 2023/04/29 20:59
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBA で、0から?1から?
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
エクセルの配列定数について教...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
C#でのコントロール配列について
-
配列にある重複要素を削除した...
-
遅延バインディングを使用でき...
-
C++、クラスメンバの構造体配列...
-
C言語 重複しない4ケタの乱数...
-
VB.net 引数で配列変数を渡す際...
-
五目並べのプログラムを配列と...
-
複数のテキストボックスに同じ...
-
C# 文字列の分割
-
C++の const int* dataを置き...
-
VBでbyte配列型のインスタンス...
-
キーボードの配列の意味は?
-
マルチスレッドの疑問点と配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
IF関数でEmpty値を設定する方法。
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
動的配列が存在(要素が有る)か...
-
変数を動的に作るには?
-
C言語 重複しない4ケタの乱数...
-
VBで作った乱数を一度も重複さ...
-
VB.net 引数で配列変数を渡す際...
-
配列の要素数を超えた参照のコ...
-
C#の質問
-
複数のテキストボックスに同じ...
-
VBでbyte配列型のインスタンス...
-
For文と配列
-
遅延バインディングを使用でき...
-
【MFC】GetCount()とGetSize()...
-
配列プロパティをREDIMする方法...
-
Excel VBAで配列の途中から(X)M...
-
五目並べのプログラムを配列と...
おすすめ情報