Skip to content
nea-cPublic

About

四則演算、三角関数、補間、Noise、クォータニオン変換などの数値計算を提供するライブラリデータパック

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

149 Commits

Folders and files

Repository files navigation

Math

四則演算、三角関数、補間、Noise、クォータニオン変換などの数値計算を提供するライブラリデータパック。

最新

r2

動作要件

Minecraft Java Edition 26.3 Pre-Release 1 以降

データパック形式119の context_float_provider を使用します。基本演算、丸め、三角関数、平方根、累乗などは26.3で追加された公式のfloat providerで計算します。

使用方法

リポジトリの Math ディレクトリを、使用するワールドの datapacks ディレクトリへ入れてください。

必要な値を storage math: に書き込み、対応するfunctionタグを実行します。

# 12 / 5を計算する
data modify storage math: a set value 12.0f
data modify storage math: b set value 5.0f
function #math:div
data get storage math: ans

実行前に古い ans は削除され、計算結果が得られた場合だけ新しい値が入ります。function resultによる成功・失敗は返しません。

  • 入力値は変更されません。
  • すべての数値入力は有限値で指定し、32-bit floatとして評価されます。
  • 下表の有効入力条件を満たさない入力の動作は未定義です。
  • 無効な入力に対する ans の存在・型・値は保証しません。
  • internal は非公開scratchであり、通常終了後に削除されます。
  • 公開APIは #math:<関数名> です。storage math: internal と Math/data/math/function 内のprivate implementation functionは実装詳細であり、直接参照・実行しないでください。

入出力

フィールド 用途
a 単項入力、左オペランド、またはNoise APIのX座標
b 右オペランド、またはNoise APIのY座標
c Noise APIのZ座標
min, max clamp の下限と上限。補間APIでは max を終了tick、Noise APIでは出力範囲として使用
t 補間量、または経過tick
curve bezier の制御点 [x1,y1,x2,y2]
amplitude, period elastic の振幅倍率と1周期のtick数
oscillations, damping elastic_decay の振動回数と減衰率
bounces, decay bounce_decay の跳ねる回数と減衰率
frequency Noise APIの周波数
seed Noise APIのシード値
rotation クォータニオン [x,y,z,w]
axis, angle axis-angle形式の回転軸 [x,y,z] と角度(ラジアン)
rotation_a, rotation_b 合成するクォータニオン [x,y,z,w]
ans 計算結果

API一覧

基本演算

functionタグ 入力 計算内容 有効入力
#math:add a, b a + b a, bが有限で、数学的結果が有限floatに収まる
#math:sub a, b a - b a, bが有限で、数学的結果が有限floatに収まる
#math:mul a, b a * b a, bが有限で、数学的結果が有限floatに収まる
#math:div a, b a / b a, bが有限、b != 0、商が有限floatに収まる
#math:reciprocal a 1 / a aが有限、a != 0、逆数が有限floatに収まる
#math:remainder a, b 切り捨て除算を基準にした剰余 a, bが有限、b != 0
#math:mod a, b floor除算を基準にした剰余 a, bが有限、b != 0
#math:abs a 絶対値 必須入力が有限
#math:sign a 符号 必須入力が有限
#math:min a, b 小さい方の値 必須入力が有限
#math:max a, b 大きい方の値 必須入力が有限
#math:clamp a, min, max a を min 以上 max 以下に制限 a, min, maxが有限、min <= max

丸め

functionタグ 入力 計算内容 有効入力
#math:floor a 負の無限大方向へ丸める aが有限
#math:ceil a 正の無限大方向へ丸める aが有限
#math:round a floor(a + 0.5) aが有限
#math:truncate a 0方向へ丸める aが有限

結果はいずれもfloatで返します。round(-1.5) は -1.0f です。

累乗・指数・対数

functionタグ 入力 計算内容 有効入力
#math:square a a² aが有限で、結果が有限floatに収まる
#math:cube a a³ aが有限で、結果が有限floatに収まる
#math:sqrt a 平方根 aが有限、a >= 0
#math:pow a, b a の b 乗 a, bが有限。a < 0ならbは整数。a == 0ならb >= 0。結果が有限floatに収まる
#math:exp a e の a 乗 aが有限、a <= 88.72283172607422f
#math:log a 自然対数 aが有限、a > 0

