私は D3 を学んでおり、おもちゃのアプリケーションはSymplectic Velocity Verlet Integrationを使用した 2 次元重力シミュレーションのビジュアライザーです。
バインドされた構造化データを使用してパスをアニメーション化および描画することにかなり成功しましたが、D3 は実際には複数の要素にデータを添付するようには設計されていないようです。任意のデータに対して、それを所有する明確で単純な SVG 要素があることを前提としています。これは__data__
、DOM 内のプロパティ内にデータを直接格納することで明らかです。
ただし、複数の SVG 要素を持つデータを表す適切な方法は明らかではありません。たとえば、私は惑星ごとにパスと円を描きたいと思います。パスは過去の位置をトレースし (そして、巧妙な線の長さと色の補間を適用することができます)、円は現在の位置をプロットします。
描画したい要素をさらにいくつか考え出すこともできます: 速度用のベクトル矢印... 加速用のベクトル矢印...
私の場合、マスター データ構造は次のように構築され、この構造で動的に維持されます。
var data = [];
function makeParticle(x, y, vx, vy) {
// state vector plus goodies
return [
x, y,
vx, vy,
0, 0,
[] // path
];
}
data.push(makeParticle(400, 100, -0.5, 1));
data.push(makeParticle(300, -100, 0.5, 2)); // and so on
データの各要素は惑星であり、現在の状態ベクトル (位置、速度、およびキャッシュされた加速度 (インテグレーターに必要)) と、かなり長い長さに切り詰められた位置の配列であるパス履歴を含みます。 .
現在、パス履歴を次のように更新しています。
var paths = d3.select('svg').selectAll("path").data(data);
paths.enter().append('path'); // put cool transitions here
paths.exit().remove();
paths.attr("stroke", "red")
.attr("d", function(d){
return lineDrawer(d[6]);
})
これは正常に機能し、各パスは独自の惑星のパスの独自のコピーを追跡します。
これをエレガントに拡張して、各パスの先頭に円を含める方法はすぐにはわかりません。確かに、データ全体を円の DOM 要素に複製したくはありません (パス データは必要ないため)。
私の自己回答に照らして編集します。
誰かが「グループ」を使用して、各データムに対して描画するデータ駆動型のセットを作成する方法を解明するのを手伝ってくれることを願っています。たとえば[position, velocity, force, path]
、円、矢印の閉じたパス、矢印の閉じたパス、開いたパスをそれぞれ使用して視覚化されたデータとして。これらのプロパティは固定されているため、これは完全に考えすぎである可能性もあります。