質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

10872閲覧

processingで特定の点の軌跡を残したい

ryo.robolabo

総合スコア16

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

1クリップ

投稿2016/12/03 02:38

processing で、
0. 円Aの周上を動径の回転に沿って移動する点を中心とする円Bを描き、

  1. 円Bの周上を動径の回転に沿って移動する点を中心とする円Cを描き、
  2. 円Cの周上を動径の回転に沿って移動する点D(下の画像の一番外側の円周上の白い点(小さくてスイマセン))の軌跡を描画する

ということをしたいのですが、うまくできません。

円A、B、Cの軌跡はいらないので毎フレームの初めに背景として黒い長方形を描画し画面を初期化してから円や動径を描画しているのですが、これをしてしまうと点Dの軌跡も初期化されてしまい軌跡を描くことができません。

processingでレイヤのようなものはあるのでしょうか?

点Dの軌跡だけ画面に残し、その他の円や動径はフレーム毎に描画しなおす方法があればご教授いただけないでしょうか。

イメージ説明

iaunrkw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

PGraphics というオブジェクトを使用するとレイヤーのような描画ができます

PGraphicsはメソッドとしてpoint(),line(),vertex()といった関数を持っており
それらは画面描画する関数と機能が同じです

PGraphicsのオブジェクト名をhogeとすると
hoge.beginDraw();
hoge.point(...);
hoge.line(...);
hoge.endDraw();

というような感じで使用できます

参考のため画面に螺旋状に軌跡を描画するコードを書いてみました

Processing

1PGraphics pg;//一番外側で宣言 2 3void setup() 4{ 5 size(640,480); 6 background(255); 7 noFill(); 8 9 pg = createGraphics(width,height);//画面の大きさで初期化 10} 11 12void draw() 13{ 14 background(255);//背景を白に 15 16 //軌跡の座標を計算する処理 17 float r,theta,x0,y0; 18 r = frameCount/10.0; 19 theta = TWO_PI * frameCount/100.0; 20 x0 = r*cos(theta) + width/2.0; 21 y0 = r*sin(theta) + height/2.0; 22 23 pg.beginDraw();//描画の開始 24 pg.point(x0,y0);//pg上に点を描画 25 pg.endDraw();//描画の終了 26 27 image(pg,0,0);//pgを画面に描画 28}

これでは点が描画されるのみなので
それらの間を線で繋ぎたいときは
前のフレームで定義された点の情報が必要となります
それらを踏まえて書き直すと下記のようになります
(追加した部分のみコメントつけてます)

Processing

1PGraphics pg; 2float px,py;//追加 前のフレームのxy 3 4void setup() 5{ 6 size(640,480); 7 background(255); 8 noFill(); 9 10 pg = createGraphics(width,height); 11 12 px = 0.0;//追加 初期化 13 py = 0.0;//追加 初期化 14} 15 16void draw() 17{ 18 background(255); 19 20 21 float r,theta,x0,y0; 22 r = frameCount/10.0; 23 theta = TWO_PI * frameCount/100.0; 24 x0 = r*cos(theta) + width/2.0; 25 y0 = r*sin(theta) + height/2.0; 26 27 if(2<=frameCount){//追加 2フレームから描画開始 28 pg.beginDraw(); 29 pg.line(px,py,x0,y0);//追加 線を描画 30 pg.endDraw(); 31 }//追加 32 33 image(pg,0,0); 34 35 px = x0;//追加 更新 36 py = y0;//追加 更新 37}

PGraphicsを使うのならあえてやる必要はありませんが
固定長の配列を使って下記のように書くこともできます
(固定長なのでお尻の方から線が消えていきます)

Processing

1int arraySize;//配列のサイズ 2float[] x,y;//座標を格納する配列 3int nowIndex;//描画を行うインデックスの値 4boolean update;//配列が初期化後配列のすべてが1回更新された 5 6 7void setup() 8{ 9 size(640,480); 10 background(255); 11 noFill(); 12 13 //初期化 14 arraySize = 200; 15 x = new float[arraySize]; 16 y = new float[arraySize]; 17 for(int i=0;i<arraySize;i++){ 18 x[i] = 0.0; 19 y[i] = 0.0; 20 } 21 nowIndex = -1; 22 update = false; 23} 24 25void draw() 26{ 27 background(255);//背景を白に 28 29 //軌跡の座標を計算する処理 30 float r,theta,x0,y0; 31 r = frameCount/10.0; 32 theta = TWO_PI * frameCount/100.0; 33 x0 = r*cos(theta) + width/2.0; 34 y0 = r*sin(theta) + height/2.0; 35 36 37 //インデックスの更新 38 nowIndex++; 39 if(arraySize <= nowIndex){ 40 nowIndex = 0; 41 update = true; 42 } 43 44 45 //配列を更新 46 x[nowIndex] = x0; 47 y[nowIndex] = y0; 48 49 50 //描画 51 beginShape(); 52 for(int i=0;i<=nowIndex;i++){ 53 vertex(x[i],y[i]); 54 } 55 endShape(); 56 57 if(update){ 58 beginShape(); 59 for(int i=nowIndex+1;i<arraySize;i++){ 60 vertex(x[i],y[i]); 61 } 62 vertex(x[0],y[0]); 63 endShape(); 64 } 65}

投稿2016/12/03 18:08

e-cube

総合スコア284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問