投稿

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を読んで遊んで下さい  

VL-BASICで音階

イメージ
2022/4/8(金) VL-BASICで音階   MIDIピッチベンド値   (b) = 2進数 (h) = 16進数 hhhhhhhlllllll(b) 0~127,0~127 = 0hhhhhhh(b),0lllllll(b) 10,00(h) = 2048 = 100セント(半音)  1セント = 20.48  2セント = 40.96 ≒ 41 = 29(h) 14セント = 286.72 ≒ 287 = 128*2 + 31 = 2,1F(h)    2セント = 40,00(h) + 29(h) = 40,29(h) -14セント = 40,00(h) - 2,1F(h) (80-1F=61) = 3D,61(h)   セント MIDIピッチベンド送信データ  0  E?, 00, 40(h) … (下位,上位の順)  4  E?, 29, 40(h) … (下位,上位の順) -14  E?, 61, 3D(h) … (下位,上位の順) ? = Channel = 0~F(h)   MIDIピッチベンドは 4000(h)が±0 7F7F(h)が最大高音 0000(h)が最大低音 だそうです   ピッチベンドセンシティビティ Bn,64,00(h) Bn,65,00(h) Bn,06,xx(h) (xxが大きいほどピッチベンド変化大) (nはチャンネルで0~F) xx = 4ならピッチベンド+1000(h)で半音(100セント) xx = 1ならピッチベンド+4000(h)で半音(100セント) を使ってより細かくピッチベンドを指定します (b) = 2進数 (h) = 16進数   ピッチベンド値の計算が面倒なのでプログラムで 計算させています   MIDIピッチベンド値   ピッチベンド値は7bit+7bitで表現されます 0hhhhhhh0lllllll(b)はhhhhhhhlllllll(b)です (例)7F7F(h)は3FFF(h)という値を表している なのでピッチベンドは 0000(h)~4000(h)~7F7F(h)送信値 0000(h)~2000(h)~3FFF(h)実際の値   0  ~8192  ~16383 10進数 -8192 ~  0  ~+8191 変化量 となります   MIDIピッチベンド送信データは4000(h)の場合