投稿

N88-BASICで行列(matrix) (1回目)

イメージ
2021/6/22(火) N88-BASICで 行列 (matrix)   (1 回 目 )   (by ULproject for N88-BASIC, NL-BASIC) 点を併進、回転移動させる行列を作り ワイヤーフレーム (線画)の立体を ラジコンや自分が移動する (1,2キーで切り替え、キー操作はプログラムの 最終行のコメントに書いています ) ように動かしていきます   今回は併進移動です   ここから、行列は大文字、 ベクトルとスカラーは小文字で表す事にします 行列は 4×4(4行4列)とし、 ベクトルは 3次元(4次元目は常に1)とします またベクトル上部の矢印は省いています   行列の演算を 2×2で説明します 行列 Aのi行j列の成分をa ij で 表します。 A=|a 11  a 12 | B=|b 11  b 12 |   |a 21  a 22 |   |b 21  b 22 |   A+B=|a 11 +b 11  a 12 +b 12 |     |a 21 +b 21  a 22 +b 22 |   AB=|a 11  a 12 ||b 11  b 12 |    |a 21  a 22 ||b 21  b 22 | =|a 11 b 11 +a 12 b 21  a 11 b 12 +a 12 b 22 |  |a 21 b 11 +a 22 b 21  a 21 b 12 +a 22 b 22 |   ベクトルとの積は p=(x,y)を列ベクトルにして Ap=|a 11  a 12 ||x| = |a 11 x a 12 y|    |a 21  a 22 ||y| = |a 21 x a 22 y|   スカラー倍は kA=k|a 11  a 12 | = |ka 11  ka 12 |     |...

HTMLでレイトレーシング (8回目)

イメージ
2021/6/16(水) HTML でレイトレーシング  (8 回 目 )   by ULproject for HTML(JavaScript, canvas) ray008.html 式変形など詳しくは N88-BASICでレイトレーシング (8回目) 透過を追加します 透過は屈折光と反射光に分けて追跡します   物質 1から2へ光が進む時、 物質 1,2の絶対 屈折率を n 1 、 n 2 、相対屈折率を n = n 12  = n 2 /n 1 とし、入射光 E,屈折面の法線N、反射光S、 屈折光 Rとする |E|=|N|=|R|=1   図 5 屈折光R = (1/n)(E - d N)   光が当たった部分の長さを 1にして 幅のある光が屈折する様子を書いた のが図 5です   物質 1 : 物質2 = sinθ : sinα は、 単位時間当たりの光が進む距離の比 つまり、進みやすさの比です。 屈折率 n 1 , n 2 は光の進みにくさなので 進みやすさの比は、 sinθ : sinα = n 2  : n 1  = n : 1 sinθ = nsinα   よって、図 5の角αを持つ2つの 直角三角形は大が小の n倍になって いる   R’= E - d Nと置くと、 R  = (1/n)R’    = (1/n)(E - d N)   となり、 dを求める、   d = ncosα - cosθ ncosα = n√(1-sin 2 α) = √{n 2 -(nsinα) 2 } = √(n 2 -sin 2 θ) = √{n 2 -(1-cos 2 θ)} d = √{n 2 -(1-cos 2 θ)} - cosθ   屈折光 Rと前回やった反射光Sは R = (1/n)[E-[√{n 2 -(1-cos 2 θ)}-cosθ]N] ただし、 cosθ= -E・N S = E+(2cosθ)N = E - 2(E・N)N   次に、入射光が屈折光 (1-k)と反射光kに 分かれる割合 反射率 k = [ {sin(θ-α)/sin(θ+α)} 2 ...