概要:VBAで描画する数学的アートへの招待
Excel VBAの可能性は、単なるデータ集計や業務効率化にとどまりません。ワークシートという広大なキャンバスを使い、数学的なアルゴリズムを駆使して「美しい図形」を描き出すことは、プログラミングの本質的な楽しさを教えてくれます。本連載の第3回となる今回は、幾何学的な美しさの象徴である「花びら」をVBAで描画するための基礎理論と実装方法を解説します。全3回にわたる本シリーズの初回である今回は、花びらの形状を決定づける「極座標系」の理解と、その座標をExcelの座標系に変換するためのロジック構築に焦点を当てます。
詳細解説:花びらの設計図を数式で描く
花びらの形状をプログラムで表現する際、直交座標系(x, y)だけで計算しようとすると、非常に複雑な三角関数の組み合わせが必要になります。そこで登場するのが「極座標系」です。極座標系は、原点からの距離「r」と、ある基準線からの角度「θ(シータ)」で点を定義します。
花びらの形状を生成するためには、この距離「r」を角度「θ」の関数として定義する必要があります。例えば、バラ曲線(Rose curve)と呼ばれる数学曲線を用いると、美しい花びらを簡単に表現できます。式は「r = a * sin(n * θ)」という形で表されます。ここで、「a」は花びらの大きさを、「n」は花びらの数を決定するパラメータです。
VBAにおいてこの数式を扱う際、注意が必要なのが「ラジアン」への変換です。VBAの三角関数(Sin, Cos)は引数をラジアンで受け取ります。そのため、度数法(0〜360度)でループ処理を行う場合は、「θ * (Application.Pi() / 180)」といった変換ステップが不可欠となります。また、Excelのシート上での描画には「Shapes.AddShape」メソッドを使用しますが、この際、原点をシートのどこに置くかというオフセット計算も重要です。画面中心を(0, 0)とするために、ワークシートのセル幅や高さを考慮した座標変換処理を組み込む必要があります。
サンプルコード:花びらの骨格を生成する基礎ロジック
以下のコードは、指定した中心座標を基点として、花びらを構成するための頂点リストを計算し、それを結ぶ軌跡を描くための準備段階のコードです。まずは、数学的な座標が正しくプロットされることを確認してください。
Sub DrawFlowerPetals()
Dim ws As Worksheet
Dim shp As Shape
Dim i As Long
Dim theta As Double
Dim r As Double
Dim x As Double, y As Double
Dim centerX As Double, centerY As Double
Dim a As Double, n As Double
Dim pointsArray() As Single
Set ws = ActiveSheet
centerX = 300
centerY = 300
a = 100
n = 5 ' 花びらの数を決定
' 頂点の配列を準備(360度分)
ReDim pointsArray(0 To 360, 0 To 1)
For i = 0 To 360
' ラジアン変換
theta = i * (Application.WorksheetFunction.Pi() / 180)
' バラ曲線の計算
r = a * Sin(n * theta)
' 極座標から直交座標へ変換
x = r * Cos(theta) + centerX
y = r * Sin(theta) + centerY
pointsArray(i, 0) = x
pointsArray(i, 1) = y
Next i
' 軌跡を描画(フリーフォームを使用)
Set shp = ws.Shapes.BuildFreeform(msoEditingAuto, pointsArray(0, 0), pointsArray(0, 1))
For i = 1 To 360
shp.AddNodes msoSegmentLine, msoEditingAuto, pointsArray(i, 0), pointsArray(i, 1)
Next i
shp.ConvertToShape.Select
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(255, 100, 150)
End Sub
実務アドバイス:可読性とパフォーマンスの向上
実務におけるVBA開発では、このようなグラフィック処理を行う際に「描画のちらつき」が問題になることがあります。上記コードはシンプルに記述していますが、大量のシェイプを扱う場合は「Application.ScreenUpdating = False」を必ず記述してください。これにより、描画処理中の画面更新を停止し、計算速度を劇的に向上させることができます。
また、座標の計算ロジックを独立した関数(Function)として切り出すことを強く推奨します。例えば「GetPolarCoordinate」のような関数を作成し、引数に角度とパラメータを渡せば、メインの描画ロジックが非常にすっきりします。さらに、今回は固定値として「a」や「n」を設定しましたが、これらをシート上のセルから取得するように設計変更すれば、ユーザーが数値を変更するだけでリアルタイムに花の形状が変わる、動的なツールへと進化させることが可能です。数学的アルゴリズムを「ブラックボックス化」せず、モジュールとして整理する癖をつけることが、複雑なVBAプロジェクトを成功させる鍵となります。
まとめ:次回のステップに向けて
今回ご紹介した「花びらを描くための基礎理論」は、幾何学アートの第一歩に過ぎません。極座標系を用いたバラ曲線の生成は、VBAにおける図形操作の応用範囲を大きく広げてくれます。しかし、単純に線をつなぐだけでは、花びらの「重なり」や「グラデーション」といった細かな表現までは到達できません。
次回、第2回では、今回生成した単一の曲線を回転させ、より立体感のある花びらを構築する手法を解説します。単なるバラ曲線から脱却し、複数の花弁を重ね合わせることで、より本物の花に近い複雑な構造を表現していきます。今回作成したコードをベースに、まずは自分の手でパラメータ「n」の値を変更し、花びらの数がどう変化するかを確認してみてください。数学とコードが融合した瞬間の驚きを、ぜひ体験していただきたいと思います。準備は整いました。美しい花を咲かせるための旅を、ここからさらに深く進めていきましょう。
