メモ(数学) - TejimaTuyoshi/returnread GitHub Wiki
内積(dotprodact) a*b=|a||b|cosΘ
|= ノルム
(a1a2)・(b1b2)=a1b1+a2b2=>|a||b|cosΘ
(ただし、現実ではもっと複雑なのでこれでは済まない)
flat shading,gouraud shading, phong shadingの順で強くなっていく。
交点座標 = 外積(一つ目の線と二つ目の線の交点)
交差した場所からそれぞれの点からの距離の比率(全体{面積比}=線をつないだ点同士の比率)*その線のベクトル
外積ベクトルを使うことで計算可能。
内積=inner product
Θよりプレイヤーがいる場所の角度が小さい=見つかっている。
マイナスなどは考えない。
Θの計算法=sin,cosなどのグラフを参照。
場所<Θ <=> cos場所 > cosΘ,=>cosΘを作っている線のそれぞれの長さの掛け算(分母)/cosΘを作っている線のベクトルの掛け算(分子)。
シータは180度までしか見えなくてよい(視野)
ただし、計算だけ(内積)だと「障害物があっても見つかってしまう」ので、対策を練ること。
数学の統計は「サーバー」系で使うことが多い。
2進数=>フラグの利用
boolより2進数の方が管理が楽に。(状態異常や生死判定など)
付与する場合(その場所を1、それ以外を0にする)orで判定 例) 0001(毒)=> 0000or0001 => 0001 例) 0101(毒と睡眠)=> 0000or0101 => 0101
解除する場合(その場所を0、それ以外を1にする)ANDで判定 例) 0001(解毒)=> 0001and1110 => 0000 例) 1010(毒と睡眠治し) 1111and1010 => 0101
その状態かどうか(その場所を1、それ以外を0にする)ANDの場合 例) 0001(毒)=> 0001 and 0001 = 1(true) 例) 1000(石化)=> 1000 and 0000 = 0(false)
XORを使用する場合 例) 0001 => 0001 xor 1110 = 1111 例) 1100 => 1100 xor 0000 = 1100
andとxorを両方使用することで「完全一致」(0なのか1なのかを把握させる)
当たり判定の前に「フィルター」をかける。
空間を分割することで、「同じ空間にいるもの」同士でぶつかるようにできる。
本来は64分割して行うものが基本。
Z型に数値をナンバリングすることで、0からの距離を割り出すことができる。
・列番号 << 2 AND 1000(シフト二回)
・列番号 << 1 AND 0100
・列番号 << 1 AND 0010
・列番号 AND 0001
これらを最後orで計算すればその場所を計算することができる。
列が多くなってしまった場合は「対角線」を使用する方が計算が少なくてよい。
大区分に入らない(上二桁が異なる)
大区分に入る(上二桁が同じ)
小区分に入る(下二桁が同じ)
こうすることで区分が割れてきていても
すぐに見つけることができる。
上から順に探索していく、「四分本探索」が必要になってくる。
-----------------------------------------------------------------githubにコピー インデックス番号=>配列の形でも計算可能。
二進数でフラグ管理をする際は、桁数の数配列の行あるいは列を一つ増やすことで使用可能。(2桁ずつ)
ただし、平面であれば活用可能だが立体になったときには計算法だけでなく「数字の割り振り方」も変わってくるので少し難しいかも。
xyz をさらに細分化するのとなると、かなりの枝の数になる。
そのため、フラグを使うだけでかなりの数にはなるが....一つずつ確認する必要もないためこっちの方が楽になる。
はっきり言って気が遠くなるが...せめて「どの区域にいるのかがわかる」だけでかなり楽にはなるだろう。
分類する際には、「大」、「中」、「小」に分けて考えることが基本となる。
判定時、左上右下のインデックスを比較。頂点の中で最大と最小を比べることで図形の大きさや形を割り出せるようになる。
上二桁=>違う「大」、同じ==>下二桁=>違う「中」、同じ「小」。で見比べられる。...小になる=まんま同じじゃね...?
三角比
sin,cos,tan,sec,cosec,cot....やばい前しかわからん。曰く後ろのは前の反対らしい。ただマイナスではなく、「分数」になるので注意。
数字から角度を求める。
座標から角度を求める場合に多く用いられる。
あるいは、座標系の変換(デザイン系に用いられる。)
x = r cos Θ
y = r sin Θ
なんちゃって振り子=>形状出来には「弧」を描く形になる。
振り子の持ち手を頂点の最大としたうえで、
Θ = Θ¹ + r
x = Θ² + r cos(sinΘ - 二分のx)
y = Θ² + r sin(sinΘ - 二分のx)
で可能。理解できん。
ベクトル = 当たり判定(距離の計算,範囲の絞り込みなど)に使用。
基本的に、座標同士の計算や内積時に使用する。
成分同士を計算(ベクトルの力同士を合わせること)をする。
| ベクトルB × ベクトル A |= ベクトルAとベクトルBを辺とする平行四辺形の面積。
massにあるcrossを使用する場合は自動的に計算される。...自分で計算式を描く場合は覚えるべき。
外積の場合、a = 「ax,ay,az」 b = 「bx,by,bz」
=> a×b = (| ay,bz・az,by |,| az,bx・ax,bz |, | ax,by・ay,bx |)となる。
色々とおかしいがまあ落ち着け。あくまで展開だ。
ちなみに内積において、なす角(cosΘ)が鋭角(0 ~ 90)なら正、鈍角(それ以上)なら負となる。
斜めの線においても上か下かで正負が把握可能になる。
垂線の求め方。=>ベクトルabのxy成分を逆にして一方の正負を判定する。
ちなみにとある点の正負判定を行うことができ、ベクトルHとベクトルABをかけて計算する。
実際は、0では判定できず正負で判定する他ないだろう。
点と直線の計算が可能。(大きさの話)
...できるにはできるのだが、正負判定後に元の直線の座標の絶対値で割らなければならない。
ルート入っても構わないのである。
どっち使っても構わないが、はっきり言って距離まで出した方が正確ではある。
あるにはあるが、こだわったからと言って必ずしも売れるとは限らないので正直その分のむくわれがあるかと聞かれると
少し難しい問題になってくる。