投稿

N88-BASICでRayTracingのしくみ

イメージ
2022/5/12(木) N88-BASICでRayTracingのしくみ   通常レイトレーシングは3次元空間に視線を飛ばし、 見えたものを2次元スクリーンに描画しますが、 2次元平面に視線を飛ばし、見えたものを1次元 スクリーンに描画する事で、レイトレーシングの しくみを視覚化しました   今回は、プログラムを単純化する為、光源などは無しに していますが、光源、反射、透過ありの、3次元 レイトレーシングについては、 ブログの https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html N88-BASICでレイトレーシング (1回目) ~(8回目) を読んで下さい   ます、視点から円までの距離を求めます ここで、数値(スカラー)を小文字、ベクトル (x,y成分を持つ矢印)を大文字で描くこと にします   P:任意の位置ベクトル r:円の半径 V:視点の位置ベクトル E:視線の方向単位ベクトル t:任意の値   とします位置ベクトルPは点Pと同じような ものだと思って下さいEは方向を表し、単位 ベクトルは距離(矢印の長さ)が1のベクトルで、 |E| = 1と書きます|E|はEベクトルの長さです   原点が中心で半径rの円は、 |P| = r で表されます 原点から点Pまでの長さがrの点の集まりです ので、円になります   視点VからE方向に向けた視線は、 P = V + Et で表されます   任意の場所にある円は、中心の位置を点Cとすると、 |P - C| = rとなりますが、視線の方は視点が 移動してもP = V + Etと変わりませんので、 球と視線を移動して円を原点に持ってくれば、 |P| = rの式で求めることができます よって、|P - C| = rは必要ありません   |P| = r P = V + Et   この式から視点と円間の距離tを求めます |P| = r にP = V + Etを代入します |V + Et| = r    | |を外すため両辺を2乗 (V + Et)(V + Et) = r 2  を展開 V・V + 2(V・E)t + (E・E)t 2  = r 2 ここでベクトル同士の積は内積になります E・E = |E||E| = 1×1 = 1 同じベクトルの内積はベクトルの

N88-BASICで円周率

