回答編集履歴
3
誤記
test
CHANGED
@@ -36,7 +36,9 @@
|
|
36
36
|
|
37
37
|
---
|
38
38
|
|
39
|
-
追記:
|
39
|
+
追記:とりあえずアルゴリズムの雰囲気を示すものとしてPythonの実装例を挙げます。
|
40
|
+
|
41
|
+
JavaScriptの基本機能とnumpyライブラリーを用いたPythonを比べると、後者の方が多次元配列処理の記述能力が高いためJavaScriptに書き直すならnumpyがやっていることを理解する必要があります。numpyに大きく依存した記述についてはコメントを書いておきました。やっていることの要点さえつかめればJavaScriptでも二次元配列の要素を調べたり変更したりするループ処理っぽいものを書けば実現は容易です。
|
40
42
|
|
41
43
|
|
42
44
|
|
2
追記
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
誤記
test
CHANGED
@@ -30,4 +30,4 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
質問者さんは「例は挙げておられる」のですが「具体的な評価基準」を述べておられません。よって「実際に何を狙いとしたデザインにしたいのか」が曖昧
|
33
|
+
質問者さんは「例は挙げておられる」のですが「具体的な評価基準」を述べておられません。よって「実際に何を狙いとしたデザインにしたいのか」が曖昧なため、どういうアルゴリズム(方針)がよいか案を出しにくいと思います。回答側がデザイン基準まで想定することはできるでしょうけど、それはもう「回答者独自のデザインアイデア」であって回答が発散しかねないのでは?
|