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

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

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

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

Q&A

1回答

298閲覧

processingで決まった時間に移動が止まるようにしたい

afaf_wf

総合スコア0

Processing

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

0グッド

0クリップ

投稿2024/06/02 07:06

円をクリックした際にジャンプするようにして、ある床の面で止まるようにしたいです。
自分が考えたのは、mousePressedでジャンプするようにし、変位が0になるt = 1で状態を切り替えて、とまるようにしたいのですが、t = 1になったときにF が変わらないです。if を使うことしか思いつきません。なにか間違っているところがあれば教えていただけますでしょうか。
float y;
float t;
float v;
int F;
void setup()
{
frameRate(100);
F = 0;
t = 0;
y = 200;
v = 4.9;
size(800, 800);
background(255);
}
void mousePressed()
{
F = 1;
}
void draw()
{
if ( F == 1)
{
t = t + 0.01;
y = y -( v * t - 9.8/2 * t * t);
}
if ( t == 1 )
{
F = 0;
}
background(255);
circle(200, y, 50);
println(t);
println(F);
}

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

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

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

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

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

thkana

2024/06/02 08:14

まだ内容精査していないのですが、 > なにか間違っているところがあれば と聞いているということは、今のプログラムで一応期待通りに動いていて、でも見つけていない間違いがあるかも知れないから探せ、というリクエストなのでしょうか? それと、ソースコードは適切に提示してください。 ``` ソースコード部分 ``` という記述をすればよいです。このサイトの「ヘルプ」の項目に書いてあります。
guest

回答1

0

t = 1になったときにF が変わらないです。

println(t);としているのですから、1になっていないことはわかってると思うのですが...

例えば0.1を10回足しても、(正確に)1にはなりません。

Processing

1float a = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1; 2println(a); // 1.0000001 3println(a == 1); // false

何故かはggってください^^;
float 誤差 - Google 検索

で、どうするかですが↓あたりがありがちな対策でしょうか。

  • ==で比較しない
    if (t >= 1)に変えてもいいなら話が早いです。
  • 同じと言っていいほど差が小さいかを判断する
    if (abs(t - 1) < 0.001)のようにする(もっと小さい数字でいいけど)
    abs() / Reference / Processing.org
  • (その変数は)floatを使わない
    tは整数(int)にして1ずつ足していき、使うところでt / 100.0する。

数学苦手だけどこういうことでいいんかな??

Processing

1final float g = 9.8; // 重力 2final float v0 = 4.9; // 初速 3float y1 = 200; // オリジナルy座標 4float y2 = 200; // 改良y座標 5float t; // 時間 6boolean F; // ジャンプ中フラグ 7 8void setup() { 9 size(700, 300); 10 frameRate(100); 11 background(255); 12} 13 14void draw() { 15 //background(255); // 残像残す 16 17 float y3 = 200; // 高さ初期位置 18 19 if (F) { 20 t += 0.01; 21 22 // 時刻tにおける高さを減算していったらおかしなことに 23 y1 -= v0 * t - g / 2 * t * t; 24 25 // 減算していくなら速度のほう(ただしm/sなわけだから本来/100すべき? 26 y2 -= v0 - g * t; 27 28 // 公式で今の高さを計算する(が、mだと小さすぎるのと↑と合わせるために100倍 29 y3 -= (v0 * t - g / 2 * t * t) * 100; 30 } 31 32 //if (t >= 1) { 33 // F = false; 34 //} 35 if (abs(t - 1) < 0.001) { 36 F = false; 37 } 38 39 translate(t * 100, 0); // わかりやすくするため全体を右に移動 40 circle(100, y1, 50); // オリジナル 41 42 translate(200, 0); // 43 circle(100, y2, 50); // 改良 44 45 translate(200, 0); 46 circle(100, y3, 50); // 高さ計算 47} 48 49void mousePressed() { 50 background(255); 51 F = true; 52 t = 0; 53 y1 = 200; 54 y2 = 200; 55}

アプリ動画

投稿2024/06/02 13:01

編集2024/06/03 14:38
TN8001

総合スコア9819

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

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

thkana

2024/06/02 15:35

そもそもスジとしては、時間で管理するよりも「打ち上げたモノが再び地上に落ちてきた」ことを検出すべきと私は思いますけどね。重力加速度は変わらないにしても、初速が変わることはあるでしょうし。 で、その辺をいじろうとするとモノの位置の式が間違っていることにも気付くかも...
TN8001

2024/06/02 22:04

> そもそもスジとしては、 「tじゃなくてyを見ろ」ということですね。 「ある床の面で止まる」ならそうですが、「決まった時間」とも言ってるのでどっちが重要なんでしょう。 > 式が間違っていることにも気付くかも... なるほどそれが質問へのコメントの意味ですか。 確かに放物線になっていない気はしていました^^; Processingだとgもテキトウで、vyを加算していくような例が多いですよね。 式ありきでそれを可視化するような課題なのかな?
thkana

2024/06/03 12:57

> ある床の面で止まるようにしたいです と書いているので。 電算機らしい処理としては、微小時間毎に速度に加速度を反映させて、その分変位させて...を繰り返していくのが「王道」のような気もしますが、せっかく綺麗な等加速度運動ならそれで計算するのもいいかなぁ、とは思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問