イメージ
2022/4/26(火) N88-BASICで円周率   点P(x,y) (x,y=0~1) のランダムな点の内、 原点O(0,0)からの距離が1以下 の割合の4倍の値を計算します。   点Pは、辺1で面積1の正方形内に存在し、 原点からの距離が1以下の点は、半径1 の円の1/4(面積π/4)内に存在するので、 その割合π/4の4倍はπとなります。   つまり、点が円内に入る確率でπを求めます。   RND(1)が0~1未満の乱数なので、 上記の「以下」を「未満」にしてプログラム しました。   NL-BASICとblg~.zip(pi001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

N88-BASICで漢字コード

イメージ
2022/4/23(土) N88-BASICで漢字コード   今では余り見なくなりましたJISコードと シフトJISコードの変換です   16進数4桁のコードを入力すると JIS, SJIS, 全角文字の順で表示します   N88-BASIC(86)には漢字コードを変換するための 命令が用意されています   NL-BASICとblg~.zip(knj001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

二次曲面とトーラス

イメージ
2022/4/20(水) 二次曲面とトーラス   レイトレーシングで使えるプリミティブ 球、二次曲面、トーラス(torus)を紹介します 各プリミティブまでの距離tを求める式と プリミティブ上の点P(x,y,z)での法線方向 ベクトルFの式を 最後尾の1.~5.の図に載せています   以下、1.~5.の式の説明です   ここではベクトルv(上に矢印)をV(大文字)で表す事にします   1. 始点Vから視線単位ベクトルE方向に見た 原点が中心の半径rの球までの距離tを求める   (原点が中心以外の球は、球と始点を平行移動 させ中心を原点に持ってくれはよい)   球はx 2 +y 2 +z 2 =r 2  で表せます ベクトルP=(x,y,z)で表すと |P|=x 2 +y 2 +z 2  なので |P|=r です (位置ベクトルPの長さがrの位置の集まり)   始点Vから視線(単位ベクトル)E方向に見た |P|=r までの距離tを求められれば 交点も分かり、 レイトレーシングに必要な値を計算できます (法線ベクトルは中心から交点の方向です)   詳しくは、 https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html N88-BASICでレイトレーシング (1回目) ~で解説しています   2. 二次曲面の場合 二次元の場合は x 2 /1 2  + y 2 /1 2  = 1が円 x 2 /a 2  + y 2 /b 2  = 1が楕円 x 2 /a 2  - y 2 /b 2  = 1が双曲線 のように、a,bの値やa 2 ,b 2 の符号によって 形がかわります   法線は x 2 /a 2  + y 2 /b 2  + z 2 /c 2  = 1を f(x,y,z) = 0の形に変形し f(x,y,z) = x 2 /a 2  + y 2 /b 2  + z 2 /c 2  - 1 とすると 法線方向(勾配) grad f = (∂f/∂x,∂f/∂y,∂f/∂z) ∂f/∂xは偏微分で、fをxの関数とみなして xで微分することです ∂f/∂x = (d/dx)(x 2 /a 2  + y 2 /b 2  + z 2 /c 2  - 1) = 2x/a 2   よって (2x/a 2 ,2y/b 2 ,

N88-BASICで斜方投射 (2回目)

イメージ
2022/4/17(日) N88-BASICで斜方投射 (2回目)   斜方投射をグラフで表示しました   ↑↓キーで投げる高さ(位置m) ←→キーで投げる初速(km/h) (+shiftキーで変化量大)   enterキーで高さと初速のリセット qキーで終了です   計算誤差でエラーとなる場合があるので 必要なさそうな所にIFが入っています   Alt+6キーで表示速度が多少速くなります   関連記事 斜方投射、モンキーハンティング https://ulprojectmail.blogspot.com/2021/08/n88-basic-2.html N88-BASICでゲーム (2回目)   NL-BASICとblg~.zip(throw002.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICで斜方投射 (1回目)

イメージ
2022/4/14(木) N88-BASICで斜方投射 (1回目)   ニュートンの運動方程式 F = ma = mdv/dt = md 2 x/dt 2   より a = dv/dt = d 2 x/dt 2   (距離の時間微分が速度 速度の微分が加速度)   a = const.(一定)として   v = ∫adt = at + C (t = 0の時をv = v 0 とするとC = v 0 ) v = v 0  + at   x = ∫(v 0  + at)dt = v 0 t + (1/2)at 2  + C (t = 0の時をx = x 0 とするとC = 0) x = x 0  + v 0 t + (1/2)at 2     この式を使って 初速度v 0 角度θつまり 初速度 = |(v 0 cosθ, v 0 sinθ)| = v 0 で高さhから斜方投射した時の飛距離 (水平距離)を計算する   上を正とすると垂直方向の 加速度a = -g(重力加速度g)   着地までの時間は 0 = h + v 0 sinθ・t - (1/2)gt 2   gt 2  - 2v 0 sinθ・t - 2h = 0 t = {v 0 sinθ±√(v 0 2 sin 2 θ + 2gh)}/g t ≧ 0で考えて t = {v 0 sinθ+√(v 0 2 sin 2 θ + 2gh)}/g   水平方向の加速度はa = 0 2cosθsinθ = sin2θ 飛距離は x = v 0 cosθ・t = v 0 cosθ{v 0 sinθ+√(v 0 2 sin 2 θ + 2gh)}/g = (v 0 2 /g)cosθ{sinθ+√(sin 2 θ + 2gh/v 0 2 )}   ここで a = v 0 2 /g = const.(一定) k = 2gh/v 0 2  = const.(一定) w = cosθ{sinθ+√(sin 2 θ + k)} と置くと x = aw なので、wを最大とすればよい   θ-wグラフ(投射角と飛距離のグラフ)は 0<θ<90°とすると上に凸となるグラフで あると予測できるので 接線の傾きが0の時xが最大となると思われる   接線の傾きdw/dθ = -sinθ{sinθ + √(sin 2 θ + k)} +

N88-BASICで黄金比

イメージ
2022/4/11(月) N88-BASICで黄金比   黄金比の様に名称が付けられている比は   黄金比 1 : (1+√5)/2 大和比 1 : √2 白金比 1 : √3 などがあります   黄金比の描き方 下図の様に正方形の半分の位置を中心 とする円を描く   黄金比の長方形は 短辺の正方形を除いた長方形も黄金比です 短辺(1 + √5) / 2 - 1 : 長辺1 = √5 - 1 : 2 = 1 : 2/(√5 - 1) = 1 : 2(√5 + 1) / (5-1) = 1 : (1+√5)/2   大和比の長方形は 長辺を半分に折っても大和比の長方形です 短辺√2 / 2 : 長辺1 = 1 : 2 / √2 = 1 : 2√2 / 2 = 1 : √2 コピー用紙はA3を半分にするとA4で 相似なので大和比です   白金比は正三角形の、辺の半分 : 高さです 白金比の長方形は 対角線長が短辺の2倍で、 対角線と辺の間の角は30°と60°で、 どちらも有名角です   長辺:短辺で書き直し、640:整数の概数で表すと 黄金比 640 : 396 大和比 640 : 453 白金比 640 : 370   PC-98などのレトロPCの画面比(16:10)は 640 : 400 で黄金比に近い   アナログ放送やDOS-VのPCの画面比(4:3)は 640 : 480 で大和比に近い   現在のデジタル放送やPCの画面比(16:9)は 640 : 360 で白金比に近い   以上、近い比を探してみました 近いと言うには誤差が大きいように 思えますが、目安やお遊び程度に 考えて下さい   他にも名前の付いた比はある様です 誰かが名前を付ければ、まだまだ 増えるかもしれません   BASICでは今回紹介した比を短辺固定で 左から黄金比、大和比、白金比の順 (PC画面の時代の古い順)で 並べて表示してみました   NL-BASICとblg~.zip(gold001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい