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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

153閲覧

0から1へ加算と減算

cheche0830

総合スコア187

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/09/11 09:27

編集2018/09/11 09:40

すいません、タイトルがわかりづらいのですが、

animate(); function animate() { requestAnimationFrame( animate ); render(); } function render() { var time = Date.now() * 0.00005; var s = ( 360 * ( 1.0 + time ) % 360 ) / 360; console.log(s); }

上記のような感じのコードで、
出力すると

0 0.1111 0.2222 . . . 0.9999

(数値ダミーです)
のように1へ向けて加算されていき、
最後はまた0に戻るのですが、
これを

0 0.555 0.999 0.555 0

といきなり0に戻らずに1に近づいたら今度は
0に向けて減算していってほしいのですが、(数値の反転を行いたい)
おそらくsin,cosとか使うのかとおもうのですが、
どのように記述したらよいでしょうか?

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

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

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

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

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

Udomomo

2018/09/11 09:32

このコードだけでは、値が一つ出力されただけで終わってしまい、繰り返し出力されるロジックがわかりません。コードを全て載せていただけますか?
x_x

2018/09/11 09:32

確かにsinはそのような感じになりますが、日時は関係あるのでしょうか?
cheche0830

2018/09/11 09:40

ちゃんと動作するように調整させていただきました!すいません、なぜ日時を使うのかは私もわかっておりません・・・参考例から引用したものになります。。
kszk311

2018/09/11 09:43

sin, cos使わなくてもできることは出来るのですが、どういうロジックにしたいのでしょうか。とりあえず0と1の反復ができれば良いですか?
cheche0830

2018/09/11 09:44

はい!0から1を往復できればなんでも大丈夫です!!
oikashinoa

2018/09/11 13:07

ある数値が、一定の幅内で、ある規則をもって変化する。あるタイミングで値を参照したら、規則に従った結果の値を取得したい、ということですか?requestAnimationFrameを使う必要は無いで良いですか?
cheche0830

2018/09/12 01:42

ご回答ありがとうございました。いただいた回答で無事動きました。
guest

回答2

0

render関数の1行目のvar time = Date.now() * 0.00005;ですが、
requestAnimationFrameの思想からすると若干なめらか度が落ちるかと思います。

requestAnimationFrameは次の実行タイミングで実行されるanimateには第一引数に現在時刻が格納されます。
これを元にtime変数を生成すればより滑らかな数字が作れるはずです。

おそらくsin,cosとか使うのかとおもうのですが

sinやcosは「sin グラフ」などで画像検索すれば分かるように、
-1から+1を滑らかに周回する起動をたどります。
これを0〜1に変換したければ、sinやcosで評価後に+1を行い0〜2にし、これを1/2する事で求められます。
function (it) { return (sin(x) + 1) / 2; }

Math.sinMath.PI/2 を渡した場合、このメソッドは、1 を返します。とあるように、
円の直径3.1415...という数字を投げ込んで初めて180%の0が帰ってきます。
そして360%には更に倍の6.28...を投げ込む必要があります。

例えば2秒で1周させたければ、タイムスタンプから現在時刻(多分ms)を取り出した後、
Math.sin(now / 1000 * Math.PI)を実行することで求められそうです。
以上をコード化すると、以下のような実装になりそうです。

JavaScript

1function sin (now) { 2 return Math.sin(now / 1000 * math.PI); 3} 4function position (now) { 5 return (sin(now) + 1) / 2; 6}

上手く動くかどうかは未保証ですので、これを参考に色々数値をいじったりしてみて下さい。

投稿2018/09/11 10:06

miyabi-sun

総合スコア21158

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

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

cheche0830

2018/09/12 01:40

ありがとうございます!sinは-1から1の範囲の場合に使うものなんですね。 誤解してました!また細かくご解説もありがとうございました!
guest

0

ベストアンサー

投げやりな気もしますが、とりあえず0と1の反復だけでいいなら、time使わずともシンプルにこんな感じでいけますよ。
0.1で計算したら0.899999....とか出たので、0-10の範囲で計算して、console.log時に10で割ってます。

js

1var max = 10; 2var min = 0; 3var now = 0; 4var d = 1; 5 6animate(); 7function animate() { 8 requestAnimationFrame( animate ); 9 render(); 10} 11function render() { 12 console.log(now / 10); 13 if(now + d < min || max < now + d){ 14 d *= -1; 15 } 16 now += d; 17}

投稿2018/09/11 09:57

kszk311

総合スコア3404

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

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

cheche0830

2018/09/11 10:05

ありがとうございます!!試してみます!!!
cheche0830

2018/09/12 01:59

無事出来ました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問