アンテナコントローラをプチ改良

プログラミング

 アンテナコントローラを実践で使用し始めました。訓練のために、無線小屋に居てローテータやアンテナスイッチを手動で操作できる時でも、アンテナコントローラのアプリを起動して使っています。使ってみると、やはり方位角の表示がデジタルだけというのは視覚的にピンとこないところがあります。やはり、ローテータのインジケータのように、アナログ表示だと良いなぁ・・・と思ったので、早速プチ改良しました。それぞれのローテータの方位角をアナログ表示するのではなく、フォーカスされているローテータだけをアナログ的にも表示するようにしました。フォームの大きさをなるべく小さくしたいという思惑があるので、見たい時だけ広げられるような場所に表示しています。

 なるべく簡単に方位角をアナログ表示したかったので、丸に三角というシンプルな図形にしました。こんなものでもSolid Edge 2025を使って設計図を描いて、三角形の各頂点と中心および半径の関係を明らかにしました。

 アンテナコントローラのアプリに組み込む前に、試しに方位角のインジケータだけを表示するアプリをVB.NETで書いて試しました。ついでに最近リリースされたVisualStudio2026Communityをインストールして、そこからVB.NETでプログラムを作成しました。VB.NETで書いたお試し版のソースコードを以下に示します。

Public Class Form1

Function RadianFromDeg(ByVal deg As Integer) As Double
    RadianFromDeg = deg * (Math.PI / 180)
End Function

Function WorldToCanvas(worldX As Single, worldY As Single, canvasWidth As Single, canvasHeight As Single) As PointF
    Dim canvasX As Single = canvasWidth / 2.0F + worldX
    Dim canvasY As Single = canvasHeight / 2.0F - worldY
    Return New PointF(canvasX, canvasY)
End Function

Private Sub drawArrow(ByVal deg As Integer, ByVal pb As PictureBox)
    pb.Height = pb.Width 'force set height as squire
    Dim canvas As New Bitmap(pb.Width, pb.Height)
    Dim g As Graphics = Graphics.FromImage(canvas)
    Dim r As Single = (pb.Width - 1) / 2.0F
    Dim p1x As Single = r * Math.Cos(RadianFromDeg(90 - deg))
    Dim p1y As Single = r * Math.Sin(RadianFromDeg(90 - deg))
    Dim p2x As Single = r * Math.Cos(RadianFromDeg(300 - deg))
    Dim p2y As Single = r * Math.Sin(RadianFromDeg(300 - deg))
    Dim p3x As Single = r * Math.Cos(RadianFromDeg(240 - deg))
    Dim p3y As Single = r * Math.Sin(RadianFromDeg(240 - deg))
    Dim p1 As PointF = WorldToCanvas(p1x, p1y, pb.Width - 1, pb.Height - 1)
    Dim p2 As PointF = WorldToCanvas(p2x, p2y, pb.Width - 1, pb.Height - 1)
    Dim p3 As PointF = WorldToCanvas(p3x, p3y, pb.Width - 1, pb.Height - 1)
    Dim triangle As New Drawing2D.GraphicsPath()
    triangle.AddPolygon({p1, p2, p3})
    g.FillPath(Brushes.LightSkyBlue, triangle)
    g.DrawPath(Pens.Black, triangle)
    g.DrawEllipse(Pens.Black, 0, 0, pb.Width - 1, pb.Height - 1)
    g.Dispose()
    pb.Image = canvas
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    drawArrow(NumericUpDown1.Value, PictureBox1)
End Sub

End Class

コメント