回答編集履歴
4
拡張for
answer
CHANGED
@@ -41,8 +41,7 @@
|
|
41
41
|
addCircle();
|
42
42
|
|
43
43
|
// 円を全部描画
|
44
|
-
for (int i = 0; i < circles.size(); i++) {
|
45
|
-
|
44
|
+
for (PVector p : circles) {
|
46
45
|
noStroke();
|
47
46
|
fill(0);
|
48
47
|
ellipse(p.x, p.y, p.z, p.z);
|
@@ -104,8 +103,7 @@
|
|
104
103
|
addCircle();
|
105
104
|
|
106
105
|
// 円を全部描画
|
107
|
-
for (int i = 0; i < circles.size(); i++) {
|
108
|
-
|
106
|
+
for (PVector p : circles) {
|
109
107
|
noStroke();
|
110
108
|
fill(0);
|
111
109
|
ellipse(p.x, p.y, p.z, p.z);
|
3
空行
answer
CHANGED
@@ -52,7 +52,6 @@
|
|
52
52
|
save("a" + frameCount + ".png");
|
53
53
|
}
|
54
54
|
|
55
|
-
|
56
55
|
void addCircle() {
|
57
56
|
int[] sizes = { 10, 20, 50 }; // 複数のサイズ候補(円の個数やサイズが大きいと、時間がかかったり無限ループしたりするので注意)
|
58
57
|
while (circles.size() < 30) {
|
@@ -123,7 +122,6 @@
|
|
123
122
|
}
|
124
123
|
}
|
125
124
|
|
126
|
-
|
127
125
|
void addCircle() {
|
128
126
|
while (circles.size() < sizes.length) { // 円のデータの個数が、必要サイズ候補数より少ない間ループ
|
129
127
|
// サイズを取得(配列は0始まりなので、circles.size()が0の時は0番目、circles.size()が1の時は1番目...
|
2
追記
answer
CHANGED
@@ -76,4 +76,74 @@
|
|
76
76
|
}
|
77
77
|
}
|
78
78
|
}
|
79
|
+
```
|
80
|
+
|
81
|
+
---
|
82
|
+
|
83
|
+
追記
|
84
|
+
```Processing
|
85
|
+
// 必要サイズ候補を羅列(大きい順のほうが少し安全? 時間がかかったり無限ループになりにくい)
|
86
|
+
int[] sizes = {
|
87
|
+
30, 30, 30, 30, 30,
|
88
|
+
20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
|
89
|
+
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
|
90
|
+
};
|
91
|
+
ArrayList<PVector> circles; // 円のデータ
|
92
|
+
|
93
|
+
void setup() {
|
94
|
+
size(600, 600);
|
95
|
+
smooth();
|
96
|
+
|
97
|
+
frameRate(10); // 1秒に10回再描画(数字を増やすと早くなる)
|
98
|
+
}
|
99
|
+
|
100
|
+
void draw() {
|
101
|
+
background(255);
|
102
|
+
circles = new ArrayList<PVector>(); // 毎回circlesを作り直す
|
103
|
+
|
104
|
+
// 円のデータを準備
|
105
|
+
addCircle();
|
106
|
+
|
107
|
+
// 円を全部描画
|
108
|
+
for (int i = 0; i < circles.size(); i++) {
|
109
|
+
PVector p = circles.get(i);
|
110
|
+
noStroke();
|
111
|
+
fill(0);
|
112
|
+
ellipse(p.x, p.y, p.z, p.z);
|
113
|
+
}
|
114
|
+
|
115
|
+
// 画像の保存 a1.png a2.png ...
|
116
|
+
save("a" + frameCount + ".png");
|
117
|
+
|
118
|
+
if (frameCount == 100) { // 100枚作ったら止める
|
119
|
+
noLoop(); // 止める
|
120
|
+
|
121
|
+
//launch("start " + sketchPath()); // Windows専用 エクスプローラでフォルダを開く
|
122
|
+
//exit(); // 終了
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
|
127
|
+
void addCircle() {
|
128
|
+
while (circles.size() < sizes.length) { // 円のデータの個数が、必要サイズ候補数より少ない間ループ
|
129
|
+
// サイズを取得(配列は0始まりなので、circles.size()が0の時は0番目、circles.size()が1の時は1番目...
|
130
|
+
int diameter = sizes[circles.size()];
|
131
|
+
|
132
|
+
// 3次元のベクトルのうちxyを2次元座標、zを円の直径として利用している
|
133
|
+
PVector c = new PVector(random(width), random(height), diameter);
|
134
|
+
boolean overlapping = false;
|
135
|
+
|
136
|
+
for (PVector p : circles) {
|
137
|
+
// zは直径なので理屈的には割る2 くっついて見えるのがまずい場合は、少し足すなりなんなり
|
138
|
+
if (dist(c.x, c.y, p.x, p.y) < (c.z + p.z) / 2) {
|
139
|
+
overlapping = true;
|
140
|
+
break;
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
if (!overlapping) {
|
145
|
+
circles.add(c);
|
146
|
+
}
|
147
|
+
}
|
148
|
+
}
|
79
149
|
```
|
1
同時?
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
> サイトではクリックすると円の位置を変更できるがクリックせずに複数画像を同時に作りたい
|
13
13
|
|
14
|
-
ほ
|
14
|
+
ほぼ同時?にすることもできますが、`noLoop()`をやめてフレームごとに描画・保存するのはどうでしょう?
|
15
15
|
`frameRate`を上げれば、数秒で大量に画像ができます^^;
|
16
16
|
|
17
17
|
|