【Word VBA】ヒルベルト曲線描画マクロ▽ソースコード

記事
IT・テクノロジー
Pic231217A.png

Option Explicit
Option Base 0
'
Const cns_intLnLn = 10            '描画線の長さ(定数)
Public p_intCptX As Integer       '描画位置X(変数)
Public p_intCptY As Integer       '    Y(変数)
Public p_intCAng As Integer      '描画方向 (変数)
Public Sub ヒルベルト曲線描画マクロ()
    Const HLBTLEFT = 100         '描画開始位置X
    Const HLBTTOPP = 220         '      Y
    '
    Const HLBTORDR = 4 '次数
    '
    p_intCptX = HLBTLEFT
    p_intCptY = HLBTTOPP: p_intCAng = 0
    Call Sヒルベルト曲線描画マクロ_再帰(HLBTORDR, 90)
End Sub

Public Sub Sヒルベルト曲線描画マクロ_再帰(pintNo As Integer, pintAn As Integer)
    Const HLBTLCOL = &H4763FF '線の色(TOMATO)
    Const HLBTLWEI = 1.5 '線の太さ
    '---------------------------------------------------------------------------
    Dim intPtX As Integer, intPtY As Integer, intAng As Integer
    '
    If pintNo > 0 Then
       p_intCAng = p_intCAng + pintAn
       Call Sヒルベルト曲線描画マクロ_再帰(pintNo - 1, pintAn * -1)
       GoSub ヒルベルト曲線描画マクロ_DRAW
       p_intCAng = p_intCAng - pintAn
       Call Sヒルベルト曲線描画マクロ_再帰(pintNo - 1, pintAn)
       GoSub ヒルベルト曲線描画マクロ_DRAW
       Call Sヒルベルト曲線描画マクロ_再帰(pintNo - 1, pintAn)
       p_intCAng = p_intCAng - pintAn
       GoSub ヒルベルト曲線描画マクロ_DRAW
       Call Sヒルベルト曲線描画マクロ_再帰(pintNo - 1, pintAn * -1)
       p_intCAng = p_intCAng + pintAn
    End If
    Exit Sub
    '========================================
ヒルベルト曲線描画マクロ_DRAW: '線描画処理(サブルーチン)
    '*角度より終点位置取得
    intPtX = p_intCptX: intPtY = p_intCptY
    Select Case Abs(p_intCAng Mod 360)
           Case 0:   intPtX = intPtX + cns_intLnLn
           Case 90: intPtY = intPtY + cns_intLnLn  _
                                  * Sgn(p_intCAng Mod 360) * -1
           Case 180: intPtX = intPtX - cns_intLnLn
           Case 270: intPtY = intPtY + cns_intLnLn  _
                                    * Sgn(p_intCAng Mod 360)
    End Select
    '*線描画
    With ActiveDocument.Shapes.AddLine( _
         p_intCptX, p_intCptY, intPtX, intPtY).Line
        .ForeColor.RGB = HLBTLCO          '←線色
        .Weight = HLBTLWEI                   '←線の太さ
    End With
    p_intCptX = intPtX: p_intCptY = intPtY
    Return
End Sub

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す