• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:教えてください。A4シート内で25個のポイントを結びすべての線分が交差)

A4シート内で25個のポイントを結びすべての線分が交差しない方法をVB6で求める方法

このQ&Aのポイント
  • A4シート内で25個のポイントを結び、すべての線分が交差しない方法をVB6で求める方法について教えてください。
  • 具体的には、各ポイントの座標位置を求めるために乱数を使用し、条件に合うまで乱数を発生させる方法を検討しています。
  • また、線分の交差判定には式(1)と式(2)、式(3)と式(4)の積がいずれも0より大きい条件が必要ですが、24本の線分だと2線分のパターンが250通り以上もあり、コーディング量が膨大になるため、より効率的な解法を考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.3

こんにちは。  以下のようなロジックでどうでしょうか。  (分かりやすく変数を漢字で書いています。)   1.点数=1   2.ランダムに1点目の座標を配列に格納   3.点数=点数+1   4.ランダムに2点目の座標を配列に格納   5.点数=点数+1   6.ランダムに3点目の座標を配列に格納   7.ランダムに4点目の座標を仮定   8.  交差=1   9.n=1 to 点数-2まで、10の処理を繰り返す   10.  線分(xn,yn)-(xn+1,yn+1),線分(xn+1,yn+1)-(xn+2,yn+2)の交差判定を行なう      判定がNOなら       交差=0   11.交差=1なら     4点目の座標を配列に格納     点数=点数+1     もし点数=25なら      処理を終了する     さもなくば      処理7へ戻る         交差=0なら      処理7へ戻る   へたをすると、無限ループに陥るかもしれないので、ソースを保存してからある程度、ステップで実行してください。 では。

think666
質問者

お礼

このプログラムに挑戦始めて4日目になりますが、ノートに、これらしき事をメモってはいましたが、最後の25点目の交差判定は、22本の線分と行わねばならず、多すぎて途中であきらめていました。しかし、1本づつ判定していく以外に方法はないですよね。コーディングについては、nの値に工夫をすれば、簡略化できるのかな・・・ ありがとうございます。

その他の回答 (4)

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.5

こんにちは。  >コーディングについては、nの値に工夫をすれば、簡略化できるのかな・・・  9のループ処理で新たに定義しようとしている線分と今までに定義した線分-1本の全てとの交差判定をしています。  考慮していない点として、2線分が1直線になるケース(1,2,3、1,3,2、3,1,2等の順で1直線に並ぶ)があります。これも避ける必要があれば、判定条件を加える必要があるかもしれません。 では。

think666
質問者

お礼

9でループさせていたんですね。良く理解できていなかったようです。次に回答していただいた方の分で、気づきました。ポイントの部分に(1)(2)と数字(i)を入れて印刷しますので直線になっても判別が可能なので、考慮しないことにします。ありがとうございました。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.4

考え方としては、こんな感じですかねぇ。 ループA 始端 i=1→25  i番目のポイントの座標をランダムで設定  条件分岐X 始端 もしi>3だったら   ループB 始端    交差フラグをクリア    ループC 始端 j=1→i-3     j番目のポイントとj+1番目のポイントを結ぶ線分と、i番目のポイントとi-1番目のポイントを結ぶ線分が交差するかどうかを判定     もし交差したら交差フラグをセット    ループC 終端    交差フラグがセットならi番目のポイントの座標を設定し直して、ループB始端に戻る    交差フラグがクリアならループBを抜ける   ループB 終端  条件分岐X 終端 ループA 終端

think666
質問者

お礼

だんだん配列+ループの意味が見えてきました。ループの階層と範囲の設定の仕方で、そのポイントでの判定すべき線分の数だけループさせ、フラグによっては、上位のループで前に戻って続ければいいんですよね! 記録は配列にいれて、作成ポイントiの時の、判定線分のポイントjの値の差が、3あり、+1されて最大22個になる点に、引っかかっていたのですが、i=25の時、23回(最大(i-2)回ループし、フラグがたった時点で、ループを抜けて、1個前に戻る(若しくは最初に))ループさせればいいんですよね。判定の式はすべてiとjを変数とする配列で表せそうだし・・・ いまいち、はっきり表現できていないのは、初心者の上に、文章力がないので済みません。ありがとうございます。

  • proto
  • ベストアンサー率47% (366/775)
回答No.2

コーディングの問題なら数学カテゴリーではなく、   [技術者向] コンピューター >プログラミング >Visual Basic のカテゴリーで質問されるのが適切かと思います。 何にしてもBVでも配列変数が使えるのだから、x座標とy座標をそれぞれ配列にして、   n番目の点のx座標 = px(n)   n番目の点のy座標 = py(n) とでもすれば、px(n),py(n)のnの部分を4つのカウンタi,j,k,lで0~23まで回せば全て調べ尽くせるでしょう。

think666
質問者

お礼

始めての質問で、どのカテゴリーで質問するか迷ってしまいました。 とにかく、壁に突き当たり、何をしてよいかわからなくなっていたところでした。 配列ですね。 先ほど、配列関係の参考書を読み出したところでした。 VBも初心者で、配列の式をどう扱ってよいか、よくわからないのですが、少し頑張ってみたいと思います。 未知の世界ほど楽しいことはない!!ワクワク VB始めて2ヶ月です ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

文章の意味は全く持って不明だが「24本の線分がいずれも交差しないこと」を判定するなら普通は配列+ループ.

think666
質問者

お礼

初めての質問で、最初に回答をいただけました。短かったけど・・・・ ありがとうございました。 tacosanの的確な一言のおかげで、その後していただいた他の人の回答にすんなり入っていけました。