図形を描くために③ アニメーションさせるには
グラフが徐々に伸びるアニメーションをさせる方法もいろいろ試行錯誤しました。
ShapeオブジェクトのShapeNodeを追加・削除していくとか,各ポイントの座標をずらしていくとか。
Sub NodesTest() Dim shpNodes As ShapeNodes Set shpNodes = ActiveWindow.Selection.ShapeRange.Nodes Dim i As Long Debug.Print shpNodes.Count 'ポイント数 For i = 1 To shpNodes.Count Debug.Print i; Debug.Print shpNodes(i).Points(1, 1); iポイントのx座標 Debug.Print shpNodes(i).Points(1, 2) iポイントのy座標 shpNodes.SetPosition shpNodes.Count, 280, 200 最後のポイントのx,y座標を変更 Next 'shpNodes.Insert shpNodes.Count, msoSegmentLine, msoEditingAuto, 100, 100 '最後にポイントを追加 'shpNodes.Delete 1 '最初のポイントを削除 End Sub
イミディエイトウィンドウには
7 1 271.2728 186.1818 2 320.7272 166.5454 3 346.9091 236.3636 4 260.3636 272.7272 5 247.2728 239.2728 6 280 227.6364 7 280 200
図形のポイントの操作については,豊富なプロパティやメソッドが用意されているので,とても扱いやすいんですが,ポイント数が増えて行くととても遅くなります。
1つの図形を思い通りに描くのには十分な機能ですが,アニメーションをこれでやるのは断念しました。
さらには,オブジェクト変数を開放するようにちゃんとコードに書いたとしても,
ループを繰り返すと,メモリ占有量が確実に増えていくという仕様がつかめないところもありました。
じゃあ,ポイント数を増やさなきゃいい,と思い,1波長分の波までは上記同様に描いて,描き終えたらそれをLeft,Topプロパティで動かしつつ,次のを描いて・・・
というのも試してみました。
これはうまくいきましたが,とても複雑になるので,その次に考えている合成は無理だよなぁと いったんあきらめたものです(;´▽`A``
この時に,ループのたびに位相をテキストボックスに書き出していて,それは最終的にアニメーションを画面にきちんと反映するのに非常に役に立ちましたから,大事な試行ではありました。
1波長ごとに違うシェイプになっているので,色を変えれるという利点はあります。
こうやってなかなかうまくいかなかったんですが,最終的にたどり着いたものはとてもとても簡単。
どの方法でもオートシェイプを描くのは一瞬だったんです。とてもいいソフトですよね。
つまり,ポイントを増やしていこうとか,描いた図形を移動させようとかじゃなく,
直前に描いた図形を削除して,次のコマの図形を描く。それを繰り返す。
図形のインデックスはとても増えていきますが,動作速度も比較的安定しますし,メモリ占有量への問題も目に見えての影響もなさそうでした。
要はパラパラマンガをやればいい。とても乱暴な気はぬぐえないんですが,わたしが試した中では一番効率も安定性も良い。
現在はこの考えでやりはじめて,波の固定端反射などを簡単に書けるようになったところです。
各試行も,いろいろ応用が利くものですし無駄ではないんですが,今たどり着いている方法がなんか乱暴に思えてそこは腑に落ちてはいませんけど,
問題はそこではなく,何を作るかなので,次に作るネタを考え中です。