インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

図形を描くために③ アニメーションさせるには

グラフが徐々に伸びるアニメーションをさせる方法もいろいろ試行錯誤しました。

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 

f:id:chemiphys:20161231102913p:plain
図形のポイントの操作については,豊富なプロパティやメソッドが用意されているので,とても扱いやすいんですが,ポイント数が増えて行くととても遅くなります。
1つの図形を思い通りに描くのには十分な機能ですが,アニメーションをこれでやるのは断念しました。

さらには,オブジェクト変数を開放するようにちゃんとコードに書いたとしても,
ループを繰り返すと,メモリ占有量が確実に増えていくという仕様がつかめないところもありました。

じゃあ,ポイント数を増やさなきゃいい,と思い,1波長分の波までは上記同様に描いて,描き終えたらそれをLeft,Topプロパティで動かしつつ,次のを描いて・・・
というのも試してみました。

これはうまくいきましたが,とても複雑になるので,その次に考えている合成は無理だよなぁと いったんあきらめたものです(;´▽`A``
この時に,ループのたびに位相をテキストボックスに書き出していて,それは最終的にアニメーションを画面にきちんと反映するのに非常に役に立ちましたから,大事な試行ではありました。
f:id:chemiphys:20161231103433g:plain
1波長ごとに違うシェイプになっているので,色を変えれるという利点はあります。

こうやってなかなかうまくいかなかったんですが,最終的にたどり着いたものはとてもとても簡単。

どの方法でもオートシェイプを描くのは一瞬だったんです。とてもいいソフトですよね。


つまり,ポイントを増やしていこうとか,描いた図形を移動させようとかじゃなく,

直前に描いた図形を削除して,次のコマの図形を描く。それを繰り返す。

図形のインデックスはとても増えていきますが,動作速度も比較的安定しますし,メモリ占有量への問題も目に見えての影響もなさそうでした。

要はパラパラマンガをやればいい。とても乱暴な気はぬぐえないんですが,わたしが試した中では一番効率も安定性も良い。

現在はこの考えでやりはじめて,波の固定端反射などを簡単に書けるようになったところです。

各試行も,いろいろ応用が利くものですし無駄ではないんですが,今たどり着いている方法がなんか乱暴に思えてそこは腑に落ちてはいませんけど,

問題はそこではなく,何を作るかなので,次に作るネタを考え中です。