前提・実現したいこと
・座標を求めれるようにすること。
・座標を求めるプログラムを考えています。
発生している問題・エラーメッセージ
・どうすれば出来るのかが分からない。
エラーメッセージ
試したこと
・
補足情報(FW/ツールのバージョンなど)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
約1万もの座標を円内に、均等に隙間が無いように配置したい。
円の中に小さな六角形を隙間なく敷き詰め(約1万個)、
それら個々の六角形の中心座標を網羅する。
という数学の命題でしょうか?
それならば、VBAのプログラミング以前に、
恐らく「そういう数学の一般的な命題」ならば
その解法・アルゴリズム・アプローチ方法が
とっくに確立されていると思えますが如何でしょうか?
(多分、幾何学の参考書に出て来るような・・・)
ネット検索すれば、先ずは数学として「どのように解くか」という
情報が多分見つかると思います。
それを理解してから、その解法をプログラミングするには
どのようにコーディングすれば良いのかというステップに
進むのではないでしょうか?
「解法」自体の調査まで皆に求めているのですか?
既に「解法」をものにしているならば、その「解法」を
数学の素人にも判るような丁寧さで説明すれば良いと思いますよ。
座標を求めるプログラムを考えています
このアルゴリズムをどうすれば出来るのかが分からない
このように書かれている所からすると、
「解法」の調査から のように思えますが・・・
投稿2020/10/24 04:39
総合スコア51
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/24 01:21 編集
2020/10/24 10:50 編集
2020/11/24 01:21 編集
0
ベストアンサー
一番最初の六角形の中心座標を原点ではなく、(0,Sqr(3)×L)から始めてみました。これだと、第一象限と第三象限で原点がかぶりませんw
VBA
1Function f_blnTest2() As Boolean 2 Dim dblL As Double '六角形の一辺の半分 3 Dim lngA As Long 'x軸方向の係数 4 Dim lngB As Long 'y軸方向の係数の一部 5 Dim lngB0 As Long 'y軸方向の係数の一部の初期値 6 Dim lngRow1 As Long '第一、三象限のセルの行位置 7 Dim lngRow2 As Long '第二、四象限のセルの行位置 8 Dim dblX As Double '第一象限のx座標 9 Dim dblY As Double '第一象限のy座標 10 Dim wsh1 As Worksheet 11 12 Set wsh1 = Worksheets(1) 13 wsh1.Cells(1, 1).CurrentRegion.ClearContents 14 lngRow1 = 1 15 lngRow2 = 1 16 wsh1.Cells(lngRow1, "A").Value = "第一象限x" 'x軸を含む 17 wsh1.Cells(lngRow1, "B").Value = "第一象限y" 'y軸を含む 18 wsh1.Cells(lngRow2, "C").Value = "第二象限x" 19 wsh1.Cells(lngRow2, "D").Value = "第二象限y" 20 wsh1.Cells(lngRow1, "E").Value = "第三象限x" 'x軸を含む 21 wsh1.Cells(lngRow1, "F").Value = "第三象限y" 'y軸を含む 22 wsh1.Cells(lngRow2, "G").Value = "第四象限x" 23 wsh1.Cells(lngRow2, "H").Value = "第四象限y" 24 25 dblL = Sqr(2) * 3 ^ (1 / 4) * Sqr(Atn(1)) / 6 26 27 lngB0 = 1 28 Do While lngA * dblL <= 100 / 2 29 lngB = lngB0 30 Do While Sqr((lngA * dblL) ^ 2 + (lngB * Sqr(3) * dblL) ^ 2) <= 100 / 2 31 dblX = lngA * dblL 32 dblY = lngB * Sqr(3) * dblL 33 lngRow1 = lngRow1 + 1 34 Cells(lngRow1, "A").Value = dblX 35 Cells(lngRow1, "B").Value = dblY 36 Cells(lngRow1, "E").Value = -dblX 37 Cells(lngRow1, "F").Value = -dblY 38 If dblX <> 0 And dblY <> 0 Then 39 lngRow2 = lngRow2 + 1 40 Cells(lngRow2, "C").Value = -dblX 41 Cells(lngRow2, "D").Value = dblY 42 Cells(lngRow2, "G").Value = dblX 43 Cells(lngRow2, "H").Value = -dblY 44 End If 45 lngB = lngB + 2 46 Loop 47 lngA = lngA + 3 48 lngB0 = 1 - lngB0 49 Loop 50End Function
座標の数は、10006個になりました。
投稿2020/10/25 20:20
総合スコア314
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2020/10/25 08:27
編集2020/10/26 03:46総合スコア51
0
内径というのは直径のことですか?
円の中心を原点(0, 0)に、半径を100÷2=50としてやってみました。
六角形の1辺の長さを2×Lとします。
AddinBoxTsunodaさんの回答を参考に、第一象限(とx軸、y軸上)に六角形を配置していきます。
一つの六角形の中心を原点に配置します。座標は(0, 0)。
そして、その上に六角形を配置します。座標は、(0, 2×Sqr(3)×L)。Sqrというのは平方根のことです。
さらに、その上に六角形を配置します。座標は、(0, 4×Sqr(3)×L)。
:(以下略)
y軸上に六角形を配置したら、次に、そのすぐ右に六角形を配置します。
最初の座標は、(3×L, 1×Sqr(3)×L)、
その上の座標は、(3×L, 3×Sqr(3)×L)、
その上の座標は、(3×L, 5×Sqr(3)×L)、
:(以下略)
さて、fanaさんの回答を参考に、六角形の面積を円の面積の1万分の1とすると、
2×L×Sqr(3)×L÷2=π×(100÷2)^2÷10000
です。
以上を元にコードを書いてみました。
VBA
1Function f_blnTest1() As Boolean 2 Dim dblL As Double '六角形の一辺の半分 3 Dim lngA As Long 'x軸方向の係数 4 Dim lngB As Long 'y軸方向の係数の一部 5 Dim lngB0 As Long 'y軸方向の係数の一部の初期値 6 Dim lngRow1 As Long '第一、三象限のセルの行位置 7 Dim lngRow2 As Long '第二、四象限のセルの行位置 8 Dim dblX As Double '第一象限のx座標 9 Dim dblY As Double '第一象限のy座標 10 Dim wsh1 As Worksheet 11 12 Set wsh1 = Worksheets(1) 13 wsh1.Cells(1, 1).CurrentRegion.ClearContents 14 lngRow1 = 1 15 lngRow2 = 1 16 wsh1.Cells(lngRow1, "A").Value = "第一象限x" 'x軸を含む 17 wsh1.Cells(lngRow1, "B").Value = "第一象限y" 'y軸を含む 18 wsh1.Cells(lngRow2, "C").Value = "第二象限x" 19 wsh1.Cells(lngRow2, "D").Value = "第二象限y" 20 wsh1.Cells(lngRow1, "E").Value = "第三象限x" 'x軸を含む 21 wsh1.Cells(lngRow1, "F").Value = "第三象限y" 'y軸を含む 22 wsh1.Cells(lngRow2, "G").Value = "第四象限x" 23 wsh1.Cells(lngRow2, "H").Value = "第四象限y" 24 25 dblL = Sqr(2) * 3 ^ (1 / 4) * Sqr(Atn(1)) / 6 26 27 Do While lngA * dblL <= 100 / 2 28 Do While Sqr((lngA * dblL) ^ 2 + (lngB * Sqr(3) * dblL) ^ 2) <= 100 / 2 29 dblX = lngA * dblL 30 dblY = lngB * Sqr(3) * dblL 31 lngRow1 = lngRow1 + 1 32 Cells(lngRow1, "A").Value = dblX 33 Cells(lngRow1, "B").Value = dblY 34 Cells(lngRow1, "E").Value = -dblX 35 Cells(lngRow1, "F").Value = -dblY 36 If dblX <> 0 And dblY <> 0 Then 37 lngRow2 = lngRow2 + 1 38 Cells(lngRow2, "C").Value = -dblX 39 Cells(lngRow2, "D").Value = dblY 40 Cells(lngRow2, "G").Value = dblX 41 Cells(lngRow2, "H").Value = -dblY 42 End If 43 lngB = lngB + 2 44 Loop 45 lngA = lngA + 3 46 lngB0 = 1 - lngB0 47 lngB = lngB0 48 Loop 49End Function
原点が第一象限と第三象限でかぶっているのは仕様ですw
座標の数は、9997個になりました。
投稿2020/10/24 21:22
編集2020/10/25 12:49総合スコア314
0
約1万
とかいう謎のアバウトさにどのくらい甘えて良いのかわかりませんけど,てきとーに
考えている円の1万分の1サイズの小さい円をど真ん中にでも配置してやれば良いんじゃない?
で,それに隣接する(6個の)円を配置 → さらに外側に… って繰り返していけばよいのでは?
1万分の1サイズの小さい円
を考えるのに
ど真ん中
ってのは微妙だったかな?
元の円の直径が100なのだとしたら,その直径に沿って,直径1の円を100個並べた状態あたりからスタートする,とかの方が分かりやすいか.
あとはその列の隣の列の円を並べていくことを繰り返せばばいい.
投稿2020/10/24 09:00
編集2020/10/25 08:53総合スコア11996
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。