teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

拡張for

2021/01/17 09:10

投稿

TN8001
TN8001

スコア10114

answer CHANGED
@@ -41,8 +41,7 @@
41
41
  addCircle();
42
42
 
43
43
  // 円を全部描画
44
- for (int i = 0; i < circles.size(); i++) {
45
- PVector p = circles.get(i);
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
- PVector p = circles.get(i);
106
+ for (PVector p : circles) {
109
107
  noStroke();
110
108
  fill(0);
111
109
  ellipse(p.x, p.y, p.z, p.z);

3

空行

2021/01/17 09:10

投稿

TN8001
TN8001

スコア10114

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

追記

2021/01/17 08:25

投稿

TN8001
TN8001

スコア10114

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

同時?

2021/01/17 08:21

投稿

TN8001
TN8001

スコア10114

answer CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  > サイトではクリックすると円の位置を変更できるがクリックせずに複数画像を同時に作りたい
13
13
 
14
- んとに同時にすることもできますが、`noLoop()`をやめてフレームごとに描画・保存するのはどうでしょう?
14
+ 同時にすることもできますが、`noLoop()`をやめてフレームごとに描画・保存するのはどうでしょう?
15
15
  `frameRate`を上げれば、数秒で大量に画像ができます^^;
16
16
 
17
17