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

質問編集履歴

2

質問の修正

2020/01/02 07:35

投稿

msw
msw

スコア9

title CHANGED
File without changes
body CHANGED
@@ -1,406 +1,37 @@
1
1
  ### 前提・実現したいこと
2
+ ご指摘があった為、修正し改めて質問をさせて頂きます。
3
+ Processingで木の枝にMinimライブラリを使って大きさを変化させた円を描画させるプログラムを作っています。
4
+ 円の描画位置は下図のように木の枝の先に木の実がくっ付いている様に見えるイメージを考えています。
5
+ ※ペイント3Dで編集した画像の為、該当のソースコードの実行画面ではありません。
6
+ ![完成予想図](c03b5eeb3a17803142a6630dbf64c7ec.jpeg)
2
7
 
3
- Processingで木の枝にMinimライブラリを使って大きさを変化させた円を描画させるプログラムです。
4
- 円の描画位置は違和感が無いように木の形に合わせた位置に描画したいです。
5
-
6
8
  ### 発生している問題・エラーメッセージ
7
-
8
- ```
9
- 円の描画位置の指定四角形の方法しか知らず、木の輪郭(扇形)合うような描画位置の指定方法が分かりせん
9
+ randomを使って指定範囲内で円の描画をさせています、この方法では四角形になってまい木の枝以外の場所も円が描画されてし
10
- ![現状](624f8c0322bb0142fea37aadb323bbec.jpeg)
11
- ```
12
-
13
10
  ### 該当のソースコード
