🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Processing

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

Q&A

解決済

1回答

1172閲覧

processingで描写した図形にキー入力を反映させたい

shin-3

総合スコア5

Processing

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

0グッド

0クリップ

投稿2019/11/11 09:43

前提・実現したいこと

プログラミング初学者です.リサージュ図形の位相や周波数などをキー入力で変化させたいのですがうまくいきません.どなたか教えていたけるとありがたいです.

発生している問題・エラーメッセージ

リサージュ図形は描写されるのですががキー入力を受け付けません

該当のソースコード

processing

1int pointCount = 1000; 2PVector[] lissajousPoints; 3int freqX = 4; 4int freqY = 7; 5float phi = 15; 6float x,y; 7 8int modFreqX = 3; 9int modFreqY = 2; 10 11float lineWeight = 0.1; 12float lineColor; 13int lineAlpha = 50; 14 15int connectionRadius = 100; 16int connecionRamp = 6; 17 18void setup() { 19 size(800,800); 20 smooth(); 21 lissajousPoints = new PVector[pointCount+1]; 22 lineColor = color(0,50); 23 24 calculateLissajposPoints(); 25 drawLissajous(); 26} 27 28void calculateLissajposPoints() { 29 for (int i = 0; i <= pointCount; i++) { 30 float angle = map(i, 0, pointCount, 0, TAU); 31 x = sin(angle * freqX + radians(phi)) * cos(angle * modFreqX); 32 y = sin(angle * freqY) * cos(angle * modFreqY); 33 x *= width/2 - 30; 34 y *= height/2 - 30; 35 36 lissajousPoints[i] = new PVector(x,y); 37 } 38} 39 40void drawLissajous() { 41 background(255); 42 strokeWeight(lineWeight); 43 pushMatrix(); 44 translate(width/2,height/2); 45 46 for (int i1 = 0; i1 < pointCount; i1++) { 47 for (int i2 = 0; i2 < i1; i2++) { 48 float d = dist(lissajousPoints[i1].x,lissajousPoints[i1].y,lissajousPoints[i2].x,lissajousPoints[i2].y); 49 float a = pow(1 / (d / connectionRadius), 6); 50 if (d <= connectionRadius) { 51 line(lissajousPoints[i1].x,lissajousPoints[i1].y,lissajousPoints[i2].x,lissajousPoints[i2].y); 52 } 53 } 54 } 55 popMatrix(); 56} 57 58void keyPressed() { 59 if (key == 's' || key == 'S') { saveFrame("_##.png"); } 60 if (key == '1') { freqX--; } 61 if (key == '2') { 62 freqX++; 63 freqX = max(freqX,1); 64 } 65 if (key == '3') { freqY--; } 66 if (key == '4') { 67 freqY++; 68 freqY = max(freqY,1); 69 } 70 if (keyCode == LEFT) {phi -= 15; } 71 if (keyCode == RIGHT) { phi += 15; } 72 73 if (key == '7') { modFreqX--; } 74 if (key == '8') { 75 modFreqX++; 76 modFreqX = max(modFreqX, 1); 77 } 78 if (key == '9') { modFreqY--; } 79 if (key == '0') { 80 modFreqY++; 81 modFreqY = max(modFreqY, 1); 82 } 83 println("freqX:" + freqX + ",freqY:" + freqY + ",phi:" + phi + ",modFreqX:" + modFreqX + ",modFreqY:" + modFreqY); 84}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Processingのプログラムは、Activeモードでは最初にsetup()を一度実行し、以降draw()を繰り返し実行する、という形をとります。キー入力のハンドラ等は、draw()が終わったところで検査して必要に応じて呼び出されます。

ということで、

このプログラムでは、draw()がないのでsetup()を実行したらあとは何もしません。

Processing

1void draw(){ 2 calculateLissajposPoints(); 3 drawLissajous(); 4}

とでも追加すればとりあえず何かしら反応するようになります。
ただし、前述のようにキーの読み出しはdraw()の合間に行われるため、draw()の処理が長すぎると反応は悪くなります。

投稿2019/11/11 13:48

thkana

総合スコア7703

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

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

shin-3

2019/11/12 09:12

回答ありがとうございます.おかげで解決できました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問