図形を描くために② 三角関数のグラフを描いてみる。
オートシェイプを関数で描かせるには,注意点がいくらかあるので,自分のためにもメモ。
Option Explicit Sub test() Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1) Dim i As Long, y As Long Dim StartX As Long: StartX = 50 Dim StartY As Long: StartY = 100 Dim dX As Long: dX = 5 Dim dP As Currency: dP = 3.14 / 20 Dim A As Long: A = 100 Dim drwWave As FreeformBuilder, shpWave As Shape For i = 0 To 100 y = CLng(A * Sin(dP * i)) If i = 0 Then Set drwWave = TSlide.Shapes.BuildFreeform(msoEditingAuto, StartX, StartY - y) 'drwWave.AddNodes msoSegmentLine, msoEditingAuto, StartX + 1, StartY - y End If drwWave.AddNodes msoSegmentLine, msoEditingAuto, StartX + i * dX, StartY - y Next Set shpWave = drwWave.ConvertToShape shpWave.Line.ForeColor.RGB = RGB(255, 0, 0) shpWave.Line.Weight = 2 shpWave.Line.DashStyle = msoLineLongDash End Sub
このコードを実行するとこんな感じ。
簡単にsinカーブが描けていると思います。わたしがやってることの基本はこんな感じです。
実際には合成波とかを考えるために,配列に波二つ分出して,足し算とかに使ってるので,かなり面倒な感じになってます。
大事なところが伝わりにくいので,今回はかなりシンプルに。
説明のメモ
今回はスライドショーでの実施を想定していません。ただ描くことだけなので,スライド1をTSlideとしています。
Dimがかなりの場所を占めてますね。宣言を強制してるので書かないわけにはいきません。
・グラフの書き始めはどうにでも変更できるように,StartXやStartYということで早めに書いています。
・x方向の増分はdXとしています。幅を調整できるように。
・位相は弧度法で考えることになってたと思うので,円周率を割るということで,dPという変数に入れています。
今は20分割で描いてますが,細かく出す場合は適当に変更すれば変わります。
変数の型はsingle,double,currencyどれでも影響はないとオモイマス。
フリーフォームで描く場合は,最初FreeformBuilderで描き始めて,AddNodesでポイントを追加していって,最後にConvertToShapeでShapeにします。
このために,drwWaveとshpWaveという二つを宣言しています。
関数 y=CLng(A*Sin(dp*i)) を二度書きたくないので,最初のポイントとその後で動作を変えます。( if i=0 then ~)
コメントアウトしている行は,1点しか点が描けていない場合,ConvertToShapeで怒られます。
なので,わたしは苦肉の策で,x方向に1だけずらした点をすぐ書いてエラーを回避するという手を取るためそれを書いている文です。
ここスマートにやれたらいいんですが,面倒なので手抜きでわたしはこんな風にします。。
最後のあたりは,線の色や種類をいじっているだけです。
これだけで関数をオートシェイプ化できますので,関数をきれいに書くのむずかしいなぁと思われている方,いかがでしょう。