14
-
11
+ ※該当のソースコードはMinimを抜いたサンプルプログラムです。
15
12
  ```processing
16
- import ddf.minim.*;
13
+ float x;
17
- import ddf.minim.analysis.*;
18
- import ddf.minim.effects.*;
19
- import ddf.minim.signals.*;
20
- import ddf.minim.spi.*;
14
+ float y;
21
- import ddf.minim.ugens.*;
22
15
 
23
- Minim minim;
24
- //AudioInput in;
25
- AudioPlayer player;
26
- //float volumeIn;
27
- int buffersize = 512;
28
-
29
- class Note {
30
- final float x;
31
- final float y;
32
- final float w;
33
- final float h;
34
-
35
- final float r;
36
- final float r2;
37
-
38
- final color col;//HSB, alpha
39
-
40
- boolean isAlive = true;
41
-
42
- Note(final float x, final float y, final float playerIn) {
43
- this.x = random(700, 1210);
44
- this.y = random(350, 450);
45
- this.w = playerIn/2;
46
- this.h = playerIn/2;
47
-
48
- this.r = this.w / 2;
49
- this.r2 = this.r * this.r;
50
-
51
- this.col = color(random(360), 100, 100, 70);
52
- }
53
-
54
- void draw() {
55
- colorMode(HSB, 360, 100, 100, 100);
56
- noStroke();
57
- fill(col);
58
- ellipse(x, y, w, h);
59
- }
60
-
61
- void update() {
62
- }
63
-
64
- boolean isExpired() {
65
- return !isAlive;
66
- }
67
-
68
- void toggle() {
69
- isAlive = !isAlive;
70
- }
71
- }
72
-
73
- abstract class Effect {
74
- protected float time;
75
- protected float t = 0;
76
- final float dt = 1.0;
77
-
78
- Effect() {
79
- }
80
-
81
- abstract void draw();
82
-
83
- abstract void update();
84
-
85
- void dec() {
86
- time -= dt;
87
- t += dt;
88
- }
89
-
90
- boolean isExpired() {
91
- return time < 0;
92
- }
93
- }
94
-
95
- abstract class MultiEffect extends Effect {
96
- ArrayList<Effect> chidren = new ArrayList<Effect>();
97
-
98
- MultiEffect() {
99
- }
100
-
101
- @Override
102
- void draw() {
103
- for (Effect eff : chidren) {
104
- eff.draw();
105
- }
106
- }
107
-
108
- @Override
109
- void update() {
110
- for (Effect eff : chidren) {
111
- eff.update();
112
- }
113
- }
114
-
115
- @Override
116
- boolean isExpired() {
117
- for (Effect eff : chidren) {
118
- if (!eff.isExpired()) return false;
119
- }
120
- return true;
121
- }
122
- }
123
-
124
- class Bakuhatu extends Effect {
125
- final float x;
126
- final float y;
127
- float r;
128
- float dr = 1;
129
- final float ddr = 0.5;
130
- //color col;
131
-
132
- final int R, G, B;
133
- int alpha;
134
- int da = 0;
135
- final int dda = 1;
136
-
137
- Bakuhatu(final float x, final float y, final float r, final color col, final float time) {
138
- this.x = x;
139
- this.y = y;
140
- this.r = r;
141
-
142
- final int mask = 0xFF;
143
- alpha = (col>>24) & mask;
144
- alpha /= 2;
145
- R = (col>>16) & mask;
146
- G = (col>>8) & mask;
147
- B = col & mask;
148
-
149
- this.time = time;
150
- }
151
-
152
- @Override
153
- void draw() {
154
- noStroke();
155
- //fill(col);
156
- colorMode(RGB);
157
- fill(R, G, B, alpha);
158
- ellipse(x, y, 2*r, 2*r);
159
- }
160
-
161
- @Override
162
- void update() {
163
- dec();
164
- r += dr;
165
- dr += ddr;
166
-
167
- alpha -= da;
168
- da += dda;
169
- }
170
- }
171
-
172
- final float g = 0.2;
173
-
174
- class Hinoko extends Effect {
175
- float x;
176
- float y;
177
- final float r = 2;
178
- final float v0 = 5;
179
- float vx;
180
- float vy;
181
-
182
- final float theta;
183
-
184
- final color col;
185
- int R, G, B;
186
- int alpha;
187
- float da = 1;
188
- final float dda = 0.05;
189
-
190
- //final float start;
191
-
192
- float drx, dry;
193
- float ddrx, ddry;
194
-
195
- Hinoko(final float x, final float y, final float r, final color col, final float theta, final float time) {
196
-
197
- this.x = x;
198
- this.y = y;
199
-
200
- this.vx = v0 * cos(theta);
201
- this.vy = v0 * sin(theta);
202
-
203
- this.col = col;
204
- //this.col = color(h,s,b,alpha);
205
-
206
- final int mask = 0xFF;
207
- alpha = (col>>24) & mask;
208
- //alpha /= 2;
209
- R = (col>>16) & mask;
210
- G = (col>>8) & mask;
211
- B = col & mask;
212
-
213
- this.drx = 0.5;
214
- this.dry = 0.05;
215
- this.ddrx = 0.5;
216
- this.ddry = 0.05;
217
-
218
- this.time = time;
219
- //this.start = time;
220
- this.theta = theta;
221
- }
222
-
223
- @Override
224
- void draw() {
225
- noStroke();
226
- colorMode(RGB);
227
- fill(R, G, B, alpha);
228
- //fill(col);
229
- ellipse(x, y, r, r);
230
- }
231
-
232
- @Override
233
- void update() {
234
- dec();
235
-
236
- alpha -= da;
237
- da += dda;
238
-
239
- x += vx;
240
- y += vy;
241
- y += g*t;
242
-
243
- drx += ddrx;
244
- dry += ddry;
245
- }
246
- }
247
-
248
- class Hanabi extends MultiEffect {
249
- Hanabi(final float x, final float y, final float r, final color col) {
250
- super();
251
-
252
- final float timeB = 30;
253
- chidren.add(new Bakuhatu(x, y, r, col, timeB));
254
-
255
- final float timeH = 50;
256
- final int max = 32;
257
- final float dtheta = TWO_PI / max;
258
- for (int i=0; i<max; i++) {
259
- chidren.add(new Hinoko(x, y, r, col, dtheta*i, timeH));
260
- }
261
- }
262
- }
263
-
264
- class Effects extends ArrayList<Effect> {
265
- Effects() {
266
- //do nothing
267
- }
268
-
269
- void add(Effects temp) {
270
- this.addAll(temp);
271
- }
272
-
273
- void draw() {
274
- for (Effect eff : this) {
275
- eff.draw();
276
- }
277
- }
278
-
279
- void update() {
280
- ArrayList<Effect> temp = new ArrayList<Effect>();
281
- for (Effect eff : this) {
282
- eff.update();
283
- if (!eff.isExpired()) temp.add(eff);
284
- }
285
- this.clear();
286
- this.addAll(temp);
287
- }
288
- }
289
-
290
- class NoteController {
291
- ArrayList<Note> notes = new ArrayList<Note>();
292
-
293
- final float margin = 100;
294
- final float xmin = margin;
295
- final float xmax = width-margin;
296
- final float ymin = margin;
297
- final float ymax = height-margin;
298
-
299
- NoteController() {
300
- //
301
- }
302
- //円の制御
303
- void add(final float playerIn) {
304
- if (notes.size() > 100) return;//check
305
- if (playerIn < 20) return;
306
- if (frameCount % 20 != 0) return;
307
- //if (frameCount % (int)random(10, 40) != 0) return;
308
-
309
- final float x = random(xmin, xmax);
310
- final float y = random(ymin, ymax);
311
- notes.add(new Note(x, y, playerIn));
312
- }
313
-
314
- void draw() {
315
- for (Note note : notes) {
316
- note.draw();
317
- }
318
- }
319
-
320
- ArrayList<Note> update() {
321
- ArrayList<Note> next = new ArrayList<Note>();
322
- ArrayList<Note> del = new ArrayList<Note>();
323
- for (Note note : notes) {
324
- note.update();
325
- if (note.isExpired()) {
326
- del.add(note);
327
- } else {
328
- next.add(note);
329
- }
330
- }
331
- notes.clear();
332
- notes.addAll(next);
333
- return del;
334
- }
335
-
336
- //真偽を使って判断
337
- boolean isHit(final Note note) {
338
- return true;
339
- }
340
- //全指定
341
- void mouseClicked() {
342
- for (Note note : notes) {
343
- note.toggle();
344
- }
345
- }
346
- }
347
-
348
- class Converter {
349
- Effects makeHanabis(ArrayList<Note> notes) {
350
- Effects temp = new Effects();
351
- for (Note note : notes) {
352
- temp.add(makeHanabi(note));
353
- }
354
- return temp;
355
- }
356
-
357
- Hanabi makeHanabi(Note note) {
358
- Hanabi temp = new Hanabi(note.x, note.y, note.r, note.col);
359
- return temp;
360
- }
361
- }
362
-
363
- NoteController controller;
364
- Effects effects;
365
- Converter converter;
366
-
367
16
  void setup() {
368
17
  fullScreen();
18
+ smooth();
369
- frameRate(60);
19
+ frameRate(10);
20
+ colorMode(HSB, 360, 100, 100, 200);
370
21
 
371
- /*Tree(30, width/2, height, PI, width/8);
22
+ Tree(30, width/2, height, PI, width/6); //木の太さ・描画位置,PI=π 180°
372
- fill(#8B7250);
373
- rect(0, 1030, 2000, 50); */
374
23
 
375
- colorMode(HSB, 360, 100, 100, 100);
376
- controller = new NoteController();
377
- effects = new Effects();
378
- converter = new Converter();
379
-
380
- minim = new Minim(this);
381
- //in = minim.getLineIn(Minim.STEREO,buffersize);
382
- final String fn = "Mountain.mp3";
383
- player = minim.loadFile(fn);
384
- player.loop();
385
24
  }
386
25
 
387
26
  void draw() {
388
- background(200);
27
+ x = random(650, 1250); //横
389
-
390
- Tree(30, width/2, height, PI, width/7);
28
+ y = random(200, 300); //縦
391
29
  noStroke();
392
- fill(#8B7250);
30
+ fill(random(255), random(255), random(255), 50);
393
- rect(0, 1030, 2000, 50);
31
+ ellipse(x,y,10,10);
394
32
 
395
- // volumeIn = in.mix.level()*200;
396
- final float playerIn = player.mix.level()*150;
397
- controller.add(playerIn);
398
- controller.draw();
399
- ArrayList<Note> temp = controller.update();
400
-
401
- effects.add(converter.makeHanabis(temp));
402
- effects.draw();
33
+ fill(#959592);
403
- effects.update();
34
+ rect(0, 1030, 2000, 50);
404
35
  }
405
36
 
406
37
  //木の生成
@@ -409,33 +40,14 @@
409
40
  translate(x, y); //座標移動
410
41
  rotate(rotate); //座標回転
411
42
  strokeWeight(strokeWeight); //線の輪郭線の太さ
412
- stroke(70, 0, 0); //線の色
43
+ stroke(#64482A); //線の色
413
44
  line(0, 0, 0, length); //線の描画,配列の長さ
414
45
  popMatrix(); //変更した座標を元に戻す
415
46
  if (strokeWeight<2)return;
416
- //if (random(0, 4)>3 && strokeWeight<3)return;
417
- if (x%5>3 && strokeWeight<3)return; //ちらつき防止
47
+ if (x%5>3 && strokeWeight<3)return;
418
48
  Tree(strokeWeight*2/3, x-sin(rotate)*length, y+cos(rotate)*length, rotate-PI/10, length*2/3);
419
49
  Tree(strokeWeight*2/3, x-sin(rotate)*length, y+cos(rotate)*length, rotate+PI/10, length*2/3);
420
50
  }
421
-
422
- void keyPressed() {
423
- if (key == 's') { //音楽ストップ
424
- player.pause();
425
- } else if (key == 'r') { //音楽リスタート
426
- player.rewind();
427
- player.play();
428
- }
429
- }
430
-
431
- void stop() {
432
- minim.stop();
433
- super.stop();
434
- }
435
-
436
- void mouseClicked() {
437
- controller.mouseClicked();
438
- }
439
51
  ```
440
52
 
441
53
 

1

現時点の実行画面の画像の挿入が上手く行かない。

2020/01/02 07:35

投稿

msw
msw

スコア9

title CHANGED
File without changes
body CHANGED
@@ -6,8 +6,8 @@
6
6
  ### 発生している問題・エラーメッセージ
7
7
 
8
8
  ```
9
- 円の描画位置の指定が四角形の方法しか知らず、木の輪郭(扇形)に合うような描画位置の指定方法が分かりません。![イメージ説明](dc3d7e25720bf3c4e7394ea58f6377ca.jpeg)
9
+ 円の描画位置の指定が四角形の方法しか知らず、木の輪郭(扇形)に合うような描画位置の指定方法が分かりません。
10
-
10
+ ![現状](624f8c0322bb0142fea37aadb323bbec.jpeg)
11
11
  ```
12
12
 
13
13
  ### 該当のソースコード