回答編集履歴

1

コメントで追加された仕様の反映

2021/01/17 08:34

投稿

kozuchi
kozuchi

スコア1193

test CHANGED
@@ -191,3 +191,203 @@
191
191
  }
192
192
 
193
193
  ```
194
+
195
+
196
+
197
+ # コメントで追加いただいた仕様について
198
+
199
+
200
+
201
+ >例えば、サイズ10 20 30の3種類の大きさの円をそれぞれ10個 10個 5個の様に個数を指定して場所だけランダムにしたいです。
202
+
203
+
204
+
205
+ こんな感じでしょうか。
206
+
207
+
208
+
209
+
210
+
211
+ ``` Processing
212
+
213
+ ArrayList <PVector> circles;
214
+
215
+
216
+
217
+ public class CircleDefine {
218
+
219
+ public int size;
220
+
221
+ public int count;
222
+
223
+
224
+
225
+ public CircleDefine( int size, int count ) {
226
+
227
+ this.size = size;
228
+
229
+ this.count = count;
230
+
231
+ }
232
+
233
+ }
234
+
235
+ ArrayList<CircleDefine> circle_defines = new ArrayList<CircleDefine>();
236
+
237
+
238
+
239
+ void setup() {
240
+
241
+ background(0,0,100);
242
+
243
+ size(600, 600);
244
+
245
+
246
+
247
+ //色相・彩度・明度で指定
248
+
249
+ colorMode(RGB, 256, 256, 256);
250
+
251
+
252
+
253
+ // 円のサイズと数を指定
254
+
255
+ circle_defines.add(new CircleDefine(30,5));
256
+
257
+ circle_defines.add(new CircleDefine(10,10));
258
+
259
+ circle_defines.add(new CircleDefine(20,10));
260
+
261
+
262
+
263
+ smooth();
264
+
265
+ noLoop();
266
+
267
+ }
268
+
269
+
270
+
271
+ void draw() {
272
+
273
+ for ( int n = 1; n <= 10; ++n ) {
274
+
275
+ background(255,255,255);
276
+
277
+ circles = new ArrayList <PVector>();
278
+
279
+
280
+
281
+ addCircle();
282
+
283
+
284
+
285
+ for (int i=0; i<circles.size(); i++) {
286
+
287
+ PVector p = circles.get(i);
288
+
289
+ noStroke();
290
+
291
+ fill( 0,0,0);
292
+
293
+ ellipse(p.x, p.y, p.z, p.z);
294
+
295
+ }
296
+
297
+
298
+
299
+ // ファイルの保存はすべての描画が終わってから
300
+
301
+ // save(String.format("E:/processing/a%03d.png",n));
302
+
303
+ save(String.format("C:/tmp/a%03d.png",n));
304
+
305
+ }
306
+
307
+ }
308
+
309
+
310
+
311
+
312
+
313
+ void addCircle() {
314
+
315
+
316
+
317
+ for ( CircleDefine circle_define : circle_defines ) {
318
+
319
+ int next_count = circles.size() + circle_define.count;
320
+
321
+ while (circles.size() < next_count ) {
322
+
323
+
324
+
325
+ PVector c = new PVector(random(width), random(height), circle_define.size);
326
+
327
+ boolean overlapping = false;
328
+
329
+
330
+
331
+ for (PVector p : circles) {
332
+
333
+
334
+
335
+ /*
336
+
337
+ distは2点間の距離を出す dist(x1, y1, x2, y2)
338
+
339
+ この場合は、cとpの2点間の距離 > cの半径+pの半径の場合に描画される
340
+
341
+ cとpの2点間の距離 < cの半径+pの半径の場合は重なってしまう
342
+
343
+ */
344
+
345
+
346
+
347
+ if (dist(c.x, c.y, p.x, p.y) < (c.z + p.z)) {
348
+
349
+ overlapping = true;
350
+
351
+ break;
352
+
353
+ }
354
+
355
+ }
356
+
357
+
358
+
359
+ if (!overlapping) {
360
+
361
+ //配列の要素を追加
362
+
363
+ circles.add(c);
364
+
365
+ }
366
+
367
+ }
368
+
369
+ }
370
+
371
+
372
+
373
+ }
374
+
375
+ ```
376
+
377
+
378
+
379
+ 基本的な考え方としては、作りたい円の定義をあらかじめ変数に入れて用意しておき、
380
+
381
+ 描画時にそれを順に取り出して描画していきます。
382
+
383
+ 以下の例ではクラスを新たに作っていますが、以下のように配列を二つ作ってしまったほうが早いかもしれません。
384
+
385
+
386
+
387
+ ```processing
388
+
389
+ int[] size = { 10, 20, 30 };
390
+
391
+ int[] count = { 10, 10, 5 };
392
+
393
+ ```