VEX関数 trunk を使って量子化したい

   1387   1   0
User Avatar
Member
1 posts
Joined: Dec. 2022
Offline
現在VEXの勉強をしているのですが、以下の計算の意味がよく理解できません。

float d = length(@P);
d *= ch('scale');
float f = ch('factor');
d /= f;
d = trunc(d);
d *= f;
@P.y = d;

「 原点からあるポイントの位置までの長さ × チャンネルで指定した大きさ = ポイントのy座標 」

というところまでは分かります。ですが小数点を排除して量子化するときに、

「 dをfで割る➡dから小数点を排除する➡dとfを掛ける 」

これはなぜ最初割ったのに、また最後かけ合わせるのでしょうか?
ここの式が理解できずもやもやしています。

初歩的な質問で大変恐縮ですが、どうかご教授いただきたいです。

Attachments:
キャプチャ.PNG (924.5 KB)
キャプチャ1.PNG (960.8 KB)

User Avatar
Member
1 posts
Joined: Jan. 2020
Offline
ronronさん、こんにちは。

VEX初心者というよりはプログラミング初心者だと思われるので、1つアドバイスさせて頂くと、プログラミングにおいては問題の切り分けがとても重要です。
今回問題にされているのは、VEXやプログラミングに関するものではなく、計算つまり算数の理解の問題です。

「 dをfで割る➡dから小数点を排除する➡dとfを掛ける 」

なので、この計算を単純化して考えてみましょう。

まず、この計算でやりたいことは、
例えばdが0,1,2,3,4,5,6,7,8,9,10...という連続する値でfを3とすると、
0,0,0,3,3,3,6,6,6,9,9....という値に変換したい訳です。

手順を追って説明すると、
1. dをf(3)で割るとdは
0, 0.3333.., 0.6666.., 1, 1.3333.., 1.666.., 2.., 2.333.., 2.666, 3, 3.333.., ....

2. 小数点を排除するとdは
0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3 ....

3. これにf(3)を掛けるとdは
0, 0, 0, 3, 3, 3, 6, 6, 6, 9, 9 ..
となります。

なので、このコードだと@P.y(高さ)の値(d)がfの倍数に近似されるので結果、2番目の画像のように階段状になるわけです。

数式で何をやっているのか理解しづらいようでしたら、プログラムを始める前に、Demos( https://www.desmos.com/calculator [www.desmos.com] )などを使って数式をビジュアル化すると理解の手助けになるかと思います。

因みにこのコードは下記ように書き換えることもできます。
d = (int)(d / f)* f;

理解の手助けになれば幸いです。
Edited by takaf51 - Feb. 7, 2023 17:07:17
  • Quick Links