Line Anime 0.1.0

2 つの点 $\boldsymbol{v}_1$ と $\boldsymbol{v}_2$ を通る直線 $\boldsymbol{v}$ をパラメーター $k$ で表すと、 $$\boldsymbol{v} = (1 - k) \boldsymbol{v}_1 + k \boldsymbol{v}_2 $$ となります。$k = 0$ のときは、 $$\boldsymbol{v} = \boldsymbol{v}_1 $$ となり、$k = 1$ のときは、 $$\boldsymbol{v} = \boldsymbol{v}_2 $$ となります。また、$k = 0.5$ のときは、 $$\boldsymbol{v} = 0.5 \boldsymbol{v}_1 + 0.5 \boldsymbol{v}_2 = \frac{\boldsymbol{v}_1 + \boldsymbol{v}_2}{2} $$ となって、ちょうど中間の点になります。これは平均を求める式と同じ形ですね。 逆に考えると、平均の式をちょうど真ん中以外も計算できるように一般化したのが、直線の方程式とも言えるでしょう。

このプログラムは 2 点 $\boldsymbol{v}_1 = (100, 100)$ と $\boldsymbol{v}_2 = (500, 300)$ の間で緑の点を移動させます。上記の $k$ を $0$ から $1$ まで $0.05$ おきに変化させて、$\boldsymbol{v}$ に相当する $x$ と $y$ の値を求めて、そこに点を移動します。

実行結果

Small Basic オンラインで実行したスクリーンショットを以下に示します。 まず、座標 (100, 100) と座標 (500, 300) に $\boldsymbol{v}_1$ と $\boldsymbol{v}_2$ を表す黒い点を打っています。 下図では $k = 0.45$ のときの $\boldsymbol{v}$ を緑の点で表示しています。

ソース

LineAnime.txt

方眼線を引く DrawGrid は前回から変わっていません。DrawPoint は新たに作成しましたが、 Points.txt の ● のほうを応用しています。

' Line Anime
' Version 0.1.0
' Copyright © 2020 Nonki Takahshi.  The MIT License.
' Last update 2020-08-26
 
DrawGrid()

size = 10   ' size of a point

x = 100
y = 100
DrawPoint()
x1 = x
y1 = y

x = 500
y = 300
DrawPoint()
x2 = x
y2 = y

AddPoint()
While "True"
    For k = 0 To 1 Step 0.05
        MovePoint()
        Program.Delay(500)
    EndFor
EndWhile

Sub AddPoint
    shT = Shapes.AddText("")
    Shapes.Move(shT, 40, 40)
    GraphicsWindow.PenWidth = 0
    GraphicsWindow.BrushColor = "DarkGreen"
    shP = Shapes.AddEllipse(size, size)
EndSub

Sub DrawPoint
    GraphicsWindow.BrushColor = "Black"
    GraphicsWindow.FillEllipse(x - size / 2, y - size / 2, size, size)
    GraphicsWindow.DrawText(x, y, "(" + x + ", " + y + ")")
EndSub

Sub DrawGrid
    gw = GraphicsWindow.Width
    gh = GraphicsWindow.Height
    fn = GraphicsWindow.FontName
    If (fn = "Tahoma") Or (fn = "Segoe UI") Then
        c10 = "#33000000"
        c100 = "#66000000"
        bc = "#CC000000"
    Else    ' for SBO
        c10 = "#00000033"
        c100 = "#00000066"
        bc = "#000000CC"
    EndIf
    GraphicsWindow.FontName = "Courier New"
    GraphicsWindow.FontSize = 18
    GraphicsWindow.BrushColor = bc
    For x = 0 To gw Step 10
        If Math.Remainder(x, 100) = 0 Then
            GraphicsWindow.PenColor = c100
            GraphicsWindow.DrawText(x + 2, 0, x)
        Else
            GraphicsWindow.PenColor = c10
        EndIf
        GraphicsWindow.DrawLine(x, 0, x, gh)
    EndFor
    For y = 0 To gh Step 10
        If Math.Remainder(y, 100) = 0 Then
            GraphicsWindow.PenColor = c100
            GraphicsWindow.DrawText(2, y, y)
        Else
            GraphicsWindow.PenColor = c10
        EndIf
        GraphicsWindow.DrawLine(0, y, gw, y)
    EndFor
EndSub

Sub MovePoint
    x = (1 - k) * x1 + k * x2
    y = (1 - k) * y1 + k * y2
    Shapes.Move(shP, x - size / 2, y - size / 2)
    Shapes.SetText(shT, "k = " + k)
EndSub

Copyright © 2020 たかはしのんき. All rights reserved.