回答編集履歴

3

誤記

2018/06/09 05:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -36,7 +36,9 @@
36
36
 
37
37
  ---
38
38
 
39
- 追記:JavaScriptの基本機能numpyライブラリーを用いたPythonを比べると、後者の方が多次元配列処理の記述能力が高いためJavaScriptに書き直すならnumpyがやっていることを理解しないと難しいです。とはいえ、とりあえずアルゴリズムの雰囲気を示すものとして挙げてみます。numpyに大きく依存した記述についてはコメントを書いておきました。やっていることの要点さえつかめればJavaScriptでも二次元配列要素調べたり変更したりるループ処理っぽいものを書けば実現は容易です
39
+ 追記:とりあえずアルゴリズムの雰囲気を示すものとしてPython実装例挙げます。
40
+
41
+ JavaScriptの基本機能とnumpyライブラリーを用いたPythonを比べると、後者の方が多次元配列処理の記述能力が高いためJavaScriptに書き直すならnumpyがやっていることを理解する必要があります。numpyに大きく依存した記述についてはコメントを書いておきました。やっていることの要点さえつかめればJavaScriptでも二次元配列の要素を調べたり変更したりするループ処理っぽいものを書けば実現は容易です。
40
42
 
41
43
 
42
44
 

2

追記

2018/06/09 05:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -31,3 +31,119 @@
31
31
 
32
32
 
33
33
  質問者さんは「例は挙げておられる」のですが「具体的な評価基準」を述べておられません。よって「実際に何を狙いとしたデザインにしたいのか」が曖昧なため、どういうアルゴリズム(方針)がよいか案を出しにくいと思います。回答側がデザイン基準まで想定することはできるでしょうけど、それはもう「回答者独自のデザインアイデア」であって回答が発散しかねないのでは?
34
+
35
+
36
+
37
+ ---
38
+
39
+ 追記:JavaScriptの基本機能とnumpyライブラリーを用いたPythonを比べると、後者の方が多次元配列処理の記述能力が高いためJavaScriptに書き直すならnumpyがやっていることを理解しないと難しいです。とはいえ、とりあえずアルゴリズムの雰囲気を示すものとして挙げてみます。numpyに大きく依存した記述についてはコメントを書いておきました。やっていることの要点さえつかめればJavaScriptでも二次元配列の要素を調べたり変更したりするループ処理っぽいものを書けば実現は容易です。
40
+
41
+
42
+
43
+ ```Python
44
+
45
+ from tkinter import * # Pythonの標準GUIライブラリー
46
+
47
+ import numpy as np # 行列演算を簡便に記述することができるライブラリー
48
+
49
+
50
+
51
+ G = 4
52
+
53
+ W, H = 16*5, 9*5
54
+
55
+ CF = '#c5eb99' # 充填色
56
+
57
+ CB = '#FFF' # ボーダー色
58
+
59
+
60
+
61
+
62
+
63
+ def range2(n):
64
+
65
+ prime = 2**31-1 # 適当な大きさの素数
66
+
67
+ return map(lambda x: prime * x % n, range(n))
68
+
69
+
70
+
71
+
72
+
73
+ def find(r, cv: Canvas, a, range):
74
+
75
+ ww = W - r + 1
76
+
77
+ hh = H - r + 1
78
+
79
+ x0 = np.random.randint(0, ww)
80
+
81
+ y0 = np.random.randint(0, hh)
82
+
83
+ for ofs in range(ww * hh):
84
+
85
+ dy = ofs // ww
86
+
87
+ dx = ofs % ww
88
+
89
+ y = (y0 + dy) % hh
90
+
91
+ x = (x0 + dx) % ww
92
+
93
+ # 以下のif文は配列aの1次元目(y座標)がy~y+r-1まで、
94
+
95
+ # 2次元目(x座標)がx~x+r-1までの要素が全て0かを判定するものです。
96
+
97
+ if np.all(a[y:y + r, x:x + r] == 0):
98
+
99
+ # 以下の代入文でy座標がy~y+r-1, x座標がx~x+r-1の範囲の全要素を1にしてます
100
+
101
+ a[y:y + r, x:x + r] = 1
102
+
103
+ x1, y1 = x * G, y * G
104
+
105
+ x2, y2 = (x + r) * G - 1, (y + r) * G - 1
106
+
107
+ cv.create_rectangle((x1, y1), (x2, y2), fill=CF, outline=CB)
108
+
109
+ return True
110
+
111
+
112
+
113
+
114
+
115
+ def main():
116
+
117
+ a = np.zeros((H, W), dtype=np.uint8) # HxWの2次元行列(初期値0)を生成している
118
+
119
+
120
+
121
+ root = Tk()
122
+
123
+ cv = Canvas(root, width=W * G, height=H * G) # HTMLのcanvasみたいなもの
124
+
125
+ cv.pack()
126
+
127
+ # 空間充填に用いる正方形の大きさの候補のリスト
128
+
129
+ # この値を変えると結果の雰囲気は大分変化する
130
+
131
+ rs = [20, 10, 4, 2, 1]
132
+
133
+ for r in rs:
134
+
135
+ while find(r, cv, a, range2):
136
+
137
+ pass
138
+
139
+ root.mainloop()
140
+
141
+
142
+
143
+
144
+
145
+ if __name__ == '__main__':
146
+
147
+ main()
148
+
149
+ ```

1

誤記

2018/06/09 05:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -30,4 +30,4 @@
30
30
 
31
31
 
32
32
 
33
- 質問者さんは「例は挙げておられる」のですが「具体的な評価基準」を述べておられません。よって「実際に何を狙いとしたデザインにしたいのか」が曖昧に思えます。その状態ではどういうアルゴリズム(方針)がよいか案を出しにくいと思います。回答側がデザイン基準まで想定してしま、それはもう「回答者独自のデザインアイデア」であって回答が発散してしまうようにも思えます。
33
+ 質問者さんは「例は挙げておられる」のですが「具体的な評価基準」を述べておられません。よって「実際に何を狙いとしたデザインにしたいのか」が曖昧なため、どういうアルゴリズム(方針)がよいか案を出しにくいと思います。回答側がデザイン基準まで想定することはできるでけど、それはもう「回答者独自のデザインアイデア」であって回答が発散しかねないのでは?