pow は正の底で実数指数を扱えます。負の底では b が整数の場合のみ有効です。pow(0,0) は 1.0f です。

三角関数

functionタグ 入力 単位・計算内容 有効入力
#math:sin a ラジアン aが有限
#math:cos a ラジアン aが有限
#math:tan a ラジアン aが有限で、正接が定義され安全に有限floatで表現できる
#math:sin_deg a 度 aが有限
#math:cos_deg a 度 aが有限
#math:tan_deg a 度 aが有限で、正接が定義され安全に有限floatで表現できる
#math:asin a 結果をラジアンで返す aが有限、-1 <= a <= 1
#math:acos a 結果をラジアンで返す aが有限、-1 <= a <= 1
#math:atan a 結果をラジアンで返す aが有限
#math:atan2 a, b a=y, b=x として結果をラジアンで返す a, bが有限。atan2(0,0)は0.0f
#math:asin_deg a 結果を度で返す aが有限、-1 <= a <= 1
#math:acos_deg a 結果を度で返す aが有限、-1 <= a <= 1
#math:atan_deg a 結果を度で返す aが有限
#math:atan2_deg a, b a=y, b=x として結果を度で返す a, bが有限。atan2(0,0)は0.0f

asin と acos の入力範囲は -1 以上 1 以下です。atan2(0,0) は 0.0f を返します。

# atan2(y=1, x=-1)を度で求める
data modify storage math: a set value 1.0f
data modify storage math: b set value -1.0f
function #math:atan2_deg
data get storage math: ans

角度変換・定数

functionタグ 入力 計算内容 有効入力
#math:rad a 度からラジアンへ変換 aが有限で、変換結果が有限floatに収まる
#math:deg a ラジアンから度へ変換 aが有限で、変換結果が有限floatに収まる
#math:pi なし 円周率 π 入力なし
#math:tau なし 2π 入力なし
#math:e なし ネイピア数 e 入力なし

補間

lerp は t をそのまま補間係数として使用します。それ以外の補間APIは t <= 0 で正確に a、t >= max で正確に b を返します。max には0より大きい値を指定してください。

functionタグ 入力 計算内容 有効入力
#math:lerp a, b, t t を補間係数とした線形補間 a, b, tが有限で、結果が有限floatに収まる
#math:bezier a, b, t, max, curve cubic-bezierによる補間 a, b, t, max, curveの全要素が有限、max > 0、curveは4要素、0 <= x1 <= 1、0 <= x2 <= 1
#math:elastic a, b, t, max, amplitude, period 振幅と周期を指定するElastic Out a, b, t, max, amplitude, periodが有限、max > 0、amplitude >= 1、period > 0
#math:elastic_decay a, b, t, max, oscillations, damping 振動回数と減衰率を指定するElastic Out 必須入力が有限、max > 0、oscillations > 0、damping > 0
#math:bounce a, b, t, max 3回の跳ね返りを行う一般的なBounce Out a, b, t, maxが有限、max > 0
#math:bounce_decay a, b, t, max, bounces, decay 跳ねる回数と減衰率を指定するBounce Out 必須入力が有限、max > 0、bounces > 0、decay >= 0。精度保証はbounces <= 30

bezier の curve はCSSと同じ [x1,y1,x2,y2] 形式です。x1 と x2 は0以上1以下、y1 と y2 は範囲外も指定できます。

elastic は amplitude >= 1、period > 0 を受け取ります。elastic_decay は oscillations > 0、damping > 0 を受け取ります。

bounce_decay は bounces > 0、decay >= 0 を受け取ります。bounces は整数を推奨しますが、小数も使用できます。decay=0 では跳ね返りの高さを維持し、値を大きくするほど早く減衰します。bounces <= 30 が精度保証範囲です。それより大きい有限値も使用できますが、値が大きくなるほど波形の精度が低下します。跳ねる回数を増やしても実行コマンド数は増えません。

# 20tickで0から100へ、3.5回の跳ねと減衰率3の補間を行う
data modify storage math: a set value 0.0f
data modify storage math: b set value 100.0f
data modify storage math: t set value 5.0f
data modify storage math: max set value 20.0f
data modify storage math: bounces set value 3.5f
data modify storage math: decay set value 3.0f
function #math:bounce_decay
data get storage math: ans

Noise

