投稿

N88-BASICでCIRCLE (3回目)

イメージ
2022/3/12(土) N88-BASICでCIRCLE (3回目)   前回の3点を通る円弧 を連続円弧 にします   入力した座標を記録し、 再生するプログラムを セーブ出来る様にしました   このプログラムは一筆書きのみの対応です   NL-BASICとblg~.zip(cir003.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

N88-BASICでCIRCLE (2回目)

イメージ
2022/3/10(木) N88-BASICでCIRCLE  (2回目)   前回の3点を通る円を円弧にし ます 3点と中心の位置ベクトルをA,B,C,O とすると、 ベクトルA-Oとx軸(正方向)のなす角θ を求めます   A-O=(x,y)とすると、 0°≦θ< 360°は、 -90°≦ Tan -1 (y/x) ≦ 90°として、 x = 0 のとき、   不明  (if y = 0)    90° (if y > 0)   270° (if y < 0) x > 0 のとき、   Tan -1 (y/x)        (if y ≧ 0)   360°+ Tan -1 (y/x) (if y < 0) x < 0 のとき、   180°+ Tan -1 (y/x)   3点A,B,Cのどれを始点、間の点、終点 にするかによって、描かれる円弧が 変わります   BASICでは角度はラジアン(弧度法)なので 0≦θ<2π です   今回は、A,B,Cの順に点を打つとして、 AからCへBを経由する円弧を描きます   A<B<C → A to C B<C<A → A to C C<A<B → A to C A<C<B → C to A B<A<C → C to A C<B<A → C to A   860 IF W > 0 THEN T = ATN(H / W) - (H < 0) * 2 * PI: RETURN この行の(H < 0)は、真なら-1、偽なら0になる   NL-BASICとblg~.zip(cir002.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

N88-BASICでCIRCLE (1回目)

イメージ
2022/3/8(火) N88-BASICでCIRCLE (1回目)   3点を通る円をCIRCLE命令で描画します   ベクトルは大文字、スカラーは小文字で 書くことにします   ベクトルの内積の行列表記 A=(a x ,a y ), B=(b x ,b y ) A・B = a x b x  + a y b y   |a x  a y ||b x | = a x b x  + a x b y  = A・B              |b y |   行列 M =|a b|の行列式det|M|=ad-bc              |c d| det|M|はベクトル(a b),(c d)または (a c),(b d)が作る平行四辺形の面積(方向有)   行列や、平行四辺形の面積は、このブログの   https://ulprojectmail.blogspot.com/2021/06/n88-basicmatrix-1.html N88-BASICで行列(matrix) (1回目)   https://ulprojectmail.blogspot.com/2022/03/n88-basicvector-2.html N88-BASICでベクトル (2回目)   で、それぞれ解説しています   逆行列 M -1 =   1      | d -b|  (det|M|= ad-bc ≠0)                      ad-bc |-c  a| 単位行列 I=|1 0|          |0 1| (ad-bc)M -1 M=|ad-bc -ab+ab|=|ad-bc   0  |                         |cd-cd -cb+ad|  |  0   ad-bc| M -1 M=|1 0| = I             |0 1|   -------------------------------------------- 円周上の 3点と中心の位置ベクトルを A,B,C,O、円の半径をrとする   A=(a x ,a y ), B=(b x ,b y ), C=(c x ,c y ), O=(x,y), r   中心から各 3点までの距離はrなので |A-O|=r |B-O|=r |C-O|=r   両辺 2乗して |A| 2

N88-BASICでベクトル (2回目)

イメージ
  2022/3/6(日) N88-BASICでベクトル (2回目)   ベクトルの外積   a,bベクトルの外積cベクトルは、 c = a×b = -b×aで、a,bベクトルが 作る平行四辺形の面積と同じ大きさ で垂直なベクトルになります 向きは、 aからbへ右手の4本指を 向けた時、残りの親指の方向です (aからbへ右ねじを回して進む向き)   b x  : d = b y  : a y   より、 b y d = a y b x   図 2 a,bベクトルが作る平行四辺形の面積     a x b y  - a y b x     a,bベクトルが作る平行四辺形(青+黄)の 面積は、図 2のようになります   黄に注目すると、平行四辺形の面積を変え ずに底辺を水平にすることができます   底辺を水平にした平行四辺形の面積は a x b y  - b y d です   紫の三角形は相似なので b x  : d = b y  : a y   より、 b y d = a y b x   となり、 紫 +灰?+水色の平行四辺形と 紫 +灰?+桃色の平行四辺形が同じ面積 になり、 a x b y  - b y d = a x b y  - a y b x   です よって、 a,bベクトルが作る平行四辺形 (青+黄)の面積は、a x b y  - a y b x   となります   a,bベクトルが作る平行四辺形の 面積と同じ大きさで垂直なベクトルを cベクトルとすると、 c = (0, 0, a x b y  - a y b x ) となります a,bベクトルはxy平面上なので cベクトルはz軸方向になります   ここから、 3次元ベクトルを大文字で 表すことにします   A = (a x , a y , a z ) B = (b x , b y , b z )として、 A,Bベクトルが作る平行四辺形を x,y,z軸側から見ると x軸 c x  = a y b z  - a z b y   y軸 c y  = a z b x  - a x b z   z軸 c z  = a x b y  - a y b x   の大きさに見えます C = (c x , c y , c z ) は A,Bベクトルが作る平行四辺形の 面積と同じ大きさで垂直なベクトル になります C =

N88-BASICでベクトル (1回目)

イメージ
2022/3/3(木) N88-BASICでベクトル (1回目)   ベクトルの内積     図 1 a・b = a x b x  + a y b y   ベクトル aとbの内積はa・b = |a||b|cosθ なので, |b|をaに垂直に落とした陰の長さ |b|cosθと|a|の積になり、ベクトルbを 90°回転したベクトルb'とaが作る 平行四辺形の面積と考える事が出来ます |b|cosθ=|b'|cosθ=平行四辺形の高さ |a|が底辺です   図 1を見ると、a x b x  + a y b y   が平行四辺形の 面積と同じなので、 a・b = a x b x  + a y b y   と なります (黄色同士と水色同士を見る) (a,b,b'ベクトルの成分はマス目の数を 見ると分かり易いと思います )   別の導き方、 ここから、ベクトルを大文字で表し、 A=(a 0 ,a 1 ,a 2 )と成分表記する事にします E i を各 (直交)座標軸の単位ベクトルとすると、 A = Σa i E i   、 E i ・ E i  = 1 、E i ・ E j  = 0(i≠j) A・B = (Σa i E i )・(Σb i E i ) = Σa i b i となり、各ベクトルの同じ成分同士の積の和 になります 3次元なら、a・b = a x b x +a y b y +a z b z   です A・B = |a||b|cosθより、cosθ = A・B/(|a||b|) なので、 cosの逆関数を使えば2つのベクトルの なす角がわかります N88-BASICではtanの逆関数しかないので、 tanθ = sinθ/cosθ       = √{(1-cosθcosθ)/(cosθcosθ)}       = √{1/(cosθcosθ) - 1}       = √[|a||b||a||b|/{(A・B)(A・B)} - 1] を使用します a・b    = a x b x  + a y b y |a||a| = a x a x  + a y a y |b||b| = b x b x  + b y b y から x = tanθを求めて、 t  = Tan -1 (x)で角度tが求まります tがラジアンの場合 θ = 180t/πで

N88-BASICでスライドパズル (3回目)

イメージ
2022/2/26(土) N88-BASICでスライドパズル (3回目)   Sliding puzzle(8)の解答探索 123      123      123 456 →   45  →  456 78       786      78   スペースの場所へ 1~8を動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 aキーで解答探索します。(qキーで途中中断) スペースキーで終了です。   解答探索        (1)    (2)    (3)       xxx    xxx    xxx 盤面    xx2 → xxx  , xx         x1     x 1    xx2 方法    ""     "→"   "↓"   (1)からは(2)と(3)の動かし方があります PUZZNは(1),(2),(3)の盤面を記憶する最大数です MOVENは(2),(3)へ至る方法を記憶する最大値です (2),(3)について(1)と同様に繰り返し、 初めに見つけた答えを表示しています。   深さ探索 (スタックの先入れ後出し)ではなく 幅探索 (ストリームの先入れ先出し)で検索しています ので初めに見つけた答えは最短経路の一つです。   1. (1)を保存 2. (1)を取出し移動可能な盤(2),(3)を保存 3. (2)を取出し移動可能な盤保存…(4)とします 4. (3)を取出し移動可能な盤保存…(5)~とします 5. (4)を取出し.... と保存しようとする盤が答えになるまで繰り返します。 ただし、今までと同じ盤面になったときは保存しない チェックを入れています。 このチェックを入れると、答えを見つけるまでの 時間が節約できる代わりに、メモリーが多く必要です。   以下のメモリーでは、メモリーが不足で途中中断 する場合が多いです 1050 PUZZN = 45000 1060 MOVEN = 15000 を増やせば最後まで検索できると思います。   NL-BASIC