3次元座標から決定論的なNoiseを生成します。同じ入力とシード値には常に同じ結果を返します。

すべてのNoise APIで、座標は a, b, c、周波数は frequency、シード値は seed に指定します。座標には周波数が乗算されます。出力は min 以上 max 以下へ再マッピングされます。

フィールド 既定値
a, b, c 0.0f
frequency 1.0f
seed 0.0f
min -1.0f
max 1.0f
functionタグ 計算内容 有効入力
#math:white_noise 単位格子ごとに一定のランダム値を返すWhite Noise すべての指定値が有限、min <= maxで、座標と周波数の積および再マッピング結果が有限floatに収まる
#math:value_noise 格子点のランダム値を滑らかに補間するValue Noise 同上
#math:simplex_noise Simplex Noise 同上
#math:perlin Perlin Noise 同上
#math:octave_perlin 3オクターブを合成したPerlin Noise 同上
#math:double_perlin 周波数の異なる2組のNoiseを合成したDouble Perlin Noise 同上
#math:fbm 4オクターブを合成したFractal Brownian Motion 同上
# 座標(12, 4, -8)のFBMを0から100の範囲で取得する
data modify storage math: a set value 12.0f
data modify storage math: b set value 4.0f
data modify storage math: c set value -8.0f
data modify storage math: frequency set value 0.05f
data modify storage math: seed set value 1234.0f
data modify storage math: min set value 0.0f
data modify storage math: max set value 100.0f
function #math:fbm
data get storage math: ans

クォータニオン

クォータニオンは [x,y,z,w]、axis-angleは回転軸 [x,y,z] とラジアン単位の角度で表します。

#math:quaternion_to_axis_angle は rotation:[x,y,z,w] をaxis-angle形式へ変換します。

data modify storage math: rotation set value [0.0f,0.70710677f,0.0f,-0.70710677f]
function #math:quaternion_to_axis_angle
data get storage math: ans

結果は次の形式です。角度の単位はラジアンです。

{angle:<float>,axis:[<float>,<float>,<float>]}

入力は安全に正規化されるため、正規化済みである必要はありません。角度はクォータニオンの符号を保った 0 以上 2π 以下となり、q と -q は同一視されません。回転軸を一意に決められない場合は +Y を返します。

#math:axis_angle_to_quaternion は逆に、axis と angle をクォータニオンへ変換します。

# Y軸まわりに90度回転するクォータニオンを得る
data modify storage math: axis set value [0.0f,1.0f,0.0f]
data modify storage math: angle set value 1.5707964f
function #math:axis_angle_to_quaternion
data get storage math: ans

#math:quaternion_compose は rotation_a を適用してから rotation_b を適用する回転を返します。クォータニオン積は交換できないため、適用順を逆にすると通常は異なる回転になります。内部では Hamilton積 rotation_b × rotation_a を計算します。

functionタグ 入力 計算内容 有効入力
#math:quaternion_to_axis_angle rotation rotation:[x,y,z,w] をaxis-angle形式へ変換 rotationが有限float 4要素の[x,y,z,w]で、全要素が同時に0ではない
#math:axis_angle_to_quaternion axis, angle axis-angle形式をクォータニオン [x,y,z,w] へ変換 axisが有限float 3要素で全要素が同時に0ではなく、angleが有限
#math:quaternion_compose rotation_a, rotation_b Aを適用してからBを適用する回転を合成 両入力が有限float 4要素で、それぞれの全要素が同時に0ではない

3つのAPIはいずれも入力を安全に正規化します。axis_angle_to_quaternion と quaternion_compose の結果は正規化済みクォータニオンです。

ライセンス

MIT License に基づく。

更新履歴

r2

  • White、Value、Simplex、Perlin Noise APIを追加
  • Octave Perlin、Double Perlin、FBM APIを追加
  • axis-angleからクォータニオンへの変換APIを追加
  • クォータニオンの回転合成APIを追加

r1

  • 初版
  • 基本演算、丸め、累乗、指数、対数APIを追加
  • 三角関数、逆三角関数、角度変換、定数APIを追加
  • Lerp、Bezier、Elastic、Bounce補間APIを追加
  • クォータニオンからaxis-angleへの変換APIを追加

About

四則演算、三角関数、補間、Noise、クォータニオン変換などの数値計算を提供するライブラリデータパック

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages